wp-workshop-scaffold
A skill for materializing the WordPress workshop repo shape used by the WordCamp
Portugal 2026 AI Workshop. Three modes: create, reformat, audit.
Canonical shape
Top-level files:
plugin.php (plugin) / style.css (theme) / block.json (block)
package.json, .editorconfig, .eslintrc, .gitignore
blueprint.json — Studio/Playground bootstrap
README.md — pre-workshop setup, welcome, "what we're building", section map
facilitator-notes.md — timing table, before-the-workshop checklist, section-by-section talking points + sticking points
slides-outline.md — slide-by-slide outline
workshop-outline/section-N.md — one file per section
code-reference/section-N/ — snapshot of the code state at the end of each coding section. This is also the starting state of section N+1 — no hidden setup between sections. (only for coding sections)
assets/ — images referenced by docs
includes/, src/ — scaffold dirs (start mostly empty, fill in as sections progress)
Section types: tour, coding, demo, hackathon. Only coding sections get a code-reference/section-N/ snapshot.
Authoring principles
Workshops scaffolded by this skill follow a build-up structure, in the spirit of a cookbook recipe that progresses from empty plate to plated dish:
- The workshop has one north-star artifact — a finished, demoable thing attendees walk away with. The README leads with it ("By the end you'll have built X") and the input questionnaire collects it up front.
- Each coding section adds exactly one capability to that artifact. The end state of section N is a more capable version of the end state of section N-1 — never a parallel detour, never a reset.
code-reference/section-N/ is both the end state of section N and the starting state of section N+1. There must be no hidden setup between sections — an attendee who falls behind can copy section N's snapshot and pick up at the start of section N+1 with zero gap.
tour, demo, and hackathon sections punctuate the arc but don't break the chain — the code state carries through them unchanged.
Code in section files
Coding sections must be copy-paste runnable — an attendee following along should never have to invent or guess code. Each step that introduces or changes code includes a fenced code block, using a hybrid style:
- New file → show the full file content. The block is preceded by the relative path on its own line (e.g.,
src/view.js), and the attendee creates the file and pastes the block verbatim.
- Edit to an existing file → show only the inserted or replaced code, preceded by a one-line anchor that tells the attendee where it goes. Anchors must be unambiguous: a function name, an existing line of code to insert after/before, or an explicit line-range to replace. Examples:
In src/view.js, add inside the store() callback:
In render.php, replace the placeholder \return '';` with:`
In block.json, add to the \attributes` object:`
- Deletion → quote the exact lines to remove, prefixed with
Remove from <file>:.
Step wording in section files
Attendees follow steps live, often in a second language. Write the Steps list of every section in Simplified Technical English, per the shared card (read it live when filling in sections — never copy its rules here):
${CLAUDE_SKILL_DIR}/../ste-pass/references/ste-card.md
The concept intro and End state paragraphs stay in Ryan's voice. facilitator-notes.md and slides-outline.md are not attendee-facing steps, so STE does not apply to them. To check existing sections, run ste-pass.
The end state of each coding section must match the corresponding code-reference/section-N/ snapshot exactly — the snapshot is the ground truth, the section file is the path that gets there.
Mode dispatch
When invoked, ask the user which mode (if not clear from the args):
create — scaffold a new workshop repo from scratch
reformat — reshape an existing repo (local path or git URL) to match
audit — read-only conformance report
Mode: create
Step 1 — Collect inputs interactively
Use AskUserQuestion (one question at a time when answers branch, batch when independent). Required:
- Workshop title (e.g. "Stop Doing It Yourself")
- Event / subtitle (e.g. "WordCamp Portugal 2026")
- Finished artifact (north-star) — one short paragraph describing what attendees will have built and be able to demo at the end. Rendered as the README's "What we're building" hero and used to anchor the build-up arc (see Authoring principles).
- Date (absolute, e.g. "2026-05-15")
- Presenter(s) — name + affiliation each. Loop: "add another presenter?" until done.
- Documentation links — list of URLs that should appear in README/section pages (Studio docs, AI plugin repo, Abilities API docs, etc.). Loop until done.
- Plugin slug (e.g.
wcpt-2026-ai-workshop) — used for directory name, package.json name, blueprint.json plugin path
- WP target:
plugin / theme / block
- WP version target (e.g.
7.0-RC4, beta, latest) — for blueprint.json preferredVersions.wp
- Plugins to preinstall via blueprint — list of slugs (loop until done; empty allowed)
- Target directory — absolute path where the repo should be created. Refuse if it already exists.
Step 2 — Materialize
Read each file in templates/ (sibling of this SKILL.md), substitute {{placeholders}}, write to target directory.
Placeholders used across templates:
{{TITLE}}, {{EVENT}}, {{DATE}}
{{NORTH_STAR}} — one-paragraph description of the finished artifact; rendered in README as the "What we're building" hero
{{PRESENTERS_BLOCK}} — multi-line, one bullet per presenter
{{DOC_LINKS_BLOCK}} — multi-line, one bullet per link
{{PLUGIN_SLUG}}, {{WP_TARGET}} (plugin/theme/block), {{WP_VERSION}}
{{BLUEPRINT_PLUGINS}} — either an empty string (no extra plugins) or a comma-prefixed list of additional installPlugin step objects to append to blueprint.json's steps array. Format: ,\n { "step": "installPlugin", ... },\n { "step": "installPlugin", ... } (leading comma; no trailing comma).
{{REPO_URL}} — optional; leave as placeholder string https://github.com/REPLACE-ME/{{PLUGIN_SLUG}} if user didn't provide
Files to generate:
plugin.php (only if WP target is plugin) — from templates/plugin.php.tmpl
style.css (only if theme) — from templates/style.css.tmpl
block.json (only if block) — from templates/block.json.tmpl
package.json — from templates/package.json.tmpl
.editorconfig, .eslintrc, .gitignore — copied verbatim
blueprint.json — from templates/blueprint.json.tmpl
README.md — from templates/README.md.tmpl
facilitator-notes.md — from templates/facilitator-notes.md.tmpl
slides-outline.md — from templates/slides-outline.md.tmpl
workshop-outline/section-1.md — single TODO stub from templates/workshop-outline/section.md.tmpl (sections left as TODOs per design)
src/index.js — empty/minimal scaffold
includes/.gitkeep, assets/.gitkeep — keep dirs present
Do NOT create code-reference/ directories at create time. Document in README that they will be added per coding section.
Do NOT run git init. Do NOT run studio commands. Files only.
Step 3 — Report
Print: target path, file count, and three next-step suggestions: declare sections, git init, create Studio site from blueprint.json.
Modes: reformat and audit
These modes live in separate files so create does not load them. Read the one you need before you start:
reformat → ${CLAUDE_SKILL_DIR}/references/mode-reformat.md (it also reads mode-audit.md for the checks)
audit → ${CLAUDE_SKILL_DIR}/references/mode-audit.md
Notes for Claude when running this skill
- Use absolute paths in every tool call. Don't
cd. The target directory may not be the cwd.
- Don't invent placeholder values. If the user skips a question, leave the placeholder as a literal
{{TODO: ...}} marker in the output so they can grep for it later.
- One question at a time when answers branch. Batch independent questions in a single
AskUserQuestion call.
- Templates live in
templates/ next to this SKILL.md. Read them with the Read tool; substitute placeholders in memory; write with Write.
code-reference/ snapshots are created later, not at scaffold time. When the user fills in a coding section, they can re-invoke this skill with a separate flow (not implemented in v1 — document as a TODO).
- Never push. Never run
git push, git push --force, git reset --hard, or destructive operations. The user reviews diffs themselves.
1---2name: wp-workshop-scaffold3description: Scaffold a new WordPress workshop repo, reformat an existing repo to the canonical workshop shape (README, facilitator notes, slides outline, section files, code-reference snapshots, blueprint.json), or audit one read-only. Use when starting, retrofitting, or checking a workshop repo.4---56# wp-workshop-scaffold78A skill for materializing the WordPress workshop repo shape used by the WordCamp9Portugal 2026 AI Workshop. Three modes: `create`, `reformat`, `audit`.1011## Canonical shape1213Top-level files:14- `plugin.php` (plugin) / `style.css` (theme) / `block.json` (block)15- `package.json`, `.editorconfig`, `.eslintrc`, `.gitignore`16- `blueprint.json` — Studio/Playground bootstrap17- `README.md` — pre-workshop setup, welcome, "what we're building", section map18- `facilitator-notes.md` — timing table, before-the-workshop checklist, section-by-section talking points + sticking points19- `slides-outline.md` — slide-by-slide outline20- `workshop-outline/section-N.md` — one file per section21- `code-reference/section-N/` — snapshot of the code state at the **end** of each coding section. This is also the **starting state** of section N+1 — no hidden setup between sections. (only for coding sections)22- `assets/` — images referenced by docs23- `includes/`, `src/` — scaffold dirs (start mostly empty, fill in as sections progress)2425Section types: `tour`, `coding`, `demo`, `hackathon`. Only `coding` sections get a `code-reference/section-N/` snapshot.2627## Authoring principles2829Workshops scaffolded by this skill follow a **build-up** structure, in the spirit of a cookbook recipe that progresses from empty plate to plated dish:3031- The workshop has one **north-star artifact** — a finished, demoable thing attendees walk away with. The README leads with it ("By the end you'll have built X") and the input questionnaire collects it up front.32- Each coding section adds **exactly one capability** to that artifact. The end state of section N is a more capable version of the end state of section N-1 — never a parallel detour, never a reset.33- `code-reference/section-N/` is both the end state of section N and the starting state of section N+1. There must be no hidden setup between sections — an attendee who falls behind can copy section N's snapshot and pick up at the start of section N+1 with zero gap.34- `tour`, `demo`, and `hackathon` sections punctuate the arc but don't break the chain — the code state carries through them unchanged.3536### Code in section files3738Coding sections must be **copy-paste runnable** — an attendee following along should never have to invent or guess code. Each step that introduces or changes code includes a fenced code block, using a **hybrid** style:3940- **New file** → show the **full file** content. The block is preceded by the relative path on its own line (e.g., `src/view.js`), and the attendee creates the file and pastes the block verbatim.41- **Edit to an existing file** → show **only the inserted or replaced code**, preceded by a one-line anchor that tells the attendee where it goes. Anchors must be unambiguous: a function name, an existing line of code to insert after/before, or an explicit line-range to replace. Examples:42 - `In src/view.js, add inside the store() callback:`43 - `In render.php, replace the placeholder \`return '';\` with:`44 - `In block.json, add to the \`attributes\` object:`45- **Deletion** → quote the exact lines to remove, prefixed with `Remove from <file>:`.4647### Step wording in section files4849Attendees follow steps live, often in a second language. Write the **Steps** list of every section in Simplified Technical English, per the shared card (read it live when filling in sections — never copy its rules here):5051```52${CLAUDE_SKILL_DIR}/../ste-pass/references/ste-card.md53```5455The concept intro and **End state** paragraphs stay in Ryan's voice. `facilitator-notes.md` and `slides-outline.md` are not attendee-facing steps, so STE does not apply to them. To check existing sections, run `ste-pass`.5657The end state of each coding section must match the corresponding `code-reference/section-N/` snapshot exactly — the snapshot is the ground truth, the section file is the path that gets there.5859## Mode dispatch6061When invoked, ask the user which mode (if not clear from the args):62631. **`create`** — scaffold a new workshop repo from scratch642. **`reformat`** — reshape an existing repo (local path or git URL) to match653. **`audit`** — read-only conformance report6667---6869## Mode: `create`7071### Step 1 — Collect inputs interactively7273Use `AskUserQuestion` (one question at a time when answers branch, batch when independent). Required:74751. **Workshop title** (e.g. "Stop Doing It Yourself")762. **Event / subtitle** (e.g. "WordCamp Portugal 2026")773. **Finished artifact (north-star)** — one short paragraph describing what attendees will have built and be able to demo at the end. Rendered as the README's "What we're building" hero and used to anchor the build-up arc (see Authoring principles).784. **Date** (absolute, e.g. "2026-05-15")795. **Presenter(s)** — name + affiliation each. Loop: "add another presenter?" until done.806. **Documentation links** — list of URLs that should appear in README/section pages (Studio docs, AI plugin repo, Abilities API docs, etc.). Loop until done.817. **Plugin slug** (e.g. `wcpt-2026-ai-workshop`) — used for directory name, package.json `name`, blueprint.json plugin path828. **WP target**: `plugin` / `theme` / `block`839. **WP version target** (e.g. `7.0-RC4`, `beta`, `latest`) — for blueprint.json `preferredVersions.wp`8410. **Plugins to preinstall via blueprint** — list of slugs (loop until done; empty allowed)8511. **Target directory** — absolute path where the repo should be created. Refuse if it already exists.8687### Step 2 — Materialize8889Read each file in `templates/` (sibling of this SKILL.md), substitute `{{placeholders}}`, write to target directory.9091Placeholders used across templates:92- `{{TITLE}}`, `{{EVENT}}`, `{{DATE}}`93- `{{NORTH_STAR}}` — one-paragraph description of the finished artifact; rendered in README as the "What we're building" hero94- `{{PRESENTERS_BLOCK}}` — multi-line, one bullet per presenter95- `{{DOC_LINKS_BLOCK}}` — multi-line, one bullet per link96- `{{PLUGIN_SLUG}}`, `{{WP_TARGET}}` (plugin/theme/block), `{{WP_VERSION}}`97- `{{BLUEPRINT_PLUGINS}}` — either an empty string (no extra plugins) or a comma-prefixed list of additional `installPlugin` step objects to append to `blueprint.json`'s `steps` array. Format: `,\n { "step": "installPlugin", ... },\n { "step": "installPlugin", ... }` (leading comma; no trailing comma).98- `{{REPO_URL}}` — optional; leave as placeholder string `https://github.com/REPLACE-ME/{{PLUGIN_SLUG}}` if user didn't provide99100Files to generate:101- `plugin.php` (only if WP target is `plugin`) — from `templates/plugin.php.tmpl`102- `style.css` (only if `theme`) — from `templates/style.css.tmpl`103- `block.json` (only if `block`) — from `templates/block.json.tmpl`104- `package.json` — from `templates/package.json.tmpl`105- `.editorconfig`, `.eslintrc`, `.gitignore` — copied verbatim106- `blueprint.json` — from `templates/blueprint.json.tmpl`107- `README.md` — from `templates/README.md.tmpl`108- `facilitator-notes.md` — from `templates/facilitator-notes.md.tmpl`109- `slides-outline.md` — from `templates/slides-outline.md.tmpl`110- `workshop-outline/section-1.md` — single TODO stub from `templates/workshop-outline/section.md.tmpl` (sections left as TODOs per design)111- `src/index.js` — empty/minimal scaffold112- `includes/.gitkeep`, `assets/.gitkeep` — keep dirs present113114**Do NOT** create `code-reference/` directories at create time. Document in README that they will be added per coding section.115116**Do NOT** run `git init`. **Do NOT** run `studio` commands. Files only.117118### Step 3 — Report119120Print: target path, file count, and three next-step suggestions: declare sections, `git init`, create Studio site from `blueprint.json`.121122---123124## Modes: `reformat` and `audit`125126These modes live in separate files so `create` does not load them. Read the one you need before you start:127128- **`reformat`** → `${CLAUDE_SKILL_DIR}/references/mode-reformat.md` (it also reads `mode-audit.md` for the checks)129- **`audit`** → `${CLAUDE_SKILL_DIR}/references/mode-audit.md`130131---132133## Notes for Claude when running this skill134135- **Use absolute paths in every tool call.** Don't `cd`. The target directory may not be the cwd.136- **Don't invent placeholder values.** If the user skips a question, leave the placeholder as a literal `{{TODO: ...}}` marker in the output so they can grep for it later.137- **One question at a time when answers branch.** Batch independent questions in a single `AskUserQuestion` call.138- **Templates live in `templates/` next to this SKILL.md.** Read them with the `Read` tool; substitute placeholders in memory; write with `Write`.139- **`code-reference/` snapshots are created later, not at scaffold time.** When the user fills in a coding section, they can re-invoke this skill with a separate flow (not implemented in v1 — document as a TODO).140- **Never push.** Never run `git push`, `git push --force`, `git reset --hard`, or destructive operations. The user reviews diffs themselves.