From cms-cultivator
Onboards Pantheon WordPress sites to Kanopi's Composer-managed DevOps system with DDEV, CircleCI deploys, code-quality gates, and Quicksilver hooks. Invoke when converting a WP site to the wp-pantheon-starter layout.
How this skill is triggered — by the user, by Claude, or both
Slash command
/cms-cultivator:wp-devops-setupThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Onboard an existing **Pantheon-hosted WordPress** site to Kanopi's standardized DevOps
Onboard an existing Pantheon-hosted WordPress site to Kanopi's standardized DevOps
system: a Composer-managed kanopi/wp-pantheon-starter
layout, DDEV local environment, CircleCI → Pantheon deploy pipeline, code-quality gates,
and Quicksilver deploy hooks.
This is the WordPress counterpart to the devops-setup skill (which targets
Drupal via kanopi/drupal-starter). Use this when the CMS is WordPress.
This skill makes irreversible changes across multiple systems:
kanopi/ organizationExplicit user confirmation is required before each destructive phase. Pause and confirm before creating the GitHub repo, before any Pantheon changes, and before pushing code.
/wp-devops-setup [git-url]Arguments: Optional Pantheon git URL (SSH) or existing GitHub URL. If omitted, ask.
gh auth status) with kanopi org write accessddev composer)TERMINUS_MACHINE_TOKEN and the ACF Pro license (if the site
uses ACF Pro) from 1Passwordkanopi/wp-pantheon-starter
(main branch) — fetch config templates from here at runtime rather than hand-writing themjohnpbloch/wordpress-core, contributed plugins
from WPackagist (wpackagist-plugin/*), themes likewise. Core
and contributed code are gitignored; only custom code (theme/mu-plugins) is committed.web/ (web_docroot: true), composer/installers paths route plugins to
web/wp-content/plugins/{$name} and themes to web/wp-content/themes/{$name}.type: wordpress, docroot: web, nginx-fpm, Pantheon provider) with a
db-refresh command and an image proxy to a live Pantheon environment.kanopi/ci-tools, kanopi/cms-updates):
compile-theme (builds assets, persists to workspace) → pantheon-deploy (multidev on
PRs, dev on main), plus static-tests (PHPCS/Rector/PHPStan) and Lighthouse/pa11y/
BackstopJS gates on PRs, and scheduled "update dev" + "automatic updates" pipelines.pantheon.yml with web_docroot: true, enforce_https: full, protected paths, and
Quicksilver workflows (search-replace, WP-CFM config import, New Relic logging,
post-deploy).wp-plugin-to-private-package skill).Confirm with the user at the start of each phase. Where possible, fetch reference files
from kanopi/wp-pantheon-starter instead of hand-authoring them.
kanopi/.pantheon (original) + origin (new kanopi repo); push main.main (required PR review, status checks, conversation resolution)..github/CODEOWNERS (* @kanopi/<team>).composer.json from the starter:
johnpbloch/wordpress-core + kanopi/wp-core-installer (deploys core into web/),
composer/installers, cweagans/composer-patches, pantheon-systems/pantheon-mu-plugin.repositories: WPackagist, the Kanopi private Packagist (https://kanopi.github.io/composer),
and any vendor endpoints (e.g. ACF's connect.advancedcustomfields.com).extra.installer-paths for plugins/themes/mu-plugins; extra.wordpress-install-dir: web.config.vendor-dir per the starter (this project uses
web/wp-content/mu-plugins/vendor, so quality-tool binaries live under its bin/).wp-content/plugins and wp-content/themes; for each contributed
plugin/theme, add the matching wpackagist-plugin/* / wpackagist-theme/* requirement.automattic/vipwpcs (PHPCS WordPress-VIP-Go),
szepeviktor/phpstan-wordpress, rector/rector, php-stubs/acf-pro-stubs (if ACF),
ergebnis/composer-normalize, roave/security-advisories.phpcs/phpcbf (WordPress-VIP-Go),
phpstan (level 5 + WP/ACF stubs), rector-check/rector-fix, plus -ci variants that
emit JUnit to test-results/..gitignore: ignore web/wp-content/plugins/* and themes/* (Composer-managed),
keep custom theme/mu-plugins, ignore the compiled theme CSS (CI builds it), ignore
vendor/, auth.json, and the generated wp-config-ddev.php.next_, not
wp_). Branch wp-config.php env detection: Pantheon → DDEV (wp-config-ddev.php) →
local (wp-config-local.php) → fallback..ddev/config.yaml (type: wordpress, docroot: web, matching php_version and
database version from pantheon.yml, nodejs_version matching the theme .nvmrc)..ddev/providers/pantheon.yaml) and a db-refresh
command that pulls the live DB and runs search-replace.HOSTING_ENV / PROXY_URL web-environment vars.auth.json placement and TERMINUS_MACHINE_TOKEN global config in the README.pantheon.yml: api_version: 1, web_docroot: true, matching php_version and
database.version, enforce_https: full, build_step: false, and protected_web_paths
(/private/, autodiscover URLs).web/private/scripts/ and wire them in pantheon.yml
workflows (clone_database/create_cloud_development_environment → search-replace;
sync_code/deploy → WP-CFM config import, New Relic logging, post-deploy).object-cache.php if the Pantheon plan supports
it. On a basic plan, do not add wp-redis/object-cache.php or a pantheon.yml
object_cache block.wp-plugin-to-private-package)For each premium/committed plugin found in Phase 2's inventory, choose a Composer source — never leave a paid plugin committed or hand-installed:
wp-config.php). Example: ACF Pro via
wpengine/advanced-custom-fields-pro, authed with ACF_CLIENT_USER (license key) +
ACF_CLIENT_PASSWORD (registered URL).composer require kanopi/<slug>.wp-plugin-to-private-package skill to
publish it as a Kanopi private package (kanopi/<slug>), then require it. That skill
handles the private repo, topics, team access, version release, and rewiring
composer.json/.gitignore.This is the integration point:
wp-devops-setupdiscovers the premium plugins;wp-plugin-to-private-packagepackages each one. Run it once per plugin that needs it.
.nvmrc, gulp/Dart-Sass or the theme's
existing build; compiled CSS gitignored). Pin CI Node to the theme .nvmrc..circleci/config.yml from the starter and fill the anchors:
PANTHEON_UUID, TERMINUS_SITE, THEME_PATH, PHP/Node image tags. Leave the
SLACK_HOOK anchor as "${SLACK_WEBHOOK}" — the Slack webhook is a secret and must
not be hardcoded (see Manual Follow-Up); it resolves at runtime from the env var.
compile-theme builds assets and persist_to_workspaces the compiled CSS;
pantheon-deploy attach_workspaces it and rm .gitignore so built assets ship.static-tests runs phpcs-ci/rector-ci/phpstan-ci on PRs (non-main).<< pipeline.schedule.name >> guards): "update dev" (clone live content →
dev) nightly, and "automatic updates"
(cms-updates/run-update cms: wordpress … update-method: composer) weekly..circleci/scripts/ helpers (pantheon/dev-multidev, github/add-commit-comment)
from the starter.README.md (URLs, DDEV setup, Composer/premium-plugin notes, deploy flow,
CircleCI env vars, code-quality commands) and CLAUDE.md (dev commands + non-obvious
conventions: vendor-dir, table prefix, ACF source, compiled-CSS-is-built-in-CI, etc.).kanopi-code context vars: TERMINUS_TOKEN,
ACF_CLIENT_USER, ACF_CLIENT_PASSWORD (if ACF), GITHUB_TOKEN.SLACK_WEBHOOK (the
circleci/[email protected] orb's default webhook env var) in this project's CircleCI
Project Settings → Environment Variables, not the shared kanopi-code context
(which spans all projects). The SLACK_HOOK anchor stays "${SLACK_WEBHOOK}"; never
commit the literal webhook URL.<< pipeline.schedule.name >> guards exactly:
update dev — nightly (daily, e.g. 09:00 UTC) — clones live content → dev.automatic updates — weekly (e.g. Mondays 09:00 UTC) — Composer core/plugin updates.| WordPress (this skill) | Drupal (devops-setup) | |
|---|---|---|
| Reference layout | kanopi/wp-pantheon-starter | kanopi/drupal-starter |
| Core package | johnpbloch/wordpress-core | drupal/core-recommended |
| Contrib source | WPackagist | packages.drupal.org |
| Config import | WP-CFM (Quicksilver) | Drupal config sync |
| Code standard | WordPress-VIP-Go (PHPCS) | Drupal/DrupalPractice (PHPCS) |
| Updates orb | cms-updates cms: wordpress | cms-updates cms: drupal |
npx claudepluginhub kanopi/claude-toolbox --plugin cms-cultivatorAutomates Drupal/Pantheon DevOps for Kanopi projects: creates GitHub repos, configures Pantheon, makes code changes, sets up CI/CD. Requires explicit confirmation for each irreversible phase.
Orchestrates complete WordPress workflow for theme and plugin development, WooCommerce integration, performance optimization, security hardening, and WP 7.0 features like RTC and AI Connectors. Use for production sites.
Sets up and verifies WordPress site access via WP-CLI over SSH or REST API, configures authentication, checks content/plugins, and saves connection configs.