Repository Analysis

dyad-sh/dyad

Local, open-source AI app builder for power users ✨ v0 / Lovable / Replit / Bolt alternative 🌟 Star if you like it!

4.1 Likely human-written View on GitHub
4.1
Adjusted Score
4.1
Raw Score
100%
Time Factor
2026-05-30
Last Push
20,474
Stars
TypeScript
Language
334,259
Lines of Code
1649
Files
747
Pattern Hits
2026-05-31
Scan Date

Score History

Severity Breakdown

CRITICAL 0HIGH 5MEDIUM 280LOW 462

Pattern Findings

747 matches across 11 categories. Click a row to expand file-level details.

Decorative Section Separators273 hits · 846 pts
SeverityFileLineSnippet
MEDIUM.claude/hooks/tests/python_good_commands.txt5# =============================================================================
MEDIUM.claude/hooks/tests/python_good_commands.txt7# =============================================================================
MEDIUM.claude/hooks/tests/python_good_commands.txt21# =============================================================================
MEDIUM.claude/hooks/tests/python_good_commands.txt23# =============================================================================
MEDIUM.claude/hooks/tests/python_good_commands.txt32# =============================================================================
MEDIUM.claude/hooks/tests/python_good_commands.txt34# =============================================================================
MEDIUM.claude/hooks/tests/python_good_commands.txt43# =============================================================================
MEDIUM.claude/hooks/tests/python_good_commands.txt45# =============================================================================
MEDIUM.claude/hooks/tests/python_good_commands.txt54# =============================================================================
MEDIUM.claude/hooks/tests/python_good_commands.txt56# =============================================================================
MEDIUM.claude/hooks/tests/python_good_commands.txt63# =============================================================================
MEDIUM.claude/hooks/tests/python_good_commands.txt65# =============================================================================
MEDIUM.claude/hooks/tests/python_good_commands.txt72# =============================================================================
MEDIUM.claude/hooks/tests/python_good_commands.txt74# =============================================================================
MEDIUM.claude/hooks/tests/python_good_commands.txt82# =============================================================================
MEDIUM.claude/hooks/tests/python_good_commands.txt84# =============================================================================
MEDIUM.claude/hooks/tests/python_good_commands.txt92# =============================================================================
MEDIUM.claude/hooks/tests/python_good_commands.txt94# =============================================================================
MEDIUM.claude/hooks/tests/python_good_commands.txt100# =============================================================================
MEDIUM.claude/hooks/tests/python_good_commands.txt102# =============================================================================
MEDIUM…laude/hooks/tests/python_security_blocked_commands.txt5# =============================================================================
MEDIUM…laude/hooks/tests/python_security_blocked_commands.txt7# =============================================================================
MEDIUM…laude/hooks/tests/python_security_blocked_commands.txt50# =============================================================================
MEDIUM…laude/hooks/tests/python_security_blocked_commands.txt52# =============================================================================
MEDIUM…laude/hooks/tests/python_security_blocked_commands.txt62# =============================================================================
MEDIUM…laude/hooks/tests/python_security_blocked_commands.txt64# =============================================================================
MEDIUM…laude/hooks/tests/python_security_blocked_commands.txt73# =============================================================================
MEDIUM…laude/hooks/tests/python_security_blocked_commands.txt75# =============================================================================
MEDIUM…laude/hooks/tests/python_security_blocked_commands.txt80# =============================================================================
MEDIUM…laude/hooks/tests/python_security_blocked_commands.txt82# =============================================================================
MEDIUM…laude/hooks/tests/python_security_blocked_commands.txt89# =============================================================================
MEDIUM…laude/hooks/tests/python_security_blocked_commands.txt91# =============================================================================
MEDIUM…laude/hooks/tests/python_security_blocked_commands.txt98# =============================================================================
MEDIUM…laude/hooks/tests/python_security_blocked_commands.txt100# =============================================================================
MEDIUM…laude/hooks/tests/python_security_blocked_commands.txt113# =============================================================================
MEDIUM…laude/hooks/tests/python_security_blocked_commands.txt115# =============================================================================
MEDIUM.claude/hooks/tests/good_commands.txt75# =============================================================================
MEDIUM.claude/hooks/tests/good_commands.txt77# =============================================================================
MEDIUM.claude/hooks/tests/good_commands.txt87# =============================================================================
MEDIUM.claude/hooks/tests/good_commands.txt89# =============================================================================
MEDIUM.claude/hooks/tests/good_commands.txt297# =============================================================================
MEDIUM.claude/hooks/tests/good_commands.txt299# =============================================================================
MEDIUM.claude/hooks/tests/good_commands.txt308# =============================================================================
MEDIUM.claude/hooks/tests/good_commands.txt310# =============================================================================
MEDIUM.claude/hooks/tests/good_commands.txt694# =============================================================================
MEDIUM.claude/hooks/tests/good_commands.txt696# =============================================================================
MEDIUM.claude/hooks/tests/good_commands.txt704# =============================================================================
MEDIUM.claude/hooks/tests/good_commands.txt706# =============================================================================
MEDIUM.claude/hooks/tests/good_commands.txt767# =============================================================================
MEDIUM.claude/hooks/tests/good_commands.txt769# =============================================================================
MEDIUM.claude/hooks/tests/good_commands.txt777# =============================================================================
MEDIUM.claude/hooks/tests/good_commands.txt779# =============================================================================
MEDIUM.claude/hooks/tests/good_commands.txt4# =============================================================================
MEDIUM.claude/hooks/tests/good_commands.txt6# =============================================================================
MEDIUM.claude/hooks/tests/good_commands.txt60# =============================================================================
MEDIUM.claude/hooks/tests/good_commands.txt62# =============================================================================
MEDIUM.claude/hooks/tests/good_commands.txt146# =============================================================================
MEDIUM.claude/hooks/tests/good_commands.txt148# =============================================================================
MEDIUM.claude/hooks/tests/good_commands.txt161# =============================================================================
MEDIUM.claude/hooks/tests/good_commands.txt163# =============================================================================
213 more matches not shown…
Hyper-Verbose Identifiers413 hits · 424 pts
SeverityFileLineSnippet
LOWplans/catalog-data.ts339export function buildLanguageModelCatalogResponse(
LOW.claude/hooks/gh-permission-hook.py242def neutralize_code_spans_in_double_quotes(match: re.Match) -> str:
LOW.claude/hooks/tests/test_permission_request_hook.py48 def test_invalid_json_passthrough(self):
LOW.claude/hooks/tests/test_permission_request_hook.py59 def test_non_dict_tool_input_passthrough(self):
LOW.claude/hooks/tests/test_permission_request_hook.py73 def test_bash_commands_analyzed(self):
LOW.claude/hooks/tests/test_permission_request_hook.py83 def test_no_claude_cli_passthrough(self, monkeypatch):
LOW.claude/hooks/tests/test_permission_request_hook.py96 def test_response_format_documented(self):
LOW.claude/hooks/tests/test_permission_request_hook.py114 def test_policy_has_green_section(self):
LOW.claude/hooks/tests/test_permission_request_hook.py120 def test_policy_has_yellow_section(self):
LOW.claude/hooks/tests/test_permission_request_hook.py126 def test_policy_has_red_section(self):
LOW.claude/hooks/tests/test_permission_request_hook.py137 def test_policy_covers_git_force_push(self):
LOW.claude/hooks/tests/test_permission_request_hook.py142 def test_policy_covers_shell_patterns(self):
LOW.claude/hooks/tests/test_permission_request_hook.py148 def test_policy_covers_curl_pipe_sh(self):
LOW.claude/hooks/tests/test_permission_request_hook.py153 def test_policy_covers_safe_commands(self):
LOW.claude/hooks/tests/test_python_permission_hook.py105def test_passthrough_commands() -> tuple[int, int, list[str]]:
LOW.claude/hooks/tests/test_python_permission_hook.py124def test_security_blocked_commands() -> tuple[int, int, list[str]]:
LOW.claude/hooks/tests/test_stop_hook.py95 def test_analyze_returns_none_when_no_cli(self, tmp_path, monkeypatch):
LOW.claude/hooks/tests/test_stop_hook.py104 def test_no_claude_cli_allows_stop(self, tmp_path):
LOW.claude/hooks/tests/test_stop_hook.py48 def test_invalid_json_allows_stop(self):
LOW.claude/hooks/tests/test_stop_hook.py59 def test_stop_hook_active_allows_stop(self):
LOW.claude/hooks/tests/test_stop_hook.py70 def test_missing_transcript_allows_stop(self):
LOW.claude/hooks/tests/test_stop_hook.py80 def test_nonexistent_transcript_allows_stop(self):
LOW.claude/hooks/tests/test_stop_hook.py123 def test_parses_valid_json_response(self, tmp_path, monkeypatch):
LOW.claude/hooks/tests/test_stop_hook.py141 def test_parses_json_in_markdown_code_fence(self, tmp_path, monkeypatch):
LOW.claude/hooks/tests/test_stop_hook.py158 def test_returns_none_for_no_json(self, tmp_path, monkeypatch):
LOW.claude/hooks/tests/test_stop_hook.py174 def test_returns_none_for_malformed_json(self, tmp_path, monkeypatch):
LOW.claude/hooks/tests/test_stop_hook.py190 def test_returns_none_on_nonzero_returncode(self, tmp_path, monkeypatch):
LOW.claude/hooks/tests/test_stop_hook.py206 def test_returns_none_on_subprocess_error(self, tmp_path, monkeypatch):
LOW.claude/hooks/tests/test_stop_hook.py219 def test_returns_none_for_empty_transcript(self, tmp_path, monkeypatch):
LOW.claude/hooks/tests/test_stop_hook.py231 def test_response_format_documented(self):
LOW.claude/hooks/tests/test_stop_hook.py238 def test_hook_checks_stop_hook_active(self):
LOW.claude/hooks/tests/test_stop_hook.py258 def test_extracts_incomplete_tasks(self):
LOW.claude/hooks/tests/test_stop_hook.py290 def test_extracts_completed_tasks(self):
LOW.claude/hooks/tests/test_stop_hook.py299 def test_handles_nonexistent_file(self):
LOW.claude/hooks/tests/test_stop_hook.py322 def test_blocks_with_remaining_tasks(self):
LOW.claude/hooks/tests/test_stop_hook.py347 def test_allows_stop_with_all_tasks_completed(self, monkeypatch):
LOW.claude/hooks/tests/test_stop_hook.py369 def test_reads_incomplete_tasks_fixture(self):
LOW.claude/hooks/tests/test_stop_hook.py397 def test_reads_completed_tasks_fixture(self):
LOW.claude/hooks/tests/test_stop_hook.py426 def test_reads_assistant_messages(self, tmp_path):
LOW.claude/hooks/tests/test_stop_hook.py438 def test_truncates_large_transcripts(self, tmp_path):
LOW…ills/fix-issue/scripts/test_sanitize_issue_markdown.py49 def test_excessive_whitespace(self):
LOW…ills/fix-issue/scripts/test_sanitize_issue_markdown.py70 def test_preserves_code_blocks(self):
LOW…ills/fix-issue/scripts/test_sanitize_issue_markdown.py85 def test_preserves_inline_code(self):
LOW…ills/fix-issue/scripts/test_sanitize_issue_markdown.py111 def test_removes_control_characters(self):
LOWe2e-tests/package_manager.spec.ts27async function configurePackageManagerCache(userDataDir: string) {
LOWe2e-tests/package_manager.spec.ts63async function createUpgradeablePnpmShim(userDataDir: string) {
LOWe2e-tests/package_manager.spec.ts135async function restorePackageManagerCache() {
LOWe2e-tests/package_manager.spec.ts249function extendSocketFirewallTestTimeout(testInfo: TestInfo) {
LOWe2e-tests/custom_apps_folder.spec.ts7async function expectCustomAppsFolderSetting(
LOWe2e-tests/edit_code.spec.ts24async function selectFileAndWaitForEditor(page: Page, fileName: string) {
LOWe2e-tests/switch_versions.spec.ts5async function amendRuntimeWorkspaceIntoCurrentCommit(po: PageObject) {
LOWe2e-tests/uncommitted_files_banner.spec.ts24function commitRuntimeBaselineChanges(appPath: string) {
LOW…ec.ts_regular-auto-should-send-message-to-engine-1.txt146 "content": "import * as React from \"react\";\nimport * as RechartsPrimitive from \"recharts\";\n\nimport { cn
LOW…/snapshots/engine.spec.ts_send-message-to-engine-1.txt86 "[[FILE_ID_61]]": "import * as React from \"react\";\nimport * as RechartsPrimitive from \"recharts\";\n\nimpo
LOW…spec.ts_smart-auto-should-send-message-to-engine-1.txt81 "[[FILE_ID_61]]": "import * as React from \"react\";\nimport * as RechartsPrimitive from \"recharts\";\n\nimpo
LOWe2e-tests/snapshots/copy_app.spec.ts_app.txt1627function getPayloadConfigFromPayload(
LOW…apshots/mention_app.spec.ts_mention-app-with-pro-1.txt146 "content": "import * as React from \"react\";\nimport * as RechartsPrimitive from \"recharts\";\n\nimport { cn
LOW…_v2.spec.ts_turbo-edits-v2---search-replace-dump-1.txt81 "[[FILE_ID_61]]": "import * as React from \"react\";\nimport * as RechartsPrimitive from \"recharts\";\n\nimpo
LOW…nd-message-to-engine---anthropic-claude-sonnet-4-1.txt86 "[[FILE_ID_61]]": "import * as React from \"react\";\nimport * as RechartsPrimitive from \"recharts\";\n\nimpo
LOW…t-deep---mention-app-should-fallback-to-balanced-1.txt146 "content": "import * as React from \"react\";\nimport * as RechartsPrimitive from \"recharts\";\n\nimport { cn
353 more matches not shown…
Over-Commented Block28 hits · 28 pts
SeverityFileLineSnippet
LOWtsconfig.node.json21 // // "moduleResolution": "bundler",
LOWplans/web-fetch-local-agent.md141### Key Implementation Details
LOWplans/web-fetch-local-agent.md181 // 1. Validate URL scheme (http/https only)
LOWplans/neondb-integration.md421NEON_AUTH_COOKIE_SECRET=your-cookie-secret-here # Secret for session cookies
LOW.claude/hooks/gh-permission-hook.py141)
LOW.claude/hooks/gh-permission-hook.py201 # - Zero or more VAR=value assignments (no spaces in value, or quoted)
LOW.claude/hooks/gh-permission-hook.py281
LOW.claude/hooks/gh-permission-hook.py521 """
LOW.claude/hooks/tests/good_commands.txt761gh api repos/$(gh repo view --json nameWithOwner -q .nameWithOwner)/pulls/2524/comments --paginate 2>/dev/null | jq -r '
LOW…sts/snapshots/capacitor.spec.ts_upgraded-capacitor.txt221# Add project specific ProGuard rules here.
LOW…sts/snapshots/capacitor.spec.ts_upgraded-capacitor.txt741
LOW…sts/snapshots/capacitor.spec.ts_upgraded-capacitor.txt1081distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-all.zip
LOW…sts/snapshots/capacitor.spec.ts_upgraded-capacitor.txt1101# distributed under the License is distributed on an "AS IS" BASIS,
LOW…sts/snapshots/capacitor.spec.ts_upgraded-capacitor.txt1121#
LOW…sts/snapshots/capacitor.spec.ts_upgraded-capacitor.txt1141# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
LOW…sts/snapshots/capacitor.spec.ts_upgraded-capacitor.txt1281 # args, so each arg winds up back in the position where it started, but
LOW…sts/snapshots/capacitor.spec.ts_upgraded-capacitor.txt1321# set -- "${ARGS[@]}" "$@"
LOWe2e-tests/helpers/test-ports.ts1// Base port for fake LLM servers - each worker gets its own port
LOWscripts/ci-cleanup-macos.sh1#!/usr/bin/env bash
LOW.github/workflows/cla.yml41 #custom-pr-sign-comment: 'The signature to be committed in order to sign the CLA'
LOWworker/dyad-sw.js21self.addEventListener("fetch", (event) => {
LOWsrc/main.ts201
LOW…/pro/main/ipc/handlers/local_agent/tool_definitions.ts461 // blueprint approval is resolved. `write_app_blueprint` owns the
LOWsrc/utils/codebase.ts81const ALWAYS_OMITTED_FILES = [".env", ".env.local"];
LOWsrc/__tests__/evals/helpers/eval_recorder.ts1import { mkdir, writeFile } from "node:fs/promises";
LOWsrc/__tests__/evals/helpers/prompts.ts1// System prompts used by the eval suites.
LOWsrc/ipc/handlers/migration_handlers.ts21// Handler Registration
LOWsrc/ipc/handlers/compaction/compaction_handler.ts221 // Create the compaction indicator message
Synthetic Comment Markers3 hits · 18 pts
SeverityFileLineSnippet
HIGH.claude/skills/pr-fix-comments/SKILL.md225 🤖 Generated by Claude Code
HIGHtesting/fake-llm-server/chatCompletionHandler.ts100 "## Key Decisions Made\n- Completed initial task as requested\n\n## Current Task State\nConversation was compact
HIGHsrc/ipc/handlers/shell_handler.ts70 // The dyad-apps tree contains AI-generated code, so opening arbitrary files
Redundant / Tautological Comments11 hits · 14 pts
SeverityFileLineSnippet
LOWtools/add-macos-cert.sh9# Check if the variable is set
LOW.claude/hooks/python-permission-hook.py221 # Check if the path is inside the project directory
LOW.claude/hooks/python-permission-hook.py252 # Check if this is a python/python3 command
LOW.claude/hooks/python-permission-hook.py272 # Check if the script is inside .claude directory
LOW.claude/hooks/python-permission-hook.py302 # Check if this even looks like a python command before denying
LOW.claude/hooks/python-permission-hook.py318 # Check if command starts with python or python3
LOW.claude/hooks/python-permission-hook.py363 # Check if next argument is an allowed module
LOW.claude/hooks/python-permission-hook.py443 # Check if the script is inside the .claude directory
LOW.claude/hooks/gh-permission-hook.py351 # Check if this is a gh api command
LOW.claude/hooks/gh-permission-hook.py455 # Check if command has input data (implies write operation)
LOW.github/workflows/ci.yml78 # Check if all changed files are in config-only directories (.claude, rules)
Verbosity Indicators8 hits · 12 pts
SeverityFileLineSnippet
LOWsrc/__tests__/prepare_step_utils.test.ts421 // Step 1: Add first pending message
LOWsrc/__tests__/prepare_step_utils.test.ts437 // Step 2: AI added a new message, add another pending message
LOWsrc/__tests__/prepare_step_utils.test.ts514 // Step 1: User sends initial prompt
LOWsrc/__tests__/prepare_step_utils.test.ts525 // Step 2: AI responds with tool call, tool adds screenshot
LOWsrc/__tests__/prepare_step_utils.test.ts580 // Step 3: AI continues, tool adds another screenshot
LOWsrc/__tests__/prepare_step_utils.test.ts1082 // Step 0: web_crawl + list_files
LOWsrc/__tests__/prepare_step_utils.test.ts1105 // Step 1: model generates a search_replace tool call
LOWsrc/prompts/neon_prompt.ts88## Step 0: Inspect the App Before Scaffolding
Self-Referential Comments3 hits · 10 pts
SeverityFileLineSnippet
MEDIUMtools/add-macos-cert.sh24# Create a keychain
MEDIUM.claude/hooks/tests/test_stop_hook.py106 # Create a minimal transcript
MEDIUM.claude/hooks/tests/test_stop_hook.py442 # Create a large transcript with many messages
Cross-Language Confusion2 hits · 10 pts
SeverityFileLineSnippet
HIGH.claude/hooks/python-permission-hook.py96 # Replace safe redirect patterns (2>&1, >/dev/null) before checking
HIGH.claude/hooks/gh-permission-hook.py299 # Replace safe redirect patterns (like 2>&1, 2>/dev/null) before checking
AI Slop Vocabulary3 hits · 9 pts
SeverityFileLineSnippet
MEDIUM.claude/hooks/python-permission-hook.py338 # Use shlex for robust argument parsing
MEDIUM.github/workflows/claude-pr-review.yml3# https://github.com/anthropics/claude-code-action/blob/main/examples/pr-review-comprehensive.yml
MEDIUMsrc/ipc/handlers/app_collection_handlers.ts180 // but we null out explicitly first so the operation is robust regardless
Deep Nesting2 hits · 2 pts
SeverityFileLineSnippet
LOW.claude/hooks/python-permission-hook.py123
LOW.claude/hooks/python-permission-hook.py288
Slop Phrases1 hit · 2 pts
SeverityFileLineSnippet
MEDIUM…t_web_fetch.spec.ts_local-agent---web-fetch-1.aria.yml29- paragraph: Here's a summary of the page content. The getting started guide covers three main items. Let me know if you