$npx -y skills add edutrul/drupal-ai --skill ddev-expertDDEV local development expertise. Use when working with DDEV projects, containers, configuration, or troubleshooting DDEV environments.
| 1 | # DDEV Expert |
| 2 | |
| 3 | ## Essential Commands |
| 4 | |
| 5 | ```bash |
| 6 | # Project |
| 7 | ddev start | stop | restart | poweroff | delete |
| 8 | |
| 9 | # Execute |
| 10 | ddev drush <cmd> | ddev composer <cmd> | ddev exec <cmd> | ddev ssh |
| 11 | |
| 12 | # Database |
| 13 | ddev mysql | ddev export-db | ddev import-db --file=dump.sql |
| 14 | ddev snapshot | ddev restore |
| 15 | |
| 16 | # Utilities |
| 17 | ddev describe # URLs and project info |
| 18 | ddev logs -f # Follow logs |
| 19 | ddev launch # Open in browser |
| 20 | ddev launch -m # Open Mailpit UI |
| 21 | ``` |
| 22 | |
| 23 | ## Configuration (.ddev/config.yaml) |
| 24 | |
| 25 | ```yaml |
| 26 | name: my-project |
| 27 | type: drupal # auto-detects version; or drupal11/drupal10 |
| 28 | docroot: web |
| 29 | php_version: "8.3" |
| 30 | webserver_type: nginx-fpm |
| 31 | database: |
| 32 | type: mariadb |
| 33 | version: "10.11" |
| 34 | additional_hostnames: |
| 35 | - api.my-project.ddev.site |
| 36 | webimage_extra_packages: [php8.3-imagick] |
| 37 | mutagen_enabled: true # macOS/Windows performance |
| 38 | ``` |
| 39 | |
| 40 | **Overrides:** `.ddev/config.local.yaml` (gitignored personal config) |
| 41 | **PHP overrides:** `.ddev/php/*.ini` |
| 42 | |
| 43 | ## Troubleshooting |
| 44 | |
| 45 | **`ddev composer create-project` fails ("not allowed to be present"):** |
| 46 | Move extra dirs out temporarily (`.claude/`, `.git/`), run create-project, move back. |
| 47 | |
| 48 | **Port conflicts:** |
| 49 | ```bash |
| 50 | ddev poweroff && sudo lsof -i :80 |
| 51 | ``` |
| 52 | |
| 53 | **Container issues:** |
| 54 | ```bash |
| 55 | ddev restart |
| 56 | ddev debug refresh # Rebuild containers |
| 57 | ddev delete && ddev start # Nuclear option |
| 58 | ``` |
| 59 | |
| 60 | **Database:** Host is `db` (inside container) or `127.0.0.1:PORT` (outside). Check port with `ddev describe`. |
| 61 | |
| 62 | **Permissions:** `ddev exec chown -R $(id -u):$(id -g) .` |
| 63 | |
| 64 | **PHP deprecation warnings in Drush** — create `.ddev/php/drush.ini`: |
| 65 | ```ini |
| 66 | [PHP] |
| 67 | error_reporting = 22527 ; E_ALL & ~E_DEPRECATED |
| 68 | display_errors = Off |
| 69 | log_errors = On |
| 70 | error_log = /tmp/php-errors.log |
| 71 | ``` |
| 72 | |
| 73 | **Docker Desktop overlay2 I/O errors** — normal restart is not enough: |
| 74 | ```bash |
| 75 | killall -9 Docker # then relaunch Docker Desktop |
| 76 | ``` |
| 77 | |
| 78 | **Mutagen sync hanging after Docker crash:** |
| 79 | ```bash |
| 80 | ddev poweroff && ddev start |
| 81 | # If still stuck: |
| 82 | ddev stop |
| 83 | ~/.ddev/bin/mutagen daemon stop |
| 84 | ~/.ddev/bin/mutagen daemon start |
| 85 | ddev mutagen reset && ddev start |
| 86 | ``` |
| 87 | |
| 88 | ```bash |
| 89 | ddev mutagen status -l # Detailed sync status |
| 90 | ddev mutagen monitor # Real-time progress |
| 91 | ``` |
| 92 | |
| 93 | **Debug commands:** |
| 94 | ```bash |
| 95 | ddev debug capabilities | ddev debug router |
| 96 | ddev exec env |
| 97 | ``` |
| 98 | |
| 99 | ## Xdebug |
| 100 | |
| 101 | ```bash |
| 102 | ddev xdebug on | off | status |
| 103 | ``` |
| 104 | |
| 105 | `.ddev/php/xdebug.ini`: |
| 106 | ```ini |
| 107 | [xdebug] |
| 108 | xdebug.mode=debug,develop,coverage |
| 109 | ``` |
| 110 | |
| 111 | Modes: `debug` (step), `develop` (enhanced errors), `coverage`, `profile`. |
| 112 | See README.md for full IDE setup (VS Code / PHPStorm). |
| 113 | |
| 114 | ## Custom Services |
| 115 | |
| 116 | Add `.ddev/docker-compose.<service>.yaml`. Common pattern: |
| 117 | ```yaml |
| 118 | services: |
| 119 | redis: |
| 120 | image: redis:7-alpine |
| 121 | container_name: ddev-${DDEV_SITENAME}-redis |
| 122 | labels: |
| 123 | com.ddev.site-name: ${DDEV_SITENAME} |
| 124 | com.ddev.approot: $DDEV_APPROOT |
| 125 | expose: |
| 126 | - "6379" |
| 127 | ``` |
| 128 | |
| 129 | See README.md for full Solr, Elasticsearch, Redis configs and Drupal settings.php snippets. |
| 130 | |
| 131 | ## Custom Commands |
| 132 | |
| 133 | Create `.ddev/commands/web/<name>` (or `host/`, `db/`): |
| 134 | ```bash |
| 135 | #!/bin/bash |
| 136 | ## Description: Full site refresh |
| 137 | ## Usage: refresh |
| 138 | set -e |
| 139 | drush sql:drop -y && drush sql:cli < /var/www/html/reference.sql |
| 140 | drush config:import -y && drush updatedb -y && drush cache:rebuild |
| 141 | ``` |
| 142 | |
| 143 | `chmod +x` then run as `ddev <name>`. |
| 144 | |
| 145 | ## Performance (macOS/Windows) |
| 146 | |
| 147 | ```bash |
| 148 | ddev config global --mutagen-enabled # Enable globally |
| 149 | ddev mutagen status | sync | reset |
| 150 | ``` |
| 151 | |
| 152 | See README.md for NFS, tmpfs, and file sync exclusion patterns. |