WooCommerce Code Review
woocommerce/woocommerce
Reviews WooCommerce code changes against the project's standards, flagging backend PHP architecture, naming, documentation, data integrity and testing violations.
Scaffold a new Marko module — a self-contained Composer package with composer.json, namespaced src/, and Pest tests.
$ npx skills add marko-php/marko --skill create-module -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install marko-php/marko create-module --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/marko-php/marko.git skills-src && mkdir -p .claude/skills && cp -r skills-src/packages/claude-plugins/plugins/marko-skills/skills/create-module .claude/skills/create-module && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "create-module" agent skill from https://github.com/marko-php/marko/tree/develop/packages/claude-plugins/plugins/marko-skills/skills/create-module into .claude/skills/create-module/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-module", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/marko-php/marko/tree/develop/packages/claude-plugins/plugins/marko-skills/skills/create-moduleType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add marko-php/marko --skill create-module -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install marko-php/marko create-module --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/marko-php/marko.git skills-src && mkdir -p .agents/skills && cp -r skills-src/packages/claude-plugins/plugins/marko-skills/skills/create-module .agents/skills/create-module && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "create-module" agent skill from https://github.com/marko-php/marko/tree/develop/packages/claude-plugins/plugins/marko-skills/skills/create-module into .agents/skills/create-module/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-module", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add marko-php/marko --skill create-module -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install marko-php/marko create-module --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/marko-php/marko.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/packages/claude-plugins/plugins/marko-skills/skills/create-module .cursor/skills/create-module && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "create-module" agent skill from https://github.com/marko-php/marko/tree/develop/packages/claude-plugins/plugins/marko-skills/skills/create-module into .cursor/skills/create-module/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-module", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/marko-php/marko.git --path packages/claude-plugins/plugins/marko-skills/skills/create-module--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add marko-php/marko --skill create-module -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install marko-php/marko create-module --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/marko-php/marko.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/packages/claude-plugins/plugins/marko-skills/skills/create-module .gemini/skills/create-module && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "create-module" agent skill from https://github.com/marko-php/marko/tree/develop/packages/claude-plugins/plugins/marko-skills/skills/create-module into .gemini/skills/create-module/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-module", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install marko-php/marko create-moduleInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add marko-php/marko --skill create-module -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/marko-php/marko.git skills-src && mkdir -p .github/skills && cp -r skills-src/packages/claude-plugins/plugins/marko-skills/skills/create-module .github/skills/create-module && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "create-module" agent skill from https://github.com/marko-php/marko/tree/develop/packages/claude-plugins/plugins/marko-skills/skills/create-module into .github/skills/create-module/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-module", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add marko-php/marko --skill create-module -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install marko-php/marko create-module --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/marko-php/marko.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/packages/claude-plugins/plugins/marko-skills/skills/create-module .opencode/skills/create-module && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "create-module" agent skill from https://github.com/marko-php/marko/tree/develop/packages/claude-plugins/plugins/marko-skills/skills/create-module into .opencode/skills/create-module/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-module", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
create-moduleScaffold a new Marko module — a self-contained Composer package with composer.json, namespaced src/, and Pest tests.
Create Module is an agent skill from marko-php/marko. Scaffold a new Marko module — a self-contained Composer package with composer.json, namespaced src/, and Pest tests. Use this skill whenever the user asks to create, add, or scaffold a new Marko module or package. Concrete triggers: 'create a module named payment', 'scaffold an acme/blog package', 'add a new module for X', 'break this code out into its own package', 'I need a new module', 'make me a Marko module'. Marko makes no distinction between core and third-party modules: layout is identical.
Its SKILL.md is about 2.2k tokens, which your agent loads only when the skill is triggered. The skill folder holds 6 other files, including assets.
It sits in Development. It works with PHP. The repository describes itself as: The modular PHP framework. The licence is MIT.
6 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 0a400a7. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
composerFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
marko.buildgithub.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Create Module loads about 2.2k tokens when it runs. Until then it costs about 130 tokens; SKILL.md has 1,041 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from marko-php/marko at commit 0a400a7, republished under its MIT licence (© marko-php). 1,041 words, ~2,217 tokens.
.claude/skills/create-module/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.A Marko module is a Composer package that the framework auto-discovers via the extra.marko.module flag. Modules can live anywhere — app/{name}/ for application code, modules/{vendor}/{name}/ for a distributable package dropped into a host project, packages/{name}/ in the framework monorepo, or vendor/{vendor}/{name}/ once installed from Packagist. The layout is identical in every case. Directory and Composer-name segments are always lowercase; only the PHP namespace is StudlyCase.
This skill is the canonical specification for a Marko module. Do not inspect existing modules in this project to infer layout — siblings may have drifted from spec. Copy the templates from assets/ verbatim, substitute placeholders, and stop.
If the user did not give the module a name, ask for one before scaffolding anything. Do not invent a name, reuse a vendor as the name, or proceed with a placeholder.
A module's identity has two forms that must stay in sync:
modules/ → vendor/) or be symlinked with zero path rewrites.blog → Blog, my-payment → MyPayment.So the name blog yields directory blog/, Composer name …/blog, and namespace …\Blog. Lowercase module directories are correct — do not capitalize them. The casing only flips to StudlyCase in the PHP namespace and the psr-4 autoload key. (If you have seen "lowercase module names" before and assumed it was a bug, it was not: the directory is supposed to be lowercase; only the namespace is StudlyCase.)
| Tier | Directory | Composer name | Namespace | When |
|---|---|---|---|---|
| App-local | app/{name}/ | app/{name} | App\{Name} | Application code, not distributed. The vendor segment is always the literal app — there is no project-derived vendor. |
| Distributable | modules/{vendor}/{name}/ | {vendor}/{name} | {Vendor}\{Name} | A package you intend to publish or share, dropped into a host project. Two-segment, vendor-scoped. |
| Framework monorepo | packages/{name}/ | marko/{name} | Marko\{Name} | Only when working inside the Marko monorepo itself (root contains packages/core/). |
Never author into vendor/ — it is ephemeral and populated by Composer. The modules/ tier is the manual-install mirror of vendor/: same two-segment {vendor}/{name} shape, so a module can later move to vendor/ (or be symlinked) without changes.
Default tier: if the user does not specify, assume an app-local module (app/{name}/, namespace App\{Name}). Only use modules/{vendor}/{name}/ when the user signals the module is meant to be distributed/shared.
Choosing {vendor} (distributable modules only — app-local modules have no vendor): derive it from the host project's root directory name (a project in ~/Sites/acme → vendor acme). Do not read it from the project's composer.json name: a project scaffolded from marko/skeleton still carries marko/skeleton there, so the directory name is the reliable signal. Never use marko as the vendor for an application or third-party module — that vendor is reserved for packages inside the framework monorepo.
Copy the appropriate template to <module-root>/composer.json and substitute all placeholders.
Required keys: name, type: marko-module, require.marko/core, psr-4 autoload, and extra.marko.module: true to flag it for the code indexer. Never set a version field — let Composer infer it from the branch.
Resolve {{marko_constraint}} and choose the template using this ordered decision tree:
Inside the Marko monorepo (root directory contains packages/core/) → use assets/composer.json.monorepo.tmpl. Set {{marko_constraint}} to self.version. This ensures all packages in the monorepo resolve against each other at the same version without manual pinning.
Otherwise (host project / standalone module) → use assets/composer.json.tmpl. Determine {{marko_constraint}} by reading the host project's root composer.json:
marko/* constraint that is already declared (e.g. "marko/framework": "*" → constraint is *; "marko/framework": "dev-develop" → constraint is dev-develop; "marko/framework": "^1.2" → constraint is ^1.2).marko/* constraint is present in the host composer.json, default to *.Using * (or matching the host's existing constraint) ensures the scaffolded module resolves against whatever version of Marko the host project is consuming — whether that is a tagged release, a dev-develop branch alias, or a Composer path symlink. Never default to ^1.0: that constraint is incompatible with any host consuming dev-develop or *, which is the most common case during active development (e.g. marko/skeleton requires marko/framework: *).
{module-root}/
composer.json
src/ # PSR-4 source
tests/
Pest.php # Pest bootstrap
Unit/
Feature/
README.md # Slim pointer per docs/DOCS-STANDARDS.mdCopy assets/Pest.php.tmpl to tests/Pest.php. No placeholder substitution needed.
module.php is optional. Only create it if the module needs explicit DI bindings (interface → concrete class wiring), singleton declarations, or boot callbacks for lifecycle hooks.
If the module is just classes that auto-resolve, omit module.php entirely. Do not create an empty manifest.
When you do need it, copy assets/module.php.tmpl to <module-root>/module.php and substitute {{Vendor}} and {{Name}} placeholders.
Copy assets/README.md.tmpl to <module-root>/README.md and substitute {{vendor}} and {{name}} placeholders.
Per docs/DOCS-STANDARDS.md, package READMEs are slim pointers — title, install command, one quick example, and a link to the full docs page. Substantive documentation belongs in docs/src/content/docs/packages/{name}.md, not the README.
The module exists because you wrote it. The runtime discovers and autoloads it live on the next request — no composer dump-autoload, no index rebuild, no extra registration step. The MCP/LSP index self-refreshes (scoped to app/ and modules/), so list_modules and validate_module will reflect freshly created code automatically.
If you want to double-check structure, confirm:
composer.json has extra.marko.module: trueYou may call list_modules or validate_module as an optional cross-check, but these are not gates — the module is live as soon as the files are in place.
After writing files, expect LSP diagnostics from marko-lsp to surface in the same turn. Resolve all diagnostics before declaring the module complete — diagnostics are the verification gate, not optional warnings. Calling list_modules is an optional cross-check to confirm the MCP index reflects the new module; it is not required for the module to be active.
declare(strict_types=1);final classes (blocks Preferences extensibility)readonly where immutability is appropriate, not as a blanket rulemarko-create-plugin skillmarko/database package docs© marko-php, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 5 other files (assets) in packages/claude-plugins/plugins/marko-skills/skills/create-module of marko-php/marko.
Open the folder on GitHubat commit 0a400a7
Create Module next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Create Module this skillmarko-php/marko | 397 | — | ~2.2k | Automated safety check: Pass | MIT | |
| WooCommerce Code Reviewwoocommerce/woocommerce | 11k | 3 repos | ~1.1k | Automated safety check: Pass | Custom licence | |
| Skill Doli Code ReviewDolibarr/dolibarr | 7.7k | 1 repos | ~1.1k | Automated safety check: Pass | MIT | |
| Bug Triagesymfony/symfony | 31k | — | ~1.9k | Automated safety check: Pass | MIT | |
| Merge Upsymfony/symfony | 31k | — | ~4k | Automated safety check: Pass | MIT | |
| PR Mergesymfony/symfony | 31k | — | ~3.1k | Automated safety check: Pass | MIT |
woocommerce/woocommerce
Reviews WooCommerce code changes against the project's standards, flagging backend PHP architecture, naming, documentation, data integrity and testing violations.
Dolibarr/dolibarr
Reviews Dolibarr PHP code for compliance with coding standards and security best practices, and fixes identified issues.
symfony/symfony
Decide whether open Bug PRs target the correct branch. An agent skill from symfony/symfony.
symfony/symfony
Cascade-merge maintained Symfony branches from oldest to newest (e.g.
symfony/symfony
Merge a reviewed pull request the way the Symfony core team does: one --no-ff merge commit per PR, whose message archives the whole discussion, with the review gates checked first.
Automattic/agent-skills
A skill your agent uses when building or debugging WordPress Interactivity API features (data-wp- directives, @wordpress/interactivity store/state/actions, block viewScriptModule integration…
marko-php/marko
Create a Marko plugin — a class that intercepts methods on another class to modify behavior without subclassing.
marko-php/marko
Cut a new Marko release. An agent skill from marko-php/marko.
Works with
Categories
Scaffold a new Marko module — a self-contained Composer package with composer.json, namespaced src/, and Pest tests. Create Module is an agent skill from marko-php/marko.json, namespaced src/, and Pest tests.
Create Module fits situations like: the user asks to create; scaffold a new Marko module.
Run `npx skills add marko-php/marko --skill create-module -a claude-code`. Or copy the skill folder (packages/claude-plugins/plugins/marko-skills/skills/create-module in marko-php/marko) into .claude/skills/create-module in your project. Claude Code loads it when a task matches its description.
Run `npx skills add marko-php/marko --skill create-module -a codex`. Or copy the skill folder (packages/claude-plugins/plugins/marko-skills/skills/create-module in marko-php/marko) into .agents/skills/create-module in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add marko-php/marko --skill create-module -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/create-module, .gemini/skills/create-module, .github/skills/create-module and .opencode/skills/create-module in your project.
Going by SKILL.md and its folder, Create Module needs the command-line tools its instructions call (composer).
SKILL.md names 2 domains. As links in the text: marko.build and github.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Create Module is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.2k tokens (SKILL.md is roughly 8.9k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Create Module: WooCommerce Code Review (woocommerce/woocommerce, 11k stars), Skill Doli Code Review (Dolibarr/dolibarr, 7.7k stars), Bug Triage (symfony/symfony, 31k stars) and Merge Up (symfony/symfony, 31k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
marko-php (a GitHub organization) maintains it in marko-php/marko, which has 397 GitHub stars. The repository holds 3 skills in this directory. The repository was last updated on October 6, 2026.
Source: marko-php/marko on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.