DDEV Standard (Bluefly)¶
Status: REQUIRED
1. Naming & Conventions¶
- All DDEV environments must map cleanly to their upstream authoritative environments.
- Project names should reflect their canonical repository names (e.g.,
contextcontrol).
2. The Rule of Upstream¶
- Official documentation: docs.ddev.com is the sole tutorial authority. If a workflow or configuration step is documented upstream, do not rewrite it as a Bluefly tutorial — link to it.
- Never fork DDEV functionality.
- The local DDEV setup must remain thin. If a workflow seems complex, do not solve it by writing a custom DDEV CLI wrapper. Shift that execution authority to Gas City/Town or GitLab components.
- Do not add
.ddev-templateconfiguration directly to the host machine's global configurations. Use project-scoped.ddev/folders only.
3. Version Pinning¶
- Strict Pinning: All installed DDEV add-ons must specify a version in the project configuration where supported.
- Upgrades: Add-on upgrades should be deliberate actions backed by a configuration change in git, rather than implicit pulls of
latest.
4. DDEV Add-on Policy¶
The DDEV Add-on Registry is the upstream catalog of record. Classification: references/addon-reference-catalog.md.
Classes¶
| Class | Meaning | Install default? |
|---|---|---|
| CORE | Required for core-drupal |
Yes (canonical profile) |
| RECOMMENDED | High-value; install when needed | Per site |
| OPTIONAL | Evaluated; needs written justification | Opt-in |
| SPECIALIZED | Niche CMS/runtime | Rare |
| REJECT | Conflicts or duplicates | Never (canonical) |
Selection Rules¶
- Prefer official (
ddev/*) over community when capabilities match. - One implementation per capability (one DB UI, one search default, one Claude runtime).
- Reject meta-orchestrators (
ddev-ai-workspace) and parallel work ledgers (local Beads). - Reject experimental tags unless an explicit project exception is recorded.
- Bluefly custom add-ons only for product-boundary gaps the registry cannot express.
- Playlist Admission Rule: install only if project type ∈
supportsand ∉conflicts.
Custom Add-ons (Thin Adapters Only)¶
Every Bluefly add-on JUSTIFICATION.md must lead with the capability card (Capability, Upstream Owner, Bluefly Extension, Maintenance Cost, Deletion condition).
Approved (KEEP_THIN; each ships bluefly.addon.yaml):
* ddev-agent-blu — OpenClaw/CoPaw env, ddev blu, optional governance
* ddev-claude-drupal — Drupal overlays only; extends e0ipso/ddev-assistant-claude
Prohibited: Bluefly-owned Claude, Codex, Cursor, or OpenCode runtimes; Town/Beads orchestration inside DDEV; wrappers that reimplement official add-ons. Upstream assistant add-ons own install and lifecycle. Bluefly owns configuration, conventions, and project integration.
Installation / Upgrade¶
ddev add-on get <owner/repo> --version <tag>
5. DDEV Playlist Standard¶
Playlists are curated, version-pinned compositions of DDEV add-ons. They are not feature packs and not runtimes.
Project Types¶
Every Drupal DDEV project declares exactly one type:
| Type | Use |
|------|-----|
| drupal-site | Full application (e.g. ContextControl.ai) |
| drupal-distribution | Product / CMS distribution |
| drupal-contrib | Single contrib module repository |
| drupal-theme | Theme repository |
| drupal-profile | Install profile repository |
Playlist Admission Rule¶
Every add-on in a Bluefly playlist must declare in docs (and bluefly.addon.yaml for Bluefly add-ons):
supports:
- drupal-site
# ...
conflicts:
- drupal-site # example: ddev-drupal-contrib
supports, or 2. Project type ∈ conflicts.
Required Playlists¶
| Playlist | Default project type | Notes |
|---|---|---|
core-drupal-site |
drupal-site |
ContextControl reference |
core-drupal-contrib |
drupal-contrib |
Mutually exclusive with site core |
drupal-ai |
any supported | Composed onto a core playlist |
Opt-in: testing, search, performance, enterprise, and future named lists.
Activation¶
- Reference full site installs only
core-drupal-site+drupal-ai. - Installing all playlists at once violates the minimal standard.
- Pin with
ddev add-on get <repo> --version <tag>.