blueprint

作成者: wordpress

WordPress Playgroundのblueprint JSONファイルを作成、編集、またはレビューする際に使用します。blueprint、Playgroundの設定、リクエストなどに関する言及でトリガーされます。

npx skills add https://github.com/wordpress/agent-skills --skill blueprint

WordPress Playground Blueprints

Overview

A Blueprint is a JSON file that declaratively configures a WordPress Playground instance — installing plugins/themes, setting options, running PHP/SQL, manipulating files, and more.

Core principle: Blueprints are trusted JSON-only declarations. No arbitrary JavaScript. They work on web, Node.js, and CLI.

Quick Start Template

{
  "$schema": "https://playground.wordpress.net/blueprint-schema.json",
  "landingPage": "/wp-admin/",
  "preferredVersions": { "php": "8.3", "wp": "latest" },
  "steps": [{ "step": "login" }]
}

Top-Level Properties

All optional. Only documented keys are allowed — the schema rejects unknown properties.

PropertyTypeNotes
$schemastringAlways "https://playground.wordpress.net/blueprint-schema.json"
landingPagestringRelative path, e.g. /wp-admin/
descriptionstringDeprecated optional top-level description. Prefer meta.description for new Blueprints
metaobject{ title, author, description?, categories? } — title and author required
preferredVersionsobject{ php, wp } — both required when present
featuresobject{ networking?: boolean, intl?: boolean }only these two keys, nothing else. Networking defaults to true
phpExtensionBundlesanyDeprecated/no longer used; the schema leaves the value unconstrained and says to remove it from Blueprints
extraLibrariesarray["wp-cli"] — auto-included when any wp-cli step is present
constantsobjectShorthand for defineWpConfigConsts. Values: string/boolean/number
pluginsarrayShorthand for installPlugin steps. Strings = wp.org slugs
siteOptionsobjectShorthand for setSiteOptions
loginboolean or objecttrue = login as admin. Object = { username?, password? } (both default to "admin"/"password")
stepsarrayMain execution pipeline. Runs after shorthands

preferredVersions Values

  • php: Major.minor only: "7.4", "8.0", "8.1", "8.2", "8.3", "8.4", "8.5", or "latest". Patch versions like "7.4.1" are invalid. Check the schema for currently supported versions.
  • wp: Recent major versions, "latest", "beta", "nightly"/"trunk", or a URL to a custom zip. The schema also accepts false for PHP-only Playground; do not combine wp: false with WordPress-only fields such as plugins, siteOptions, login, or WordPress-only steps.

Shorthands vs Steps

Shorthands (login, plugins, siteOptions, constants) are expanded and prepended to steps in an unspecified order. Use explicit steps when execution order matters.

Resource References

Resources tell Playground where to find files. Used by installPlugin, installTheme, writeFile, writeFiles, importWxr, etc.

Resource TypeRequired FieldsExample
wordpress.org/pluginsslug{ "resource": "wordpress.org/plugins", "slug": "woocommerce" }
wordpress.org/themesslug{ "resource": "wordpress.org/themes", "slug": "astra" }
urlurl{ "resource": "url", "url": "https://example.com/plugin.zip" }
git:directoryurl, refSee below
literalname, contents{ "resource": "literal", "name": "file.txt", "contents": "hello" }
literal:directoryname, filesSee below
bundledpathReferences a file within a blueprint bundle (e.g. { "resource": "bundled", "path": "/plugin.zip" })
zipinnerWraps another resource in a ZIP — use when a step expects a zip but your source isn't one (e.g. wrapping a url resource pointing to a raw directory)

git:directory — Installing from GitHub

{
  "resource": "git:directory",
  "url": "https://github.com/WordPress/gutenberg",
  "ref": "trunk",
  "refType": "branch",
  "path": "/"
}
  • When using a branch or tag name for ref, you must set refType ("branch" | "tag" | "commit" | "refname"). Without it, only "HEAD" resolves reliably.
  • path selects a subdirectory (defaults to repo root).

literal:directory — Inline File Trees

{
  "resource": "literal:directory",
  "name": "my-plugin",
  "files": {
    "plugin.php": "<?php /* Plugin Name: My Plugin */ ?>",
    "includes": {
      "helper.php": "<?php // helper code ?>"
    }
  }
}
  • files uses nested objects for subdirectories — keys are filenames or directory names, values are plain strings (file content) or objects (subdirectories). Never use resource references as values.
  • Do NOT use path separators in keys (e.g. "includes/helper.php" is wrong — use a nested "includes": { "helper.php": "..." } object).

Steps Reference

Every step requires "step": "<name>". Any step can optionally include "progress": { "weight": 1, "caption": "Installing..." } for UI feedback.

Plugin & Theme Installation

{
  "step": "installPlugin",
  "pluginData": { "resource": "wordpress.org/plugins", "slug": "gutenberg" },
  "options": { "activate": true, "targetFolderName": "gutenberg" },
  "ifAlreadyInstalled": "overwrite"
}
{
  "step": "installTheme",
  "themeData": { "resource": "wordpress.org/themes", "slug": "twentytwentyfour" },
  "options": { "activate": true, "importStarterContent": true },
  "ifAlreadyInstalled": "overwrite"
}
  • Use pluginData / themeDataNOT the deprecated pluginZipFile / themeZipFile.
  • pluginData / themeData accept any FileReference or DirectoryReference — a zip URL, a wordpress.org/plugins slug, a git:directory, or a literal:directory (no zip wrapper needed).
  • options.activate controls activation. No need for a separate activatePlugin/activateTheme step when using installPlugin/installTheme.
  • ifAlreadyInstalled: "overwrite" | "skip" | "error"

Activation (standalone)

Only needed for plugins/themes already on disk (e.g. after writeFile/writeFiles):

{ "step": "activatePlugin", "pluginPath": "my-plugin/my-plugin.php" }
{ "step": "activateTheme", "themeFolderName": "twentytwentyfour" }

File Operations

{ "step": "writeFile", "path": "/wordpress/wp-content/mu-plugins/custom.php", "data": "<?php // code" }

data accepts a plain string (as shown above) or a resource reference (e.g. { "resource": "url", "url": "https://..." }).

{
  "step": "writeFiles",
  "writeToPath": "/wordpress/wp-content/plugins/",
  "filesTree": {
    "resource": "literal:directory",
    "name": "my-plugin",
    "files": {
      "plugin.php": "<?php\n/*\nPlugin Name: My Plugin\n*/",
      "includes": {
        "helpers.php": "<?php // helpers"
      }
    }
  }
}

writeFiles requires a DirectoryReference (literal:directory or git:directory) as filesTree — not a plain object.

Other file operations: mkdir, cp, mv, rm, rmdir, unzip.

Running Code

runPHP:

{ "step": "runPHP", "code": "<?php require '/wordpress/wp-load.php'; update_option('key', 'value');" }

GOTCHA: You must require '/wordpress/wp-load.php'; to use any WordPress functions.

wp-cli:

{ "step": "wp-cli", "command": "wp post create --post_type=page --post_title='Hello' --post_status=publish" }

The step name is wp-cli (with hyphen), NOT cli or wpcli.

runSql:

{ "step": "runSql", "sql": { "resource": "literal", "name": "q.sql", "contents": "UPDATE wp_options SET option_value='val' WHERE option_name='key';" } }

Site Configuration

{ "step": "setSiteOptions", "options": { "blogname": "My Site", "blogdescription": "A tagline" } }
{ "step": "defineWpConfigConsts", "consts": { "WP_DEBUG": true } }
{ "step": "setSiteLanguage", "language": "en_US" }
{ "step": "defineSiteUrl", "siteUrl": "https://example.com" }

Other Steps

StepKey Properties
loginusername?, password? (default "admin" / "password")
enableMultisite(no required props)
importWxrfile (FileReference)
importThemeStarterContentthemeSlug?
importWordPressFileswordPressFilesZip, pathInZip? — imports a full WordPress directory from a zip
requestrequest: { url, method?, headers?, body? }
updateUserMetauserId, meta
runWpInstallationWizardoptions? — runs the WP install wizard with given options
resetData(no props)

Common Patterns

Inline mu-plugin (quick custom code)

{
  "step": "writeFile",
  "path": "/wordpress/wp-content/mu-plugins/custom.php",
  "data": "<?php\n// mu-plugins load automatically — no activation needed, no require wp-load.php\nadd_filter('show_admin_bar', '__return_false');"
}

Inline plugin with multiple files

{
  "step": "writeFiles",
  "writeToPath": "/wordpress/wp-content/plugins/",
  "filesTree": {
    "resource": "literal:directory",
    "name": "my-plugin",
    "files": {
      "my-plugin.php": "<?php\n/*\nPlugin Name: My Plugin\n*/\nrequire __DIR__ . '/includes/main.php';",
      "includes": {
        "main.php": "<?php // main logic"
      }
    }
  }
}

Then activate it with a separate step:

{ "step": "activatePlugin", "pluginPath": "my-plugin/my-plugin.php" }

Plugin from a GitHub branch

{
  "step": "installPlugin",
  "pluginData": {
    "resource": "git:directory",
    "url": "https://github.com/user/repo",
    "ref": "feature-branch",
    "refType": "branch",
    "path": "/"
  }
}

Common Mistakes

MistakeCorrect
pluginZipFile / themeZipFilepluginData / themeData
"step": "cli""step": "wp-cli"
Flat object as writeFiles.filesTreeMust be a literal:directory or git:directory resource
Path separators in files keysUse nested objects for subdirectories
runPHP without wp-load.phpAlways require '/wordpress/wp-load.php'; for WP functions
Invented top-level keysOnly documented keys work — schema rejects unknown properties
Inventing proxy URLs for GitHubUse git:directory resource type
Omitting refType with branch/tag refRequired — only "HEAD" works without it
Resource references in literal:directory files valuesValues must be plain strings (content) or objects (subdirectories) — never resource refs
features.debug or other invented feature keysfeatures only supports networking and intl — use constants: { "WP_DEBUG": true } for debug mode
require wp-load.php in mu-plugin codeOnly needed in runPHP steps — mu-plugins already run within WordPress
Schema URL with .org domainMust be playground.wordpress.net, not playground.wordpress.org

Full Reference

This skill covers the most common steps and patterns. For the complete API, see:

Additional steps not covered above: runPHPWithOptions (run PHP with custom ini settings), runWpInstallationWizard, and resource types vfs and bundled (for advanced embedding scenarios).

Blueprint Bundles

Bundles are self-contained packages that include a blueprint.json along with all the resources it references (plugins, themes, WXR files, etc.). Instead of hosting assets externally, bundle them alongside the blueprint.

Bundle Structure

my-bundle/
├── blueprint.json          ← must be at the root
├── my-plugin.zip           ← zipped plugin directory
├── theme.zip
└── content/
    └── sample-content.wxr

Plugins and themes must be zipped before bundling — installPlugin expects a zip, not a raw directory. To create the zip from a plugin directory:

cd my-bundle
zip -r my-plugin.zip my-plugin/

Referencing Bundled Resources

Use the bundled resource type to reference files within the bundle:

{
  "step": "installPlugin",
  "pluginData": {
    "resource": "bundled",
    "path": "/my-plugin.zip"
  },
  "options": { "activate": true }
}
{
  "step": "importWxr",
  "file": {
    "resource": "bundled",
    "path": "/content/sample-content.wxr"
  }
}

Creating a Bundle Step by Step

  1. Create the bundle directory and add blueprint.json at its root.
  2. Write your plugin/theme source files in a subdirectory (e.g. my-plugin/my-plugin.php).
  3. Zip the plugin directory: zip -r my-plugin.zip my-plugin/
  4. Reference it in blueprint.json using { "resource": "bundled", "path": "/my-plugin.zip" }.

Full example — a bundle that installs a custom plugin:

dashboard-widget-bundle/
├── blueprint.json
├── dashboard-widget.zip        ← zip of dashboard-widget/
└── dashboard-widget/           ← plugin source (kept for editing)
    └── dashboard-widget.php
{
  "$schema": "https://playground.wordpress.net/blueprint-schema.json",
  "landingPage": "/wp-admin/",
  "preferredVersions": { "php": "8.3", "wp": "latest" },
  "steps": [
    { "step": "login" },
    {
      "step": "installPlugin",
      "pluginData": { "resource": "bundled", "path": "/dashboard-widget.zip" },
      "options": { "activate": true }
    }
  ]
}

Distribution Formats

FormatHow to use
ZIP file (remote)Website: https://playground.wordpress.net/?blueprint-url=https://example.com/bundle.zip
ZIP file (local)CLI: npx @wp-playground/cli server --blueprint=./bundle.zip
Local directoryCLI: npx @wp-playground/cli server --blueprint=./my-bundle/ --blueprint-may-read-adjacent-files
Git repository directoryPoint blueprint-url at a repo directory containing blueprint.json

GOTCHA: Local directory bundles always need --blueprint-may-read-adjacent-files for the CLI to read bundled resources. Without it, any "resource": "bundled" reference will fail with a "File not found" error. ZIP bundles don't need this flag — all files are self-contained inside the archive.

Testing Blueprints

Inline Blueprints (quick test, no bundles)

Minify the blueprint JSON (no extra whitespace), encode it once with encodeURIComponent(), prepend https://playground.wordpress.net/#, and open the URL in a browser:

https://playground.wordpress.net/#%7B%22%24schema%22%3A%22https%3A%2F%2Fplayground.wordpress.net%2Fblueprint-schema.json%22%2C%22preferredVersions%22%3A%7B%22php%22%3A%228.3%22%2C%22wp%22%3A%22latest%22%7D%2C%22steps%22%3A%5B%7B%22step%22%3A%22login%22%7D%5D%7D

Very large blueprints may exceed browser URL length limits; use the CLI or a hosted Blueprint URL instead. For share-link details, use wp-playground/references/website.md.

Local CLI Testing

Interactive server (keeps running, opens in browser):

# Directory bundle — requires --blueprint-may-read-adjacent-files
npx @wp-playground/cli server --blueprint=./my-bundle/ --blueprint-may-read-adjacent-files

# ZIP bundle — self-contained, no extra flags needed
npx @wp-playground/cli server --blueprint=./bundle.zip

Headless validation (runs blueprint and exits):

npx @wp-playground/cli run-blueprint --blueprint=./my-bundle/ --blueprint-may-read-adjacent-files

Testing with WordPress Playground

Use the wp-playground skill for local or browser testing. For CLI testing, follow wp-playground/references/cli.md with --blueprint=<path-or-url>; for directory bundles, pass --blueprint-may-read-adjacent-files.

wordpressのその他のスキル

wordpress-router
wordpress
WordPressコードベースを分類し、プラグイン、テーマ、ブロック、コアチェックアウトの正しいワークフローにルーティングします。自動プロジェクトトリアージを実行し、リポジトリタイプ(プラグイン、テーマ、ブロックテーマ、Gutenbergブロック、WPコア)と利用可能なツールを特定します。ユーザーの意図とプロジェクトの種類に基づいて、分類結果とドメイン固有スキルへの決定木ルーティングを出力します。リポジトリルートアクセスとbash/Nodeファイルシステム操作が必要です。一部のワークフローではWP-CLIが必要です。PHP 7.2.24+を搭載したWordPress 6.9+を対象としています。...
official
wp-abilities-api
wordpress
WordPress Abilities APIの登録、REST公開、およびクライアントサイドでの利用(WordPress 6.9以上対応)。PHPでwp_register_ability()とwp_register_ability_category()を使用し、安定したID、ラベル、メタデータを持つアビリティとカテゴリを登録します。meta.show_in_rest: trueを設定することで、/wp-json/wp-abilities/v1/ RESTエンドポイントを介してアビリティをクライアントに公開します。JavaScriptでは@wordpress/abilitiesパッケージを使用してアビリティを利用し、クライアントサイドでのアクセスと権限チェックを行います。WordPress 6.9以上が必要です...
official
wp-abilities-audit
wordpress
WordPressプラグインのREST APIサーフェスを監査し、Abilities API登録を提案する標準化された監査ドキュメントを生成します。YAML…を含むMarkdownドキュメントを生成します。
official
wp-abilities-verify
wordpress
WordPressプラグインのAbilities API登録内容を検証します:アビリティを列挙し、コールバックの動作が各アノテーションの主張と一致するかを確認します(敵対的…
official
wp-block-development
wordpress
WordPressブロック開発(Gutenberg向け):メタデータ、登録、レンダリング、ビルドワークフロー。ブロック作成、block.json設定、静的/動的レンダリング、register_block_type_from_metadata()によるサーバーサイドPHP登録をカバー。WordPress 6.9+互換性のためapiVersion: 3を適用し、iframeエディターサポートとスタイル分離を含む。属性シリアライゼーション、"Invalid block"エラーを防ぐ非推奨/マイグレーション、内部ブロック構成を処理。
official
wp-block-themes
wordpress
WordPressブロックテーマ開発:theme.json、テンプレート、パターン、サイトエディターのトラブルシューティング。theme.jsonの編集(プリセット、設定、ブロックごとのスタイル)、テンプレートとテンプレートパーツ、パターン、WordPress 6.9以降のスタイルバリエーションをカバー。テーマのルートとブロックテーマ構造を検出するトリアージスクリプト、新しいテーマの作成やクラシックテーマの変換手順を含む。スタイル階層の問題、ユーザーカスタマイズの上書き、サイト...
official
wp-interactivity-api
wordpress
WordPress Interactivity APIの機能(data-wp-*ディレクティブ、@wordpress/interactivityのストア/ステート/アクション、ブロックのviewScriptModule…)を構築またはデバッグする際に使用します。
official
wp-patterns
wordpress
技術的に正確で、デザイン性の高いWordPressブロックパターンを生成します。ブロックパターン、スターターページパターン、テンプレートパターン、テンプレート…を作成する際に使用します。
official