drupal/droost_cms

Drupal CMS extended for AI-agent-driven development: Droost MCP tooling, UI Patterns 2, and SDC-first display patterns preinstalled.

Maintainers

Package info

git.drupalcode.org/project/droost_cms.git

Type:drupal-recipe

pkg:composer/drupal/droost_cms

Transparency log

Statistics

Installs: 22

Dependents: 0

Suggesters: 0

1.0.0-alpha1 2026-07-11 11:17 UTC

This package is auto-updated.

Last update: 2026-07-11 19:46:03 UTC


README

A Drupal recipe that extends Drupal CMS into an AI-agent-ready development platform:

  • everything in drupal_cms_starter (Canvas page building, media, SEO, admin UI, the Mercury theme…);
  • Droost — the MCP toolkit AI coding agents drive — with its brain, code/semantic search, examples corpus, SDC display composer, and Canvas tree tooling enabled;
  • UI Patterns 2 (+ field formatters) as the SDC display substrate for structured entities;
  • a shipped design pattern: an event content type whose default display is composed entirely from Single Directory Components — authored deterministically by droost_display_compose and exported here, so a fresh site demonstrates the entity fields → SDC props/slots → render pattern out of the box;
  • the Droost Theme theme as the site default: Tailwind v4 browser JIT + daisyUI (no build step — any utility class works immediately), design tokens in one agent-editable css/tokens.css, and a Canvas-clean SDC library. Its own project — droost is the brain, droost_theme the theme layer, and this recipe composes the two. Mercury stays installed (starter ships it) but is no longer default;
  • the Droost Playbook (droost_playbook), which declares the methodology itself to agents: the methodology topic in droost_guidelines (and in the AGENTS.md block droost:install writes) teaches the structured-vs-freeform decision, both tool flows, and points at the shipped event pattern as the template to copy.

⚠️ Local development shape. Droost is a local-only toolkit (same class as devel): this recipe is for local and AI-assisted builds. Don't deploy the result to production with Droost enabled.

Requirements & the one manual step

Drupal CMS ships Canvas, and this recipe adds UI Patterns — the two currently fight over the SDC plugin manager (canvas#3561618). Until that lands upstream, the root project must apply the coexistence patch (recipes cannot apply root patches):

// root composer.json
"extra": {
    "patches": {
        "drupal/canvas": {
            "#3561618: coexist with plugin.manager.sdc decorators":
                "patches/canvas-3561618-sdc-manager-decoration-compat.patch"
        }
    },
    "composer-exit-on-patch-failure": true
}

(Patch file: shipped in this repo under patches/; requires cweagans/composer-patches.)

Install

On a fresh Drupal CMS project (or any project about to become one):

composer require cweagans/composer-patches   # if not present
# add the patch block above, copy patches/ into your project, then:
composer require drupal/mcp_server:^2.0@alpha \
  drupal/droost:1.0.x-dev drupal/droost_theme:1.0.x-dev \
  drupal/droost_cms:1.0.x-dev
drush php:eval '\Drupal\Core\Recipe\RecipeRunner::processRecipe(\Drupal\Core\Recipe\Recipe::createFromDirectory(DRUPAL_ROOT . "/../recipes/droost_cms"));'
drush cr
drush droost:install   # wire your AI editor

(droost, droost_theme, and this recipe must be root-required with explicit dev/alpha constraints until they have stable releases: Composer ignores stability flags in non-root packages, so the recipe's own @dev requirements cannot widen stability for you.)

(Why php:eval: as of Drush 13.7 there is no drush recipe command, and core/scripts/drupal recipe mis-resolves the autoloader under a split docroot. The one-liner uses the same core Recipe API either would — anchored on DRUPAL_ROOT because drush changes its working directory to the docroot, so a relative recipes/… path would not resolve.)

Validated 2026-07-11 end-to-end from public packaging (no local repos) on a fresh drupal/cms 2.1.3 project with canvas 1.8.0 under the patch: the composer command above resolves and unpacks, the recipe applies on the installed CMS site, enables the full roster (eight droost modules, mcp_server, UI Patterns + field formatters), installs and defaults droost_theme with its navbar block placements, ships the event pattern, and the front page renders through droost_theme's Tailwind/daisyUI runtime. Re-applying the recipe is supported and idempotent — if an apply is interrupted partway, running the same command again completes it.

Applying the recipe on an already-installed Drupal CMS site is supported (drupal_cms_starter re-applies as a no-op when identical).

Known nuance: theme blocks

Droost Theme ships its block placements (branding, main menu, messages, local tasks) as theme config/optional, which recipe-driven theme installs can skip. This recipe therefore ships the same four block configs in its own config/ so a fresh site always gets the navbar. (The theme's optional title block is deliberately not placed: Canvas pages and composed displays carry their own headings.)

What the design pattern demonstrates

config/core.entity_view_display.node.event.default.yml renders every event field through droost_examples:example_card via UI Patterns component formatters — field label → heading prop, field value → content slot through the field's own core formatter. It round-trips byte-identically through droost_display_compose, so an agent can read it with droost_display_get, modify it, and re-compose it deterministically.