refactor: DiviWriteAbility base and shared DiviErrors (H4)

The five Divi write tools extend DiviWriteAbility (final permission and
execute, change() per tool, shared output schema). DiviErrors holds the
unknown-node, position and compose-error mapping; DiviContentComposer uses
the same mapping (ledger T9). ToolNamingTest skips abstract classes.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01At3V6SjwbMe6eMzVGW3Hs7
This commit is contained in:
2026-09-26 18:22:51 +02:00
co-authored by Claude Opus 5.5
parent 9da236b0e3
commit ecfece719d
12 changed files with 141 additions and 187 deletions
@@ -0,0 +1,41 @@
<?php
declare(strict_types=1);
namespace LIT\MCP\Integrations\Divi\Pages;
use LIT\MCP\Abilities\Errors;
use WP_Error;
use WP_Post;
/** The client errors the Divi tools share. */
final class DiviErrors
{
/** A path ID that names no node of $post. */
public static function unknownNode(string $id, WP_Post $post): WP_Error
{
return Errors::notFound(
sprintf('Knoten "%s" gibt es in Eintrag %d nicht.', $id, $post->ID),
DiviPageLoader::OUTLINE_HINT
);
}
/** A parent / before / after / index the tree has no place for (TreeEditor::position()). */
public static function position(string $problem): WP_Error
{
return Errors::invalidInput('Ungültige Position; nichts wurde gespeichert.', ['position' => $problem]);
}
/**
* The errors of Composer::compose()/update(): invalid_attr_path when an attribute path is
* unknown (the more useful hint), else invalid_input with $message.
*
* @param array{errors: array<string, string>, invalid_paths: list<string>} $result
*/
public static function composed(array $result, string $message): WP_Error
{
return $result['invalid_paths'] !== []
? Errors::invalidAttrPath($result['errors'])
: Errors::invalidInput($message, $result['errors']);
}
}