From e04a5304f7f7ad94532fe826bdc57ac34fc2ee78 Mon Sep 17 00:00:00 2001 From: Jan-Niclas Loosen Date: Sat, 26 Sep 2026 18:33:14 +0200 Subject: [PATCH] refactor: annotation presets (L5) The 41 abilities return Annotations::read(), ::write(idempotent) or ::destructive(idempotent) instead of hand-written arrays (same arrays, same key order). Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01At3V6SjwbMe6eMzVGW3Hs7 --- src/Abilities/Annotations.php | 31 +++++++++++++++++++ src/Integrations/Core/GuideAbility.php | 3 +- src/Integrations/Core/SiteStatusAbility.php | 3 +- .../Divi/Design/DiviDesignSystemAbility.php | 3 +- .../Divi/Pages/DiviDeleteAbility.php | 3 +- .../Divi/Pages/DiviDuplicateNodeAbility.php | 3 +- .../Divi/Pages/DiviInsertAbility.php | 3 +- .../Divi/Pages/DiviMoveAbility.php | 3 +- .../Divi/Pages/DiviNodeGetAbility.php | 3 +- .../Divi/Pages/DiviOutlineAbility.php | 3 +- .../Divi/Pages/DiviReplaceTextAbility.php | 3 +- .../Divi/Pages/DiviUpdateAbility.php | 3 +- .../Divi/Schema/DiviCatalogAbility.php | 3 +- src/Integrations/Media/MediaDeleteAbility.php | 3 +- .../Media/MediaDownloadAbility.php | 3 +- src/Integrations/Media/MediaGetAbility.php | 3 +- .../Media/MediaPreviewAbility.php | 3 +- src/Integrations/Media/MediaSearchAbility.php | 3 +- src/Integrations/Media/MediaUpdateAbility.php | 3 +- src/Integrations/Media/MediaUploadAbility.php | 3 +- .../Media/MediaUploadFromUrlAbility.php | 3 +- .../Content/ContentCreateAbility.php | 3 +- .../WordPress/Content/ContentGetAbility.php | 3 +- .../WordPress/Content/ContentQueryAbility.php | 3 +- .../WordPress/Content/ContentTypesAbility.php | 3 +- .../Content/ContentUpdateAbility.php | 3 +- .../Menus/MenuAssignLocationAbility.php | 3 +- .../WordPress/Menus/MenuCreateAbility.php | 3 +- .../WordPress/Menus/MenuGetAbility.php | 3 +- .../WordPress/Menus/MenuListAbility.php | 3 +- .../WordPress/Menus/MenuSetItemsAbility.php | 3 +- .../Render/PageRenderSummaryAbility.php | 3 +- .../Revisions/RevisionRestoreAbility.php | 3 +- .../Revisions/RevisionsListAbility.php | 3 +- .../Settings/WpSettingsGetAbility.php | 3 +- .../Settings/WpSettingsUpdateAbility.php | 3 +- .../WordPress/Status/PostDuplicateAbility.php | 3 +- .../WordPress/Status/PostPublishAbility.php | 3 +- .../Status/PostReplaceWithCopyAbility.php | 3 +- .../WordPress/Status/PostScheduleAbility.php | 3 +- .../WordPress/Status/PostTrashAbility.php | 3 +- .../WordPress/Status/PostUnpublishAbility.php | 3 +- tests/Unit/Abilities/AnnotationsTest.php | 20 ++++++++++++ 43 files changed, 133 insertions(+), 41 deletions(-) create mode 100644 src/Abilities/Annotations.php create mode 100644 tests/Unit/Abilities/AnnotationsTest.php diff --git a/src/Abilities/Annotations.php b/src/Abilities/Annotations.php new file mode 100644 index 0000000..c7b6dbe --- /dev/null +++ b/src/Abilities/Annotations.php @@ -0,0 +1,31 @@ + true, 'destructive' => false, 'idempotent' => true]; + } + + /** @return array{readonly: bool, destructive: bool, idempotent: bool} Writes, removes or overwrites nothing. */ + public static function write(bool $idempotent): array + { + return ['readonly' => false, 'destructive' => false, 'idempotent' => $idempotent]; + } + + /** @return array{readonly: bool, destructive: bool, idempotent: bool} Removes or overwrites something. */ + public static function destructive(bool $idempotent): array + { + return ['readonly' => false, 'destructive' => true, 'idempotent' => $idempotent]; + } +} diff --git a/src/Integrations/Core/GuideAbility.php b/src/Integrations/Core/GuideAbility.php index c2bfbfc..1375f52 100644 --- a/src/Integrations/Core/GuideAbility.php +++ b/src/Integrations/Core/GuideAbility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\Core; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Abilities\Errors; use LIT\MCP\Guides\GuideRepository; use WP_Error; @@ -61,7 +62,7 @@ final class GuideAbility implements Ability public function annotations(): array { - return ['readonly' => true, 'destructive' => false, 'idempotent' => true]; + return Annotations::read(); } public function isDirect(): bool diff --git a/src/Integrations/Core/SiteStatusAbility.php b/src/Integrations/Core/SiteStatusAbility.php index fd43c2a..17adb7a 100644 --- a/src/Integrations/Core/SiteStatusAbility.php +++ b/src/Integrations/Core/SiteStatusAbility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\Core; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Access; use WP_Error; @@ -52,7 +53,7 @@ final class SiteStatusAbility implements Ability public function annotations(): array { - return ['readonly' => true, 'destructive' => false, 'idempotent' => true]; + return Annotations::read(); } public function isDirect(): bool diff --git a/src/Integrations/Divi/Design/DiviDesignSystemAbility.php b/src/Integrations/Divi/Design/DiviDesignSystemAbility.php index 76c30d5..069315d 100644 --- a/src/Integrations/Divi/Design/DiviDesignSystemAbility.php +++ b/src/Integrations/Divi/Design/DiviDesignSystemAbility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\Divi\Design; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Abilities\Errors; use WP_Error; @@ -89,7 +90,7 @@ final class DiviDesignSystemAbility implements Ability public function annotations(): array { - return ['readonly' => true, 'destructive' => false, 'idempotent' => true]; + return Annotations::read(); } public function isDirect(): bool diff --git a/src/Integrations/Divi/Pages/DiviDeleteAbility.php b/src/Integrations/Divi/Pages/DiviDeleteAbility.php index 9dc0723..0d20133 100644 --- a/src/Integrations/Divi/Pages/DiviDeleteAbility.php +++ b/src/Integrations/Divi/Pages/DiviDeleteAbility.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\Divi\Pages; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Abilities\Errors; use LIT\MCP\Integrations\Divi\BlockTree\Block; use LIT\MCP\Integrations\Divi\BlockTree\NodeSummary; @@ -55,7 +56,7 @@ final class DiviDeleteAbility extends DiviWriteAbility public function annotations(): array { - return ['readonly' => false, 'destructive' => true, 'idempotent' => false]; + return Annotations::destructive(false); } protected function change(DiviPage $page, array $input, DiviComposition $composition): DiviChange|WP_Error diff --git a/src/Integrations/Divi/Pages/DiviDuplicateNodeAbility.php b/src/Integrations/Divi/Pages/DiviDuplicateNodeAbility.php index 47468f7..c038502 100644 --- a/src/Integrations/Divi/Pages/DiviDuplicateNodeAbility.php +++ b/src/Integrations/Divi/Pages/DiviDuplicateNodeAbility.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\Divi\Pages; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Integrations\Divi\BlockTree\AttrMap; use WP_Error; @@ -44,7 +45,7 @@ final class DiviDuplicateNodeAbility extends DiviWriteAbility public function annotations(): array { - return ['readonly' => false, 'destructive' => false, 'idempotent' => false]; + return Annotations::write(false); } public function isDirect(): bool diff --git a/src/Integrations/Divi/Pages/DiviInsertAbility.php b/src/Integrations/Divi/Pages/DiviInsertAbility.php index 2ed0250..4f46363 100644 --- a/src/Integrations/Divi/Pages/DiviInsertAbility.php +++ b/src/Integrations/Divi/Pages/DiviInsertAbility.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\Divi\Pages; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Abilities\Errors; use WP_Error; @@ -56,7 +57,7 @@ final class DiviInsertAbility extends DiviWriteAbility public function annotations(): array { - return ['readonly' => false, 'destructive' => false, 'idempotent' => false]; + return Annotations::write(false); } protected function change(DiviPage $page, array $input, DiviComposition $composition): DiviChange|WP_Error diff --git a/src/Integrations/Divi/Pages/DiviMoveAbility.php b/src/Integrations/Divi/Pages/DiviMoveAbility.php index 9addb9b..fa4d056 100644 --- a/src/Integrations/Divi/Pages/DiviMoveAbility.php +++ b/src/Integrations/Divi/Pages/DiviMoveAbility.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\Divi\Pages; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Abilities\Errors; use WP_Error; @@ -46,7 +47,7 @@ final class DiviMoveAbility extends DiviWriteAbility public function annotations(): array { - return ['readonly' => false, 'destructive' => false, 'idempotent' => false]; + return Annotations::write(false); } protected function change(DiviPage $page, array $input, DiviComposition $composition): DiviChange|WP_Error diff --git a/src/Integrations/Divi/Pages/DiviNodeGetAbility.php b/src/Integrations/Divi/Pages/DiviNodeGetAbility.php index 442d5d4..ade905a 100644 --- a/src/Integrations/Divi/Pages/DiviNodeGetAbility.php +++ b/src/Integrations/Divi/Pages/DiviNodeGetAbility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\Divi\Pages; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Abilities\Errors; use LIT\MCP\Abilities\JsonMap; use LIT\MCP\Abilities\Rev; @@ -89,7 +90,7 @@ final class DiviNodeGetAbility implements Ability public function annotations(): array { - return ['readonly' => true, 'destructive' => false, 'idempotent' => true]; + return Annotations::read(); } public function isDirect(): bool diff --git a/src/Integrations/Divi/Pages/DiviOutlineAbility.php b/src/Integrations/Divi/Pages/DiviOutlineAbility.php index bdb0b4d..ec0187d 100644 --- a/src/Integrations/Divi/Pages/DiviOutlineAbility.php +++ b/src/Integrations/Divi/Pages/DiviOutlineAbility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\Divi\Pages; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Abilities\Errors; use LIT\MCP\Abilities\Rev; use LIT\MCP\Integrations\Divi\BlockTree\NodeIndex; @@ -116,7 +117,7 @@ final class DiviOutlineAbility implements Ability public function annotations(): array { - return ['readonly' => true, 'destructive' => false, 'idempotent' => true]; + return Annotations::read(); } public function isDirect(): bool diff --git a/src/Integrations/Divi/Pages/DiviReplaceTextAbility.php b/src/Integrations/Divi/Pages/DiviReplaceTextAbility.php index 114cd41..838cd2a 100644 --- a/src/Integrations/Divi/Pages/DiviReplaceTextAbility.php +++ b/src/Integrations/Divi/Pages/DiviReplaceTextAbility.php @@ -6,6 +6,7 @@ namespace LIT\MCP\Integrations\Divi\Pages; use InvalidArgumentException; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Abilities\Cursor; use LIT\MCP\Abilities\Errors; use LIT\MCP\Abilities\ToolResult; @@ -115,7 +116,7 @@ final class DiviReplaceTextAbility implements Ability public function annotations(): array { - return ['readonly' => false, 'destructive' => true, 'idempotent' => false]; + return Annotations::destructive(false); } public function isDirect(): bool diff --git a/src/Integrations/Divi/Pages/DiviUpdateAbility.php b/src/Integrations/Divi/Pages/DiviUpdateAbility.php index 1bde452..9b2b872 100644 --- a/src/Integrations/Divi/Pages/DiviUpdateAbility.php +++ b/src/Integrations/Divi/Pages/DiviUpdateAbility.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\Divi\Pages; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Abilities\Errors; use LIT\MCP\Integrations\Divi\BlockTree\Block; use LIT\MCP\Integrations\Divi\Compose\ColumnWidths; @@ -73,7 +74,7 @@ final class DiviUpdateAbility extends DiviWriteAbility public function annotations(): array { - return ['readonly' => false, 'destructive' => false, 'idempotent' => true]; + return Annotations::write(true); } protected function change(DiviPage $page, array $input, DiviComposition $composition): DiviChange|WP_Error diff --git a/src/Integrations/Divi/Schema/DiviCatalogAbility.php b/src/Integrations/Divi/Schema/DiviCatalogAbility.php index 20dc1dd..0c50857 100644 --- a/src/Integrations/Divi/Schema/DiviCatalogAbility.php +++ b/src/Integrations/Divi/Schema/DiviCatalogAbility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\Divi\Schema; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Abilities\Errors; use LIT\MCP\Abilities\JsonMap; use WP_Error; @@ -101,7 +102,7 @@ final class DiviCatalogAbility implements Ability public function annotations(): array { - return ['readonly' => true, 'destructive' => false, 'idempotent' => true]; + return Annotations::read(); } public function isDirect(): bool diff --git a/src/Integrations/Media/MediaDeleteAbility.php b/src/Integrations/Media/MediaDeleteAbility.php index 217481f..579b727 100644 --- a/src/Integrations/Media/MediaDeleteAbility.php +++ b/src/Integrations/Media/MediaDeleteAbility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\Media; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Abilities\Errors; use LIT\MCP\Abilities\FollowUp; use LIT\MCP\Abilities\ToolResult; @@ -81,7 +82,7 @@ final class MediaDeleteAbility implements Ability public function annotations(): array { - return ['readonly' => false, 'destructive' => true, 'idempotent' => false]; + return Annotations::destructive(false); } public function isDirect(): bool diff --git a/src/Integrations/Media/MediaDownloadAbility.php b/src/Integrations/Media/MediaDownloadAbility.php index 142a24c..7b5875d 100644 --- a/src/Integrations/Media/MediaDownloadAbility.php +++ b/src/Integrations/Media/MediaDownloadAbility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\Media; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Abilities\Errors; use LIT\MCP\Limits; use WP_Error; @@ -60,7 +61,7 @@ final class MediaDownloadAbility implements Ability public function annotations(): array { - return ['readonly' => true, 'destructive' => false, 'idempotent' => true]; + return Annotations::read(); } public function isDirect(): bool diff --git a/src/Integrations/Media/MediaGetAbility.php b/src/Integrations/Media/MediaGetAbility.php index 2bbd10a..add0e5b 100644 --- a/src/Integrations/Media/MediaGetAbility.php +++ b/src/Integrations/Media/MediaGetAbility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\Media; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use WP_Error; final class MediaGetAbility implements Ability @@ -56,7 +57,7 @@ final class MediaGetAbility implements Ability public function annotations(): array { - return ['readonly' => true, 'destructive' => false, 'idempotent' => true]; + return Annotations::read(); } public function isDirect(): bool diff --git a/src/Integrations/Media/MediaPreviewAbility.php b/src/Integrations/Media/MediaPreviewAbility.php index fc5d30c..b9489f3 100644 --- a/src/Integrations/Media/MediaPreviewAbility.php +++ b/src/Integrations/Media/MediaPreviewAbility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\Media; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Abilities\Errors; use WP_Error; @@ -61,7 +62,7 @@ final class MediaPreviewAbility implements Ability public function annotations(): array { - return ['readonly' => true, 'destructive' => false, 'idempotent' => true]; + return Annotations::read(); } public function isDirect(): bool diff --git a/src/Integrations/Media/MediaSearchAbility.php b/src/Integrations/Media/MediaSearchAbility.php index c3117cf..f9b5c24 100644 --- a/src/Integrations/Media/MediaSearchAbility.php +++ b/src/Integrations/Media/MediaSearchAbility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\Media; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Abilities\Cursor; use LIT\MCP\Abilities\Errors; use LIT\MCP\Integrations\WordPress\PostGuard; @@ -81,7 +82,7 @@ final class MediaSearchAbility implements Ability public function annotations(): array { - return ['readonly' => true, 'destructive' => false, 'idempotent' => true]; + return Annotations::read(); } public function isDirect(): bool diff --git a/src/Integrations/Media/MediaUpdateAbility.php b/src/Integrations/Media/MediaUpdateAbility.php index d784f40..4c69a69 100644 --- a/src/Integrations/Media/MediaUpdateAbility.php +++ b/src/Integrations/Media/MediaUpdateAbility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\Media; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Abilities\Errors; use LIT\MCP\Abilities\FollowUp; use LIT\MCP\Abilities\Rollback; @@ -125,7 +126,7 @@ final class MediaUpdateAbility implements Ability public function annotations(): array { - return ['readonly' => false, 'destructive' => false, 'idempotent' => true]; + return Annotations::write(true); } public function isDirect(): bool diff --git a/src/Integrations/Media/MediaUploadAbility.php b/src/Integrations/Media/MediaUploadAbility.php index cb0d3c3..517a549 100644 --- a/src/Integrations/Media/MediaUploadAbility.php +++ b/src/Integrations/Media/MediaUploadAbility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\Media; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Limits; use WP_Error; @@ -69,7 +70,7 @@ final class MediaUploadAbility implements Ability public function annotations(): array { - return ['readonly' => false, 'destructive' => false, 'idempotent' => false]; + return Annotations::write(false); } public function isDirect(): bool diff --git a/src/Integrations/Media/MediaUploadFromUrlAbility.php b/src/Integrations/Media/MediaUploadFromUrlAbility.php index 7bfe6dd..9c0fc2a 100644 --- a/src/Integrations/Media/MediaUploadFromUrlAbility.php +++ b/src/Integrations/Media/MediaUploadFromUrlAbility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\Media; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use WP_Error; /** @@ -61,7 +62,7 @@ final class MediaUploadFromUrlAbility implements Ability public function annotations(): array { - return ['readonly' => false, 'destructive' => false, 'idempotent' => false]; + return Annotations::write(false); } public function isDirect(): bool diff --git a/src/Integrations/WordPress/Content/ContentCreateAbility.php b/src/Integrations/WordPress/Content/ContentCreateAbility.php index ca50a15..6f8edcd 100644 --- a/src/Integrations/WordPress/Content/ContentCreateAbility.php +++ b/src/Integrations/WordPress/Content/ContentCreateAbility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\WordPress\Content; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Abilities\Errors; use LIT\MCP\Abilities\Rev; use LIT\MCP\Abilities\ToolResult; @@ -86,7 +87,7 @@ final class ContentCreateAbility implements Ability public function annotations(): array { - return ['readonly' => false, 'destructive' => false, 'idempotent' => false]; + return Annotations::write(false); } public function isDirect(): bool diff --git a/src/Integrations/WordPress/Content/ContentGetAbility.php b/src/Integrations/WordPress/Content/ContentGetAbility.php index 86e5f69..8dc204f 100644 --- a/src/Integrations/WordPress/Content/ContentGetAbility.php +++ b/src/Integrations/WordPress/Content/ContentGetAbility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\WordPress\Content; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Integrations\WordPress\PostGuard; use LIT\MCP\Integrations\WordPress\Schema\ContentSchema; use WP_Error; @@ -49,7 +50,7 @@ final class ContentGetAbility implements Ability public function annotations(): array { - return ['readonly' => true, 'destructive' => false, 'idempotent' => true]; + return Annotations::read(); } public function isDirect(): bool diff --git a/src/Integrations/WordPress/Content/ContentQueryAbility.php b/src/Integrations/WordPress/Content/ContentQueryAbility.php index 464511e..d9c6cd9 100644 --- a/src/Integrations/WordPress/Content/ContentQueryAbility.php +++ b/src/Integrations/WordPress/Content/ContentQueryAbility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\WordPress\Content; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Abilities\Cursor; use LIT\MCP\Abilities\Errors; use LIT\MCP\Integrations\WordPress\PostGuard; @@ -100,7 +101,7 @@ final class ContentQueryAbility implements Ability public function annotations(): array { - return ['readonly' => true, 'destructive' => false, 'idempotent' => true]; + return Annotations::read(); } public function isDirect(): bool diff --git a/src/Integrations/WordPress/Content/ContentTypesAbility.php b/src/Integrations/WordPress/Content/ContentTypesAbility.php index aac7b32..ad6b268 100644 --- a/src/Integrations/WordPress/Content/ContentTypesAbility.php +++ b/src/Integrations/WordPress/Content/ContentTypesAbility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\WordPress\Content; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Abilities\Errors; use LIT\MCP\Integrations\WordPress\Schema\ContentSchema; use WP_Error; @@ -59,7 +60,7 @@ final class ContentTypesAbility implements Ability public function annotations(): array { - return ['readonly' => true, 'destructive' => false, 'idempotent' => true]; + return Annotations::read(); } public function isDirect(): bool diff --git a/src/Integrations/WordPress/Content/ContentUpdateAbility.php b/src/Integrations/WordPress/Content/ContentUpdateAbility.php index ee1a429..7bd0bc7 100644 --- a/src/Integrations/WordPress/Content/ContentUpdateAbility.php +++ b/src/Integrations/WordPress/Content/ContentUpdateAbility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\WordPress\Content; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Abilities\Errors; use LIT\MCP\Abilities\Rev; use LIT\MCP\Abilities\Rollback; @@ -89,7 +90,7 @@ final class ContentUpdateAbility implements Ability public function annotations(): array { - return ['readonly' => false, 'destructive' => false, 'idempotent' => true]; + return Annotations::write(true); } public function isDirect(): bool diff --git a/src/Integrations/WordPress/Menus/MenuAssignLocationAbility.php b/src/Integrations/WordPress/Menus/MenuAssignLocationAbility.php index 138aac1..1629e51 100644 --- a/src/Integrations/WordPress/Menus/MenuAssignLocationAbility.php +++ b/src/Integrations/WordPress/Menus/MenuAssignLocationAbility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\WordPress\Menus; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Abilities\Errors; use LIT\MCP\Abilities\FollowUp; use LIT\MCP\Abilities\ToolResult; @@ -64,7 +65,7 @@ final class MenuAssignLocationAbility implements Ability public function annotations(): array { - return ['readonly' => false, 'destructive' => true, 'idempotent' => true]; + return Annotations::destructive(true); } public function isDirect(): bool diff --git a/src/Integrations/WordPress/Menus/MenuCreateAbility.php b/src/Integrations/WordPress/Menus/MenuCreateAbility.php index 996f8a5..d87eaf1 100644 --- a/src/Integrations/WordPress/Menus/MenuCreateAbility.php +++ b/src/Integrations/WordPress/Menus/MenuCreateAbility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\WordPress\Menus; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Abilities\Errors; use LIT\MCP\Abilities\FollowUp; use LIT\MCP\Abilities\ToolResult; @@ -57,7 +58,7 @@ final class MenuCreateAbility implements Ability public function annotations(): array { - return ['readonly' => false, 'destructive' => false, 'idempotent' => false]; + return Annotations::write(false); } public function isDirect(): bool diff --git a/src/Integrations/WordPress/Menus/MenuGetAbility.php b/src/Integrations/WordPress/Menus/MenuGetAbility.php index 44754c6..ef7df51 100644 --- a/src/Integrations/WordPress/Menus/MenuGetAbility.php +++ b/src/Integrations/WordPress/Menus/MenuGetAbility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\WordPress\Menus; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Abilities\Errors; use LIT\MCP\Abilities\Rev; use WP_Error; @@ -64,7 +65,7 @@ final class MenuGetAbility implements Ability public function annotations(): array { - return ['readonly' => true, 'destructive' => false, 'idempotent' => true]; + return Annotations::read(); } public function isDirect(): bool diff --git a/src/Integrations/WordPress/Menus/MenuListAbility.php b/src/Integrations/WordPress/Menus/MenuListAbility.php index 66b89fd..4cb51eb 100644 --- a/src/Integrations/WordPress/Menus/MenuListAbility.php +++ b/src/Integrations/WordPress/Menus/MenuListAbility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\WordPress\Menus; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Abilities\Errors; use WP_Error; @@ -49,7 +50,7 @@ final class MenuListAbility implements Ability public function annotations(): array { - return ['readonly' => true, 'destructive' => false, 'idempotent' => true]; + return Annotations::read(); } public function isDirect(): bool diff --git a/src/Integrations/WordPress/Menus/MenuSetItemsAbility.php b/src/Integrations/WordPress/Menus/MenuSetItemsAbility.php index e9dbc2c..4a97e91 100644 --- a/src/Integrations/WordPress/Menus/MenuSetItemsAbility.php +++ b/src/Integrations/WordPress/Menus/MenuSetItemsAbility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\WordPress\Menus; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Abilities\Errors; use LIT\MCP\Abilities\FollowUp; use LIT\MCP\Abilities\Rev; @@ -124,7 +125,7 @@ final class MenuSetItemsAbility implements Ability public function annotations(): array { - return ['readonly' => false, 'destructive' => true, 'idempotent' => false]; + return Annotations::destructive(false); } public function isDirect(): bool diff --git a/src/Integrations/WordPress/Render/PageRenderSummaryAbility.php b/src/Integrations/WordPress/Render/PageRenderSummaryAbility.php index c05f8c6..f4f8ab6 100644 --- a/src/Integrations/WordPress/Render/PageRenderSummaryAbility.php +++ b/src/Integrations/WordPress/Render/PageRenderSummaryAbility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\WordPress\Render; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Integrations\WordPress\PostGuard; use LIT\MCP\Integrations\WordPress\Schema\ContentSchema; use WP_Error; @@ -70,7 +71,7 @@ final class PageRenderSummaryAbility implements Ability public function annotations(): array { - return ['readonly' => true, 'destructive' => false, 'idempotent' => true]; + return Annotations::read(); } public function isDirect(): bool diff --git a/src/Integrations/WordPress/Revisions/RevisionRestoreAbility.php b/src/Integrations/WordPress/Revisions/RevisionRestoreAbility.php index ac4909a..6545f3c 100644 --- a/src/Integrations/WordPress/Revisions/RevisionRestoreAbility.php +++ b/src/Integrations/WordPress/Revisions/RevisionRestoreAbility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\WordPress\Revisions; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Abilities\Errors; use LIT\MCP\Abilities\Rev; use LIT\MCP\Abilities\ToolResult; @@ -74,7 +75,7 @@ final class RevisionRestoreAbility implements Ability public function annotations(): array { - return ['readonly' => false, 'destructive' => true, 'idempotent' => true]; + return Annotations::destructive(true); } public function isDirect(): bool diff --git a/src/Integrations/WordPress/Revisions/RevisionsListAbility.php b/src/Integrations/WordPress/Revisions/RevisionsListAbility.php index cab1380..c1e705a 100644 --- a/src/Integrations/WordPress/Revisions/RevisionsListAbility.php +++ b/src/Integrations/WordPress/Revisions/RevisionsListAbility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\WordPress\Revisions; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Abilities\Cursor; use LIT\MCP\Integrations\WordPress\Content\PostPresenter; use LIT\MCP\Integrations\WordPress\PostGuard; @@ -88,7 +89,7 @@ final class RevisionsListAbility implements Ability public function annotations(): array { - return ['readonly' => true, 'destructive' => false, 'idempotent' => true]; + return Annotations::read(); } public function isDirect(): bool diff --git a/src/Integrations/WordPress/Settings/WpSettingsGetAbility.php b/src/Integrations/WordPress/Settings/WpSettingsGetAbility.php index 822c0f7..76b8e19 100644 --- a/src/Integrations/WordPress/Settings/WpSettingsGetAbility.php +++ b/src/Integrations/WordPress/Settings/WpSettingsGetAbility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\WordPress\Settings; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Abilities\Errors; use WP_Error; @@ -65,7 +66,7 @@ final class WpSettingsGetAbility implements Ability public function annotations(): array { - return ['readonly' => true, 'destructive' => false, 'idempotent' => true]; + return Annotations::read(); } public function isDirect(): bool diff --git a/src/Integrations/WordPress/Settings/WpSettingsUpdateAbility.php b/src/Integrations/WordPress/Settings/WpSettingsUpdateAbility.php index 761f674..4e8941a 100644 --- a/src/Integrations/WordPress/Settings/WpSettingsUpdateAbility.php +++ b/src/Integrations/WordPress/Settings/WpSettingsUpdateAbility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\WordPress\Settings; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Abilities\Errors; use LIT\MCP\Abilities\FollowUp; use LIT\MCP\Abilities\JsonMap; @@ -71,7 +72,7 @@ final class WpSettingsUpdateAbility implements Ability public function annotations(): array { - return ['readonly' => false, 'destructive' => false, 'idempotent' => true]; + return Annotations::write(true); } public function isDirect(): bool diff --git a/src/Integrations/WordPress/Status/PostDuplicateAbility.php b/src/Integrations/WordPress/Status/PostDuplicateAbility.php index ccda8d1..15cbc2a 100644 --- a/src/Integrations/WordPress/Status/PostDuplicateAbility.php +++ b/src/Integrations/WordPress/Status/PostDuplicateAbility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\WordPress\Status; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Abilities\ToolResult; use LIT\MCP\ChangeLog\ChangeLog; use LIT\MCP\Integrations\WordPress\PostSaveFollowUp; @@ -62,7 +63,7 @@ final class PostDuplicateAbility implements Ability public function annotations(): array { - return ['readonly' => false, 'destructive' => false, 'idempotent' => false]; + return Annotations::write(false); } public function isDirect(): bool diff --git a/src/Integrations/WordPress/Status/PostPublishAbility.php b/src/Integrations/WordPress/Status/PostPublishAbility.php index 1f8d27a..398d100 100644 --- a/src/Integrations/WordPress/Status/PostPublishAbility.php +++ b/src/Integrations/WordPress/Status/PostPublishAbility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\WordPress\Status; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Abilities\Errors; use LIT\MCP\Abilities\Rev; use LIT\MCP\Abilities\ToolResult; @@ -59,7 +60,7 @@ final class PostPublishAbility implements Ability public function annotations(): array { - return ['readonly' => false, 'destructive' => false, 'idempotent' => true]; + return Annotations::write(true); } public function isDirect(): bool diff --git a/src/Integrations/WordPress/Status/PostReplaceWithCopyAbility.php b/src/Integrations/WordPress/Status/PostReplaceWithCopyAbility.php index 6941c92..8917ebb 100644 --- a/src/Integrations/WordPress/Status/PostReplaceWithCopyAbility.php +++ b/src/Integrations/WordPress/Status/PostReplaceWithCopyAbility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\WordPress\Status; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Abilities\Errors; use LIT\MCP\Abilities\FollowUp; use LIT\MCP\Abilities\Rev; @@ -94,7 +95,7 @@ final class PostReplaceWithCopyAbility implements Ability public function annotations(): array { - return ['readonly' => false, 'destructive' => true, 'idempotent' => false]; + return Annotations::destructive(false); } public function isDirect(): bool diff --git a/src/Integrations/WordPress/Status/PostScheduleAbility.php b/src/Integrations/WordPress/Status/PostScheduleAbility.php index 46223ff..9e0d5b3 100644 --- a/src/Integrations/WordPress/Status/PostScheduleAbility.php +++ b/src/Integrations/WordPress/Status/PostScheduleAbility.php @@ -7,6 +7,7 @@ namespace LIT\MCP\Integrations\WordPress\Status; use DateTimeImmutable; use DateTimeZone; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Abilities\Errors; use LIT\MCP\Abilities\ToolResult; use LIT\MCP\ChangeLog\ChangeLog; @@ -71,7 +72,7 @@ final class PostScheduleAbility implements Ability public function annotations(): array { - return ['readonly' => false, 'destructive' => false, 'idempotent' => true]; + return Annotations::write(true); } public function isDirect(): bool diff --git a/src/Integrations/WordPress/Status/PostTrashAbility.php b/src/Integrations/WordPress/Status/PostTrashAbility.php index b2089ed..b7bace8 100644 --- a/src/Integrations/WordPress/Status/PostTrashAbility.php +++ b/src/Integrations/WordPress/Status/PostTrashAbility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\WordPress\Status; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Abilities\Errors; use LIT\MCP\Abilities\Rev; use LIT\MCP\Abilities\ToolResult; @@ -74,7 +75,7 @@ final class PostTrashAbility implements Ability public function annotations(): array { - return ['readonly' => false, 'destructive' => true, 'idempotent' => true]; + return Annotations::destructive(true); } public function isDirect(): bool diff --git a/src/Integrations/WordPress/Status/PostUnpublishAbility.php b/src/Integrations/WordPress/Status/PostUnpublishAbility.php index 4bccc56..a7a795a 100644 --- a/src/Integrations/WordPress/Status/PostUnpublishAbility.php +++ b/src/Integrations/WordPress/Status/PostUnpublishAbility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Integrations\WordPress\Status; use LIT\MCP\Abilities\Ability; +use LIT\MCP\Abilities\Annotations; use LIT\MCP\Abilities\Errors; use LIT\MCP\Abilities\Rev; use LIT\MCP\Abilities\ToolResult; @@ -59,7 +60,7 @@ final class PostUnpublishAbility implements Ability public function annotations(): array { - return ['readonly' => false, 'destructive' => false, 'idempotent' => true]; + return Annotations::write(true); } public function isDirect(): bool diff --git a/tests/Unit/Abilities/AnnotationsTest.php b/tests/Unit/Abilities/AnnotationsTest.php new file mode 100644 index 0000000..cf7d98f --- /dev/null +++ b/tests/Unit/Abilities/AnnotationsTest.php @@ -0,0 +1,20 @@ + true, 'destructive' => false, 'idempotent' => true], Annotations::read()); + self::assertSame(['readonly' => false, 'destructive' => false, 'idempotent' => false], Annotations::write(false)); + self::assertSame(['readonly' => false, 'destructive' => false, 'idempotent' => true], Annotations::write(true)); + self::assertSame(['readonly' => false, 'destructive' => true, 'idempotent' => false], Annotations::destructive(false)); + self::assertSame(['readonly' => false, 'destructive' => true, 'idempotent' => true], Annotations::destructive(true)); + } +}