Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
144 commits
Select commit Hold shift + click to select a range
fa1c1cc
refactor: add PSR4 support
bhavz-10 Mar 31, 2026
78caffb
feat: add sniffs for PSR4 conventions
bhavz-10 Mar 31, 2026
02a5eee
refactor: remove wp filename and class name snifss
bhavz-10 Mar 31, 2026
14d97a8
feat: add dir tree for each path
bhavz-10 Mar 31, 2026
113b382
fix: remove extra line breaks
bhavz-10 Mar 31, 2026
37adaa6
fix: remove wp InvalidClassFileName & NotHyphenatedLowercase sniffs
bhavz-10 Mar 31, 2026
eac8b32
refactor: add asset loader and refactor files
bhavz-10 Mar 31, 2026
0e239f1
fix: update doc blocks and trait check
bhavz-10 Mar 31, 2026
68445eb
fix: resolve copilot reviews
bhavz-10 Apr 1, 2026
28a011d
fix: update comment
bhavz-10 Apr 1, 2026
b3278b9
refact: Remove the plugin references from the theme
aryanjasala Apr 2, 2026
2161e07
refact: Remove non-required check
aryanjasala Apr 2, 2026
e3521f8
Merge pull request #645 from rtCamp/refactor/add-psr4-support-2
aryanjasala Apr 2, 2026
8726699
feat: fix phpcs, package name and strict typing
bhavz-10 Apr 2, 2026
eb0e482
feat: add @since tags
bhavz-10 Apr 2, 2026
0cae641
fix: update spacing
bhavz-10 Apr 2, 2026
8e92d02
fix: resolve strict type variable issues
bhavz-10 Apr 2, 2026
9dc6a43
fix: address feedback
bhavz-10 Apr 3, 2026
f01955a
fix: update the return type message
bhavz-10 Apr 3, 2026
b77068d
feat: remove @return void in function comment
bhavz-10 Apr 3, 2026
97bedf3
fix: remove additional trailing space
bhavz-10 Apr 4, 2026
4212bb4
fix: use [] consistently and remove bool from file type
bhavz-10 Apr 6, 2026
0a65a33
Merge pull request #659 from rtCamp/refactor/issue-657-compatibility-…
aryanjasala Apr 6, 2026
13caa31
GH-641: Fix Known CI Issues (#658)
Infinite-Null Apr 7, 2026
b1e6215
feat: add phpstan and resolve issues
bhavz-10 Apr 15, 2026
7b30859
refactor: move frontend source from assets/src/ to top-level src/
deepaklalwani97 Apr 17, 2026
62fd3d6
fix: add markdown files to stylelintignore
deepaklalwani97 Apr 17, 2026
35f27e0
fix: cast filemtime return value to string in get_file_version method
deepaklalwani97 Apr 17, 2026
d851294
refactor: reorganize asset paths and update webpack configuration
deepaklalwani97 Apr 17, 2026
65d57f4
fix: composer related issues
bhavz-10 Apr 22, 2026
cfddf41
fix: resolve phpcs issues
bhavz-10 Apr 22, 2026
0b56932
fix: update docblock to correct values
bhavz-10 Apr 23, 2026
6b33091
feat: add bootstrap file to phpstan for defining constants
bhavz-10 Apr 23, 2026
9cb04aa
feat: add @package tag and description
bhavz-10 Apr 23, 2026
98cc596
feat: add empty baseline
bhavz-10 Apr 23, 2026
cab57d3
feat: resolve phpcs issues
bhavz-10 Apr 23, 2026
986aa71
fix: use array<string, mixed> instead
bhavz-10 Apr 24, 2026
9e5c17f
Make readAllFileEntries recursive
abhishekxix Apr 27, 2026
01ca73e
Fix svg optimizer filter
abhishekxix Apr 27, 2026
1a47812
Update get_asset_meta to work with the new nested build paths
abhishekxix Apr 27, 2026
50374ec
feat: address issue with the analyseAndScan and scanFiles
bhavz-10 May 7, 2026
5186ec4
fix: resolve review feedback for frontend source reorganization
Adi-ty May 12, 2026
933429f
fix: replace short ternary with explicit ternary in get_asset_meta
Adi-ty May 12, 2026
e8282a6
fix: remove wordpress-stubs.php vendor
bhavz-10 May 12, 2026
8b97774
refact: Consistent spacing/tab usage
aryanjasala May 13, 2026
970ed56
chore: add regex101 reference comment
Adi-ty May 13, 2026
41b6c59
fix: PHPCS comment formatting
Adi-ty May 13, 2026
10a1af6
chore: add BrowserSync and dotenv deps
Swanand01 May 13, 2026
bee5ac9
feat: add live reload via BrowserSync
Swanand01 May 13, 2026
a41a661
feat: enqueue BrowserSync client in local environment
Swanand01 May 13, 2026
d8b6e5a
docs: add hmr.md
Swanand01 May 13, 2026
723174d
feat: update BrowserSync script enqueue to use null version
Swanand01 May 13, 2026
b7d5b06
Merge pull request #666 from rtCamp/feature/issue-634-add-phpstan
aryanjasala May 13, 2026
6cdbcbe
chore: remove redundant path from lint command
aryanjasala May 13, 2026
dbd0852
Update package.json
aryanjasala May 13, 2026
1a6c24b
Merge branch 'theme-elementary-v2' into refactor/frontend-source-reor…
aryanjasala May 13, 2026
f8888ef
Merge pull request #668 from rtCamp/refactor/frontend-source-reorgani…
aryanjasala May 13, 2026
6306591
chore: update devDependencies for Tailwind CSS and PostCSS support
Swanand01 May 14, 2026
6a0c0e9
feat: add PostCSS configuration for Tailwind CSS support
Swanand01 May 14, 2026
fea00c9
feat: enable Tailwind CSS support by adding configuration and styles
Swanand01 May 14, 2026
0234ec6
feat: add watch options to Webpack configuration
Swanand01 May 14, 2026
051b4ca
feat: add Tailwind CSS integration details to the development guide
Swanand01 May 14, 2026
b76ec0a
feat: modify start script, remove dev
Swanand01 May 14, 2026
bff802c
feat: add THEME_ELEMENTARY_DISABLE_BROWSER_SYNC and BS_PORT support
Swanand01 May 15, 2026
91b954c
feat: add BrowserSync port configuration to .env.local.example and docs
Swanand01 May 15, 2026
6161512
fix: typo
Swanand01 May 15, 2026
3820ee2
Merge branch 'theme-elementary-v2' into feat/hot-reload
Swanand01 May 15, 2026
24090e9
feat: enable HMR for blocks in start script and update webpack config…
Swanand01 May 18, 2026
f4e0f14
chore: update docs
Swanand01 May 18, 2026
2da575d
feat: update BrowserSync script handle to include theme version
Swanand01 May 18, 2026
3ba0cb9
feat: add filter and constant
Swanand01 May 18, 2026
b1e90da
feat: remove autoprefixer dependency from package.json
Swanand01 May 18, 2026
24fd0e5
format: tailwind.css
Swanand01 May 18, 2026
3ddb7fd
feat: remove autoprefixer from package-lock.json
Swanand01 May 18, 2026
89a9fb7
chore: add comment in webpack config
Swanand01 May 18, 2026
c32d013
fix: update constant name for Tailwind CSS support
Swanand01 May 18, 2026
5ae74f5
chore: format
Swanand01 May 18, 2026
a5bbd7d
refactor: rename constants
Swanand01 May 18, 2026
2d79a32
fix: rtl css path and css reload
Swanand01 May 19, 2026
9f90bd0
chore: add comments to webpack
Swanand01 May 19, 2026
c166ed4
Merge pull request #672 from rtCamp/feat/hot-reload
aryanjasala May 19, 2026
21265d1
chore: remove old eslint files
Swanand01 May 19, 2026
33d2deb
fix: eslint config
Swanand01 May 19, 2026
879643a
chore: update .gitignore
Swanand01 May 19, 2026
6cc98f0
fix: remove ecmaVersion
Swanand01 May 19, 2026
97fae5e
fix: update eslint version
Swanand01 May 19, 2026
fa46e50
fix: remove unused dep
Swanand01 May 20, 2026
5653c98
feat: add source dir
Swanand01 May 20, 2026
15c8af7
Merge branch 'theme-elementary-v2' into feat/tailwind-support
Swanand01 May 20, 2026
f92ccc6
chore: format
Swanand01 May 20, 2026
7003b70
Merge branch 'theme-elementary-v2' into fix/eslint-workflow
Swanand01 May 20, 2026
193f07e
chore: add package-lock
Swanand01 May 20, 2026
ef64a66
Merge pull request #687 from rtCamp/fix/eslint-workflow
aryanjasala May 21, 2026
b35ac49
chore: update docs
Swanand01 May 25, 2026
9c2cfa4
Merge branch 'theme-elementary-v2' into feat/tailwind-support
Swanand01 May 25, 2026
b5183c9
chore: add package-lock
Swanand01 May 25, 2026
151a4bb
fix: turn ghostMode off
Swanand01 May 25, 2026
2c09222
Merge pull request #690 from rtCamp/fix/browsersync-ghost-mode
aryanjasala May 25, 2026
c59f218
Merge pull request #686 from rtCamp/feat/tailwind-support
aryanjasala May 25, 2026
ad6eab5
refactor: add _tailwind-theme.css to gitignore
Swanand01 May 25, 2026
e31821c
fix: remove tailwind and deps
Swanand01 May 25, 2026
47cf741
chore: add docs
Swanand01 May 25, 2026
6b2937d
Merge pull request #691 from rtCamp/fix/tailwind-theme-file
Swanand01 May 26, 2026
0e845bd
Migrate Theme Elementary to adopt rtcamp/wp-framework package
pratik-londhe4 May 26, 2026
e663231
Fix formatting in Main.php
pratik-londhe4 May 27, 2026
32c9a68
Merge pull request #693 from rtCamp/feat/spacing-fix
aryanjasala May 27, 2026
6a6426c
feat: update theme.json to v3
Swanand01 May 28, 2026
7867b3b
feat: update deps in package .json
Swanand01 May 28, 2026
6802de7
fix: add the import resolver ts dep
Swanand01 May 28, 2026
2b2aa50
fix: revert the ranges
Swanand01 May 29, 2026
2f56374
fix: remove ranges from overrides
Swanand01 May 29, 2026
3abca1c
fix: remove deprecated plugin
Swanand01 May 29, 2026
2927aed
fix: update WP requirement ot at least 6.6
Swanand01 May 29, 2026
7376359
Merge pull request #695 from rtCamp/feat/update-versions
Swanand01 May 29, 2026
1d37072
fix: regenerate package-lock
Swanand01 May 29, 2026
a83e275
refactor(assets)!: replace AssetLoaderTrait with AssetLoader class (#…
aryanjasala Jun 4, 2026
65634b9
feat(components): wire framework ComponentLoader
aryanjasala Jun 4, 2026
3534df9
feat: add Copilot/AI instructions and framework instruction sync (#708)
aryanjasala Jun 7, 2026
1bab6af
feat(templates): add theme template loader via framework TemplateLoad…
aryanjasala Jun 11, 2026
9149001
feat(encryption): add a shared Encryption service over the framework …
aryanjasala Jun 11, 2026
5cb8d57
fix(build): compile blocks under assets/build/blocks/ (#707)
pratik-londhe4 Jun 14, 2026
1795735
Add test matrix for the PHPUnit tests
pratik-londhe4 Jun 15, 2026
d15453a
Fix test matrix not working
pratik-londhe4 Jun 15, 2026
bd98586
feat(scaffold): delegate theme setup to the shared engine
aryanjasala Jun 15, 2026
a6b2a08
Merge pull request #715 from rtCamp/feat/ci-php-wp-matrix
pratik-londhe4 Jun 16, 2026
4e3bf84
feat(scaffold): declare feature config (manage mode ready)
aryanjasala Jun 16, 2026
cc46075
refactor(scaffold): full source identity + namespace/package templates
aryanjasala Jun 16, 2026
aa7d99c
fix(scaffold): declare review/edit fields explicitly
aryanjasala Jun 16, 2026
a18a8b0
refactor: name asset handles via AssetLoader::handle() (#717)
aryanjasala Jun 19, 2026
65f7ecb
refactor(init): delegate init to @rtcamp/wp-tooling/init
Adi-ty Jun 23, 2026
8906a1d
feat: feature-flag system over framework FeatureSelector (#714)
Adi-ty Jun 23, 2026
0f6f471
feat: add Tailwind CSS as a scaffold feature (#718)
aryanjasala Jun 24, 2026
21ddd31
feat: AI skills, Logger service, and graphify knowledge graph (#726)
Adi-ty Jun 24, 2026
3adbfb4
Merge theme-elementary-v2 into feat/scaffold-engine
Adi-ty Jun 24, 2026
c66bc00
chore: pre-public hardening — CONTRIBUTING + pin CI actions (v2) (#737)
aryanjasala Jul 27, 2026
934dac5
ci: add PHPStan analysis job (#746)
Adi-ty Jul 29, 2026
f65b524
chore(deps): pin rtcamp/wp-framework to ^1.0 (#747)
aryanjasala Jul 29, 2026
7b16587
chore: adopt the shared rtCamp lint and analysis standards (#748)
aryanjasala Jul 29, 2026
940d601
fix: actually load the shared PHPStan baseline
aryanjasala Jul 29, 2026
537168c
Merge pull request #749 from rtCamp/fix/phpstan-shared-baseline
aryanjasala Jul 29, 2026
77dd8a8
fix: stop running the scaffolder from the prepare hook
aryanjasala Jul 29, 2026
191fc12
Merge theme-elementary-v2 into feat/scaffold-engine
aryanjasala Jul 29, 2026
93d87ca
Merge pull request #750 from rtCamp/fix/prepare-no-scaffold
aryanjasala Jul 29, 2026
b3ddc06
Merge pull request #716 from rtCamp/feat/scaffold-engine
aryanjasala Jul 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions .claude/skills/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# AI skills

Skills for AI assistants (Claude Code, Cursor, and any tool that reads the Claude Code skill convention) that drive this theme's setup and the `@rtcamp/wp-tooling` scaffold engine. Each skill is a directory with a `SKILL.md` (frontmatter `name:` + `description:`, portable Markdown body).

| Skill | Invoke | What it does |
|---|---|---|
| [`init/`](init/SKILL.md) | `/init` | Turn this cloned theme into a named theme and manage it afterwards: rename the starter tokens, keep/remove the example sets, toggle optional features (Tailwind, HMR). Drives `npm run init`. |
| [`scaffold/`](scaffold/SKILL.md) | `/scaffold` | Add one feature (dynamic block, shortcode, settings/admin page, service, CI workflow - plus CPT/taxonomy/REST/CLI/cron for a companion plugin) via `npx wp-tooling add`, TDD-first, wiring it into `Main::CLASSES`. |

`init` is theme-specific. `scaffold` tracks `@rtcamp/wp-tooling` and introspects the project, so it stays correct as the layout evolves. [`setup/`](setup/SKILL.md) (`/setup`) is the natural-language bootstrapper: from one brief it applies tooling and chains a sequence of feature scaffolds.

**Copilot parity:** `init` and `scaffold` also exist for GitHub Copilot as prompt files in [`.github/prompts/`](../../.github/prompts/) (`/init`, `/scaffold`), kept consistent with these skills. Shared conventions and the knowledge-graph (graphify) policy live in [`AGENTS.md`](../../AGENTS.md).

## Safety

These skills are opinionated about safety and never: run a package manager or `npm run build` without consent; read, log, or transmit secret values; apply cross-file wiring without showing the diff and getting consent; or commit, push, or open PRs without approval. `init` additionally never runs a destructive setup without confirming the resolved values against a clean working tree.

Two consented exceptions to the package-manager rule: `npm run init` (the theme's own setup script), and the **pilot bootstrap** `init` runs on request (sibling clone of the tooling engine + local `file:` ref + `composer update`/`npm install`). After any code change, the skills refresh the local graph with `graphify update .`.
140 changes: 140 additions & 0 deletions .claude/skills/init/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
---
name: init
description: Set up this cloned theme-elementary into a named theme, or manage its identity and capabilities later. During the pilot it can also run the local bootstrap (sibling clone of the tooling engine, local package ref, composer + npm install). Drives `npm run init`. Always confirms before destructive or install steps; expects a clean working tree.
---

# init

Two jobs: **bootstrap + setup** a fresh clone into a real theme, or **manage** an already-set-up project. Always interactive: gather inputs first, confirm the resolved plan, then act.

## Use for
- First run: optional pilot bootstrap (deps), rename starter tokens, pick which example sets to keep.
- First run WITH a feature brief: after rename + capabilities, implement the described features by chaining to the **scaffold** skill (TDD), replacing the matching `Example*`/demo placeholders (step 8).
- Later: rename / re-prefix, toggle features (Tailwind, HMR).

## Do not use for
- Adding a feature class → the **scaffold** skill (`npx wp-tooling add`).
- Bug fixes, refactors, hand-written features.
- Re-running init to change capabilities after first setup. Removal is one-shot (markers are consumed); a second run leaves dangling `Main::CLASSES` refs. Set the set ONCE; change it later via scaffold.

## Be interactive (required)
Ask the developer for every input the chosen path needs, in ONE batched message, before acting. Never assume a theme name. Show derived values back. Wait for explicit consent before any install, file rewrite, or destructive step. If an answer is missing, ask; do not guess.

## Plan and announce (required) - developer experience first
Keep the developer oriented at every moment; great DX is the goal even through an AI skill.

1. **State the plan up front** in one short message: the mode (setup / manage) and the ordered steps you will run for THIS request. For a setup-with-brief, that is: detect mode -> (offer) bootstrap deps -> gather + confirm identity and capabilities -> run init (which also removes the example sets the brief does not need) -> hand each feature to the scaffold skill.
2. **Maintain a live TODO list** on the host's task surface (`TodoWrite` in Claude Code): one entry per planned step, exactly one `in_progress` at a time, marked `completed` the moment it is done. Add entries as the work reveals them (a missing dep, each feature to scaffold).
3. **Announce each step with a short title** as you start it (e.g. "Running init", "Removing the shortcode example", "Handing the Testimonial block to scaffold") and report its outcome in one line. Never go silent during a long step.
4. **Confirm before anything destructive or installing** (the init rewrite, dependency installs), showing the exact resolved values.

## Steps

### 1. Detect mode
```bash
test -f .wp-scaffold.json && echo manage || echo setup
```
No `.wp-scaffold.json` → **setup**. Present → **manage** (read it for current identity; `npm run init -- --list` shows feature status).

### 2. Setup: offer the pilot bootstrap
The rtCamp tooling packages are private/unpublished during the pilot. If `npm install` can resolve `@rtcamp/wp-tooling` from the registry and `composer install` resolves `rtcamp/wp-framework` from its VCS repo, no bootstrap is needed - skip to step 3. Otherwise ask: "Bootstrap local dependencies now? (clones the tooling engine, points npm at it, installs). y/n". On **yes**, with consent, run in order (tell the developer each step in <=30 words):

```bash
nvm use # Node from .nvmrc

# Sibling clone for the npm engine (skip if it already exists):
git clone git@github.com:rtCamp/wp-tooling.git ../wp-tooling
( cd ../wp-tooling && git checkout release/v1.0.0 ) # init/scaffold engine landed here

# Local-only npm ref: this theme's only @rtcamp/* dependency is @rtcamp/wp-tooling.
npm pkg set devDependencies.@rtcamp/wp-tooling=file:../wp-tooling/node-packages/wp-tooling

# wp-framework already resolves from the VCS "repositories" entry in composer.json (dev-main);
# composer update pulls it. For local framework development, optionally add a path repo instead:
# { "type": "path", "url": "../wp-framework", "options": { "symlink": false } }
composer update rtcamp/wp-framework
# --install-links is REQUIRED: it copies the file: @rtcamp package into node_modules instead of
# symlinking, so its peer deps resolve from this theme. Add --legacy-peer-deps on ERESOLVE.
npm install --install-links
```
The `file:` edit is local-only. Note: init ALSO writes identity changes (name, namespace, pot path) into `package.json`/`composer.json`, so a blanket `git checkout package.json composer.json` would discard the rename. Before committing, revert ONLY the dependency-source line (the `@rtcamp/wp-tooling` `file:` ref, plus any path `repositories` entry and `composer.lock` you added) - keep every identity change. On **no**, skip to step 3 and surface installs as developer actions instead.

### 3. Preconditions (verify; do not silently fix)
- `node_modules/@rtcamp/wp-tooling` exists (the engine needs it). If missing and bootstrap was declined, surface `npm install` as a developer action.
- Clean working tree (`git status`). Init rewrites files irreversibly; a clean tree is the only undo. If dirty, ask to commit/stash.
- Confirm this is a fresh clone meant to become a new theme, not the skeleton repo itself.

### 4. Gather inputs
**Setup:** theme name (required, e.g. `Acme Blog` → namespace `rtCamp\Theme\Acme_Blog`, package `rtcamp/acme-blog`, text domain, constant/function/CSS prefixes, the `style.css` + `functions.php` headers; show these back); version (default `1.0.0`); which example sets to remove and which features to enable (defaults: keep all sets, hmr on, tailwind off). The engine derives the tokens itself; do not read the engine source to work them out - the mapping above is the contract, and the graph answers any deeper question (see the graphify policy in `AGENTS.md`).
**Manage:** which of identity / features to change.

### 5. Confirm
Show the exact resolved values and the exact command. Get explicit consent; init is destructive.

### 6. Run init (with consent)
`npm run init` also runs `npm run sync-ai`; that is expected.
```bash
# Setup:
npm run init -- --name="Acme Blog" --version=1.0.0 --yes \
--remove-examples=shortcode,patterns --features=hmr,tailwind
# Manage:
npm run init -- --list
npm run init -- --enable=tailwind --yes
npm run init -- --features=hmr --yes # exact enabled set (empty = none)
```
- `--keep-examples` keeps all; `--remove-examples` (no value) removes all; `--remove-examples=a,b` removes listed keys.
- `--features=a,b` sets the exact enabled set; `--enable`/`--disable` are deltas.
- `--yes` requires `--name`. For the guided wizard, run bare `npm run init` (space toggles, enter confirms).

**Setup WITH a feature brief - remove the example sets in THIS step (do not make it a separate round-trip):** remove every example set (`--remove-examples` with all keys, or the no-value form). Unlike a plugin's per-kind `AbstractModule` with a `get_classes()` array to keep-and-empty, this theme lists every class directly in `Main::CLASSES`, so there is nothing to keep-and-empty: the scaffold skill builds each briefed feature from scratch and wires its new `::class` line into `Main::CLASSES` itself (step 8). Example: brief = a custom Testimonial block + a footer credits shortcode -> `--remove-examples=block-extension,settings,shortcode,components,patterns`, then let scaffold build the two real features.

### 7. After init
- Tailwind enabled → it added `src/css/frontend/tailwind.css` + `postcss.config.js` and pinned `@rtcamp/tailwind-config`; developer runs `npm install` (re-apply the `file:` ref first during the pilot).
- `composer dump-autoload` (engine runs it when `composer.json` is present).
- Trust the engine's own output to verify (it reports the removed sets, drops their `Main::CLASSES` lines and tests, and regenerates the autoloader). To confirm a symbol or reference, run a single `graphify query`/`affected` against the graph - never grep `Main.php`/`inc/` to check removal.
- If you hand-edited PHP and are NOT handing off to scaffold (e.g. a manage-mode dangling `Main::CLASSES` cleanup), run `composer phpcs` on the change and fix it. When a brief follows (step 8), leave the phpcs/PHPStan/test gates to the scaffold skill - init does not run them.
- **Refresh the LOCAL graph** with `graphify update .` (theme slice, tree-sitter, no API, seconds). The committed `graphify-out/graph.json` is a maintained baseline; your local refresh keeps queries accurate after a rename. If graphify is not installed, say so in one line; do not block.
- Report: new identity, example sets removed/kept, features toggled, outstanding developer actions.

### 8. Implement the brief by handing off to scaffold (setup only, when features were described)
By this point step 6 has removed the example sets. init's remaining job is purely to **hand each described feature to the scaffold skill** - it does NOT build the class, write or run tests, set up the test env (`npm run wp-env start`), or run the phpcs/PHPStan gates. The **scaffold skill takes over** and owns all of that.

For each described feature, **invoke the scaffold skill**, passing the brief (e.g. a dynamic `testimonial` block; a `[footer_credits]` shortcode). The scaffold skill owns conventions, the `wp-tooling add` call, wiring the new `::class` into `Main::CLASSES`, the TDD loop, test execution, and the gates - report its result; do not duplicate that work here.

**Pass your findings to scaffold (speeds it up).** init has already resolved the theme identity while renaming, so hand those values to the scaffold skill in the same message instead of making it re-derive them. State explicitly: the resolved **PHP namespace root** (e.g. `rtCamp\Theme\Acme_Blog`), **base_path** for module scaffolds (`inc/Modules/<Kind>`), **tests_namespace** (e.g. `rtCamp\Theme\Acme_Blog\Tests`), **tests_path** (`tests/php`), **text_domain** and **slug** (e.g. `acme-blog`), the **theme display name**, and that **classes wire directly into `Main::CLASSES`** (no per-kind module file). With these provided, the scaffold skill skips its own `composer.json` / `style.css` / `Main.php` discovery reads. It still reads source files when it needs exact code (the graph and a handoff are for orientation, not a substitute for reading).

End state: init has renamed and trimmed the example sets (step 6); the scaffold skill has implemented the real features.

## Capability model
ONE "Select the example sets to include" prompt. Each is keep-or-remove; removing deletes it entirely (concrete classes, its `Main::CLASSES` line + `use` import, coupled regions, demo files). The sets and features match `bin/scaffold.config.js`:

| Category | Keys |
|---|---|
| Editor & Frontend | `block-extension`, `shortcode`, `components`, `patterns`, `tailwind` (feature) |
| Admin | `settings` |
| Dev | `hmr` (feature) |

- `block-extension` - Media-text block render-filter extension.
- `shortcode` - Author-bio shortcode.
- `components` - Example components (button, card).
- `patterns` - Page-creation block pattern.
- `settings` - Theme options settings page.

Sets are kept by default; pass keys to `--remove-examples` to drop. Features: `hmr` on, `tailwind` off; toggle via `--features`/`--enable`/`--disable`.

### Changing capabilities after setup
Add later → scaffold skill / `npx wp-tooling add <category>/<slug>` (writes the class, wires it into `Main::CLASSES`). Remove later → delete its class file(s) under `inc/Modules/<Kind>/` plus its `Main::CLASSES` line and `use` import by hand. Do not re-run init to change the set.

## Hard rules
- **BASE (see AGENTS.md guardrails):** never run history/remote `git`/`gh` (commit, push, `branch -D`, `reset --hard`, PR, issue comment, `gh secret set`) - print them as developer actions. `git clone`/`checkout` for setup are fine. Never do a destructive operation outside this theme directory; cloning a NEW sibling is additive and OK, deleting/overwriting existing out-of-repo files is not.
- Package managers only with consent: `npm run init`, and the pilot bootstrap of step 2 (sibling clone + local ref + `composer update`/`npm install`). Outside those, surface install commands as developer actions.
- Never run a destructive init without confirming resolved values, on a clean tree.
- Never commit, push, open PRs, or edit `.wp-scaffold.json` by hand.
- Never leave local-only `file:`/`path` edits uncommunicated: tell the developer to revert ONLY the dependency-source lines before commit (the `@rtcamp/wp-tooling` `file:` ref, any path `repositories` entry, `composer.lock`), keeping all identity changes init wrote into those files.
- Never invent flags. Supported: `--name`, `--version`, `--yes`, `--keep-examples`, `--remove-examples[=...]`, `--features`, `--enable`, `--disable`, `--reinit`, `--list`, `--clean`, `--help`. Run `npm run init -- --help` if unsure.

## Reference
- Engine: `@rtcamp/wp-tooling/init` (via `bin/init.js`). Capability map: `bin/scaffold.config.js`.
- Conventions renamed into: `AGENTS.md`, `.github/instructions/structure.instructions.md`.
- Local setup / features: `README.md`, `DEVELOPMENT.md`, `docs/hmr.md`, `docs/tailwind.md`, `docs/asset-building-process.md`.
- Graphify policy: `AGENTS.md`.
Loading