create-cqrs-commands — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited create-cqrs-commands (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
This skill creates the entire domain layer for an entity. It covers the Core side only (interfaces and data objects) — handler implementations live in implement-cqrs-handlers.
Read CQRS/CONTEXT.md for conventions (scalar inputs/VO getters, exception hierarchy, handler rules).
Create src/Core/Domain/{Domain}/ValueObject/{Domain}Id.php:
int $value, validates $value > 0, throws {Domain}Exception if notgetValue(): intReference: src/Core/Domain/Tax/ValueObject/TaxId.php (simple), src/Core/Domain/Carrier/ValueObject/CarrierId.php (complex domain)
For fields with non-trivial validation or domain meaning (not just string/int):
fromInt()/fromString() factoryNot every field needs a VO — only those with invariants beyond primitive type checking.
For has-many relations, create typed collections implementing \Countable and \IteratorAggregate.
Create in src/Core/Domain/{Domain}/Exception/ following the hierarchy documented in CQRS/CONTEXT.md: base, not-found, per-action, and constraint classes.
Reference: src/Core/Domain/Tax/Exception/ (simple), src/Core/Domain/Carrier/Exception/ (many constraint codes)
All commands live in src/Core/Domain/{Domain}/Command/.
Add{Domain}Command.php:
array $localizedValues keyed by language IDReference: src/Core/Domain/Tax/Command/AddTaxCommand.php (simple), src/Core/Domain/Carrier/Command/AddCarrierCommand.php (many fields)
Edit{Domain}Command.php — follows the partial-update pattern from CQRS/CONTEXT.md:
int)private ?Type $field = nullpublic function setName(string $name): self { $this->name = $name; return $this; }public function getName(): ?string { return $this->name; }Reference: src/Core/Domain/Tax/Command/EditTaxCommand.php (simple), src/Core/Domain/Manufacturer/Command/EditManufacturerCommand.php (with image)
Delete{Domain}Command.php:
int $id (scalar)getId(): {Domain}IdToggle{Domain}StatusCommand.php (if entity has an active/enabled boolean):
int $id and optionally bool $expectedStatus$expectedStatus if providedSet{Domain}{SubResource}sCommand.php — one command per sub-resource type:
int $id and the full replacement collection (as array of scalars)Reference: src/Core/Domain/Carrier/Command/SetCarrierRangesCommand.php
Any domain action that doesn't fit CRUD follows the same pattern: a command class with scalar constructor parameters and getters. The naming convention is {Verb}{Domain}Command.php.
Create in src/Core/Domain/{Domain}/CommandHandler/:
Add{Domain}HandlerInterface, Edit{Domain}HandlerInterface, etc.public function handle({Action}{Domain}Command $command): voidAdd{Domain}HandlerInterface::handle() returns {Domain}Id (the new entity's ID)voidThe concrete implementations live in src/Adapter/{Domain}/CommandHandler/ (see implement-cqrs-handlers skill).
For abstractions that cross the Core/Adapter boundary beyond the repository:
{Domain}LogoFileUploaderInterface in Core, implemented in AdapterAll conventions (scalar inputs/VO getters, exception hierarchy, handler rules) are in CQRS/CONTEXT.md. Skill-specific reminders:
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.