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.
Maintain Part domain models — fillable attributes, mutators, typed nested data, save/fetch behavior, permission checks, PHPDoc, and repository bindings.
$ npx skills add discord-php/DiscordPHP --skill part-model-maintainer -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install discord-php/DiscordPHP part-model-maintainer --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/discord-php/DiscordPHP.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/part-model-maintainer .claude/skills/part-model-maintainer && 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 "part-model-maintainer" agent skill from https://github.com/discord-php/DiscordPHP/tree/master/.agents/skills/part-model-maintainer into .claude/skills/part-model-maintainer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "part-model-maintainer", 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/discord-php/DiscordPHP/tree/master/.agents/skills/part-model-maintainerType 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 discord-php/DiscordPHP --skill part-model-maintainer -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install discord-php/DiscordPHP part-model-maintainer --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/discord-php/DiscordPHP.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/part-model-maintainer .agents/skills/part-model-maintainer && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "part-model-maintainer" agent skill from https://github.com/discord-php/DiscordPHP/tree/master/.agents/skills/part-model-maintainer into .agents/skills/part-model-maintainer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "part-model-maintainer", 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 discord-php/DiscordPHP --skill part-model-maintainer -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install discord-php/DiscordPHP part-model-maintainer --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/discord-php/DiscordPHP.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/part-model-maintainer .cursor/skills/part-model-maintainer && 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 "part-model-maintainer" agent skill from https://github.com/discord-php/DiscordPHP/tree/master/.agents/skills/part-model-maintainer into .cursor/skills/part-model-maintainer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "part-model-maintainer", 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/discord-php/DiscordPHP.git --path .agents/skills/part-model-maintainer--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 discord-php/DiscordPHP --skill part-model-maintainer -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install discord-php/DiscordPHP part-model-maintainer --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/discord-php/DiscordPHP.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/part-model-maintainer .gemini/skills/part-model-maintainer && 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 "part-model-maintainer" agent skill from https://github.com/discord-php/DiscordPHP/tree/master/.agents/skills/part-model-maintainer into .gemini/skills/part-model-maintainer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "part-model-maintainer", 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 discord-php/DiscordPHP part-model-maintainerInstalls 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 discord-php/DiscordPHP --skill part-model-maintainer -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/discord-php/DiscordPHP.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/part-model-maintainer .github/skills/part-model-maintainer && 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 "part-model-maintainer" agent skill from https://github.com/discord-php/DiscordPHP/tree/master/.agents/skills/part-model-maintainer into .github/skills/part-model-maintainer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "part-model-maintainer", 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 discord-php/DiscordPHP --skill part-model-maintainer -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install discord-php/DiscordPHP part-model-maintainer --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/discord-php/DiscordPHP.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/part-model-maintainer .opencode/skills/part-model-maintainer && 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 "part-model-maintainer" agent skill from https://github.com/discord-php/DiscordPHP/tree/master/.agents/skills/part-model-maintainer into .opencode/skills/part-model-maintainer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "part-model-maintainer", 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.
part-model-maintainerMaintain Part domain models — fillable attributes, mutators, typed nested data, save/fetch behavior, permission checks, PHPDoc, and repository bindings.
Part Model Maintainer is an agent skill from discord-php/DiscordPHP. Maintain Part domain models — fillable attributes, mutators, typed nested data, save/fetch behavior, permission checks, PHPDoc, and repository bindings. Use when adding or modifying any Discord Part class.
Its SKILL.md is about 3.4k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Development. It works with Discord and PHP. The repository describes itself as: An API to interact with the popular messaging app Discord. The licence is MIT.
5 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 580c66a. 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.
No scripts in the folder and no shell commands in SKILL.md.
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From 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.
Part Model Maintainer loads about 3.4k tokens when it runs. Until then it costs about 57 tokens; SKILL.md has 1,734 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 discord-php/DiscordPHP at commit 580c66a, republished under its MIT licence (© discord-php). 1,734 words, ~3,374 tokens.
.claude/skills/part-model-maintainer/SKILL.md (or your agent's skills folder).Use this skill when work touches src/Discord/Parts/**/*.
This is not syntax guard. This is domain-model guard. Load it when changing what a Discord resource is, how it is hydrated, how it exposes related objects, or how it saves itself.
Keep Part classes as the canonical in-memory representation of Discord resources:
src/Discord/Parts/Part.phpsrc/Discord/Parts/PartTrait.phpsrc/Discord/Parts/Guild/Guild.phpsrc/Discord/Parts/Channel/Channel.phpsrc/Discord/Parts/Channel/Message/Message.phpsrc/Discord/Parts/User/User.phpsrc/Discord/Parts/Guild/Member/Member.phpsrc/Discord/Parts/Channel/Thread/Thread.phpsrc/Discord/Parts/Interactions/Interaction.phpDo not start from a random leaf class alone. PartTrait defines most real behavior.
Every real part sits on same base contract:
Discord\Parts\PartPartTrait(Discord $discord, array $attributes = [], bool $created = false)$attributes$fillable$repositoriesget{Studly}Attribute()set{Studly}Attribute()getRepository() + save()If change breaks one of those assumptions, stop and re-check layer ownership.
$fillableWhitelist for fill() and dynamic writes. If field is missing here:
$part->field = ... writes do not persist to $attributesWhen adding new API field, first ask: should this be part of canonical stored state? If yes, add it to $fillable.
$attributesRaw storage. Usually snake_case and Discord-shaped. Avoid putting derived state here unless the API itself uses that field.
$repositoriesMap of magic property name to repository class. This is how parts expose child collections like:
$guild->channels$channel->messages$message->reactionsIf child data should behave like a repository, wire it here. Do not fake repo behavior with arrays.
$createdTracks whether part already exists on Discord side.
false means local draft or partial unsaved objecttrue means known remote objectRepository save() uses this to choose POST vs PATCH. Nested createOf() links child created state back to parent. Preserve that when materializing nested parts.
fill(array $attributes)Hydrates only fillable keys. It is not "dump every payload field in object". If new data is not appearing after fetch/event handling, check $fillable first.
getAttribute() / __get()Resolution order matters:
$repositoriesnullThis is why magic properties can expose both repositories and computed values. Preserve this behavior when adding convenience fields.
__isset() / offsetExists()Both return getAttribute($key) !== null, so isset(), empty() and ?? agree with __get(). Repositories and mutators count, and a computed relation such as guild is set only while it resolves. Collection::get($attr, $value) relies on this to match parts by any attribute. Inside a part, isset($this->guild_id) reads through the mutator too; use isset($this->attributes['x']) only when you mean the raw payload key. Do not call isset($this->x) from getXAttribute() itself: PHP's recursion guard makes that inner check false.
setAttribute() / __set()Setter mutator first, then raw write only if key is fillable. This protects parts from accidental shape drift. Do not bypass it by writing stray protected properties for true resource state.
getCreatableAttributes() / getUpdatableAttributes()These define what the repository sends to Discord. They are not debug dumps. They should express API intent:
Prefer makeOptionalAttributes() to avoid serializing absent optional fields.
getRepository()Returns the owning repository for this part instance. This is frequently context-sensitive:
Guild returns top-level $discord->guildsChannel chooses guild channels vs private channelsMessage chooses channel messages vs webhook messagesMember depends on guild_idThread depends on parent channelWhen repository ownership depends on parent IDs, also inspect getRepositoryAttributes().
save(?string $reason = null)Part-level save() is where high-level semantic guards live:
Rule: if logic needs knowledge of what operation means, it likely belongs here. If logic only knows how to execute REST+cache, it belongs in repository.
fetch()Only override when part can be refreshed independently from Discord and that contract is meaningful. If part is not fetchable, default runtime exception is fine.
attributeCarbonHelper($key)Use for timestamp-ish fields. Keeps repeated Carbon::parse logic out of concrete parts.
attributePartHelper($key, $class, $extraData = [])Use when field is a nested Discord object and you want lazy typed hydration with caching in $attributes.
Good for:
UserGuildMessageattributeCollectionHelper($key, $class, ?string $discrim = 'id', ?array $extraData = [])Use for homogeneous nested collections of one concrete part type.
attributeTypedCollectionHelper($class, $key)Use when payload element type decides subclass at runtime. This is important for:
TYPES mapscreateOf(string $class, array|object $data)Prefer this over raw factory calls for nested child parts because it preserves created linkage.
Common pair:
guild_id, channel_id, owner_idguild, channel, ownerKeep both if the API provides IDs and the library benefits from relation convenience.
Large resource parts publish Discord enum values and flags as class constants. Keep aliases when the project already supports deprecated constant names for compatibility.
If behavior applies horizontally across siblings, prefer trait:
ChannelTraitGuildTraitDo not introduce a new intermediate abstract class unless there is truly no cleaner trait shape.
Update class docblock whenever you add:
If code and docblock drift, IDE help and generated reference docs drift too.
When making a part persistable or changing save behavior:
getCreatableAttributes()getUpdatableAttributes()getRepository()save()getRepositoryAttributes()Channel::save() handles guild permission checks and group-DM special case before repository delegationMessage::save() handles send/manage permissions and webhook message routingMember::save() handles current-member special route instead of generic repository saveThread::save() blocks unsupported creation path and redirects callers to Channel::startThread()When new Discord payload includes nested object:
Part type for it$fillableextraDataDo not leave meaningful nested objects as raw arrays if equivalent typed part exists.
When child repository routes depend on parent context:
$repositories$attributesgetRepositoryAttributes() when raw $attributes is not enough or not in right shape$vars assumptionsExamples:
guild_id and channel_idchannel_id, maybe guild_id, maybe webhook contextguild_idWhen a payload is an existing part's object plus a few fields, extend that part rather than copying its fields or adding the extras to it. Example: the GAME_DIRECT_MESSAGE_* payload is Discord's message object with the DM channel attached, so GameDirectMessage extends Message.
$fillable in the constructor before parent::__construct(), so the subclass keeps up as the parent gains fields.Message::getChannelAttribute() returns Part because a guild message's channel may be a Thread, which extends Part, not Channel. A game DM's channel is only a DM or GroupDM, so GameDirectMessage::getChannelAttribute() returns Channel.return parent::method() when the parent's declared type is broader;TYPES map that also holds types outside it (Channel::TYPES maps thread types to Thread subclasses). Choose from the subset, falling back to one of its members.reject(new \BadMethodCallException(...)), naming the method and what to use instead, rather than sending a request Discord will refuse or throwing synchronously;false from boolean guards such as isDeletable();Stop if you see:
$fillable instead of merging its extra keys$fillablesave() building raw endpoints even though repository exists$attributesgetRepositoryAttributes() supportTYPES map or typed collection helper path$fillable matches intended canonical fields$repositories updated if new child collection exposedgetCreatableAttributes() / getUpdatableAttributes() express API semanticsgetRepository() and getRepositoryAttributes() route correctlysave() enforces semantic permission or special-case behavior when neededPart classes in this repo are not dumb DTOs and not service objects. They are typed, lazily-resolved domain resources with controlled hydration and repository-backed persistence. Keep them centered on that job.
© discord-php, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/part-model-maintainer of discord-php/DiscordPHP.
Open the folder on GitHubat commit 580c66a
Part Model Maintainer 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 |
|---|---|---|---|---|---|---|
| Part Model Maintainer this skilldiscord-php/DiscordPHP | 1.1k | — | ~3.4k | 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 | |
| Wp Interactivity APIAutomattic/agent-skills | 211 | 3 repos | ~1.5k | Automated safety check: Pass | None |
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.
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…
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.
discord-php/DiscordPHP
Maintain test and documentation alignment — PHPUnit tests, async testing patterns, PHPDoc contracts, guide pages, and documentation workflow.
discord-php/DiscordPHP
Audit checklist for DiscordPHP bots and API libraries — stop the bot token leaking to third-party APIs or logs, keep secrets out of customids and exception messages, use constant-time comparison and…
discord-php/DiscordPHP
Scaffold and maintain a DiscordPHP-based bot or an API-library-on-DiscordPHP (the DiscordPHP-MTG / DiscordPHP-NHA / DiscordPHP-Sabacc pattern) — client subclass, third-party HTTP layer, Parts…
discord-php/DiscordPHP
Build DiscordPHP slash commands and message components — global command trees with subcommands, user- AND guild-installable commands usable in DMs / group DMs / guild channels, Components V2…
discord-php/DiscordPHP
Work with DiscordPHP's infrastructure utilities — CacheWrapper, CacheConfig, BigInt, Multipart, Endpoint::bind URL templates, Collection base class, and domain Exceptions.
discord-php/DiscordPHP
Maintain Discord.php runtime bootstrapping, startup options, event loop, gateway connection, reconnection, member chunking, cache configuration, and process lifecycle.
Categories
Maintain Part domain models — fillable attributes, mutators, typed nested data, save/fetch behavior, permission checks, PHPDoc, and repository bindings. Part Model Maintainer is an agent skill from discord-php/DiscordPHP. Maintain Part domain models — fillable attributes, mutators, typed nested data, save/fetch behavior, permission checks, PHPDoc, and repository bindings.
Part Model Maintainer fits situations like: modifying any Discord Part class.
Run `npx skills add discord-php/DiscordPHP --skill part-model-maintainer -a claude-code`. Or copy the skill folder (.agents/skills/part-model-maintainer in discord-php/DiscordPHP) into .claude/skills/part-model-maintainer in your project. Claude Code loads it when a task matches its description.
Run `npx skills add discord-php/DiscordPHP --skill part-model-maintainer -a codex`. Or copy the skill folder (.agents/skills/part-model-maintainer in discord-php/DiscordPHP) into .agents/skills/part-model-maintainer 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 discord-php/DiscordPHP --skill part-model-maintainer -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/part-model-maintainer, .gemini/skills/part-model-maintainer, .github/skills/part-model-maintainer and .opencode/skills/part-model-maintainer in your project.
SKILL.md names no scripts, command-line tools or credentials: Part Model Maintainer is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. 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.
Part Model Maintainer is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.4k tokens (SKILL.md is roughly 13k 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 Part Model Maintainer: 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.
discord-php (a GitHub organization) maintains it in discord-php/DiscordPHP, which has 1,080 GitHub stars. The repository holds 14 skills in this directory. The repository was last updated on October 6, 2026.
Source: discord-php/DiscordPHP on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.