Same class of gap as the earlier WordPress fix: `ddev config
--project-type=drupal*` only scaffolds DDEV's settings.php bridge, not
Drupal core itself, so a freshly created Drupal project 404/403'd with
nothing for the webserver to serve. The wizard's Drupal path now chains
configure -> start -> composer create-project drupal/recommended-project
-> composer require drush/drush -> drush site:install, with site
name/admin fields shown only for that project type. Docroot defaults to
`web` when Drupal is selected, matching what recommended-project's
installer-paths expect.
Also: Delete previously always left the project folder on disk with no
way to remove it from the app, which surprised a user expecting it gone.
Replaced the window.confirm with a proper modal that has an opt-in
"also delete project files from disk" checkbox, defaulting to the
previous (safe) behavior.
Co-Authored-By: Claude Sonnet 5 <[email protected]>
This project uses pnpm (pnpm-lock.yaml, pnpm-workspace.yaml) — the
package-lock.json was an accidental npm-install artifact. Ignore it
going forward so it doesn't get re-added by mistake.
Co-Authored-By: Claude Sonnet 5 <[email protected]>
Sites were previously left running in the background after closing the
app. before-quit now defers quitting until `ddev poweroff` finishes (or
times out), stopping every running project's containers in one shot.
Co-Authored-By: Claude Sonnet 5 <[email protected]>
A first-ever ddev start pulls several GB across the webserver, db,
router, and ssh-agent images, which reads as the app hanging rather
than as an expected download. Warms the cache automatically once per
DDEV version (re-warms after a DDEV upgrade, since image tags are
versioned) using `ddev version --json-output` to discover the exact
default image tags — stays correct without hardcoding image names.
Runs fire-and-forget right after window creation so it never blocks
app startup or usage, and no-ops quietly if ddev/docker aren't
available yet.
Co-Authored-By: Claude Sonnet 5 <[email protected]>
handleSubmit awaited the entire post-create chain (start, then for
WordPress: download core + install) before ever calling onClose(),
so the modal overlay sat there for the whole multi-step process with
no way to see what was actually happening — the terminal panel that
already tracks this operation's live output was hidden behind it.
Close right after the quick config step succeeds and let post-create
continue as a tracked background operation; failures still surface
via the existing toast/terminal-panel error handling regardless of
modal state.
Also extracts the project-name validation helpers out of
CreateProjectModal.tsx into their own module — mixing component and
non-component exports in one file breaks React Fast Refresh.
Co-Authored-By: Claude Sonnet 5 <[email protected]>
Node's spawn() leaves a child's stdin as an open-but-silent pipe by
default. A GUI-spawned ddev process has no terminal to answer a
prompt (e.g. the first-run telemetry opt-in), and a blocking read on
an open pipe with no EOF just hangs indefinitely instead of failing
or defaulting — reproduced by a "Start" operation that never
progressed past "Permission to beam up?" with no way to recover short
of force-quitting the app. Closing stdin gives ddev an immediate EOF,
which it treats as "use the default" rather than blocking.
Also strips ANSI escape codes from stdout/stderr before forwarding to
the renderer — ddev colorizes output unconditionally regardless of
TTY-ness, so the terminal panel and log viewer were rendering literal
escape sequences as visible text.
Co-Authored-By: Claude Sonnet 5 <[email protected]>
DDEV project names must be valid hostname labels. The wizard
auto-filled the name from the picked folder's basename verbatim, so a
folder like "Aurora Admin" produced a name with a space that DDEV's
`ddev config` rejected with an opaque CLI error the UI never
surfaced. Slugify the auto-filled name and block manual entry of
invalid names before they ever reach the ddev CLI.
Co-Authored-By: Claude Sonnet 5 <[email protected]>
electron-builder's .deb target (fpm) refuses to build without an
author email and project homepage in package.json.
Co-Authored-By: Claude Sonnet 5 <[email protected]>
Cross-platform copy left dozens of these tracked as untracked noise;
.gitignore already covered .DS_Store but not its ._* siblings.
Co-Authored-By: Claude Sonnet 5 <[email protected]>