docs: name tools and error codes the way the client sees them

Indirect abilities are written lit/<name> (via mcp-adapter-execute-ability) in
guides, descriptions and hints, direct tools lit-<name>; guides use the
client-visible codes (write_failed, partial_write) and say exactly which tools
return a revision_id. ToolNamingTest keeps guides and sources consistent with
Ability::isDirect() and checks the overview's direct-tool list.

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 01:28:18 +02:00
co-authored by Claude Opus 5.5
parent b3c9109e47
commit fea75b03d6
19 changed files with 186 additions and 55 deletions
@@ -34,7 +34,7 @@ final class MenuAssignLocationAbility implements Ability
public function description(): string
{
return 'Weist einer Theme-Position (siehe lit-menu-list) ein Menü zu; menu_id 0 entfernt die Zuweisung. '
return 'Weist einer Theme-Position (siehe lit/menu-list) ein Menü zu; menu_id 0 entfernt die Zuweisung. '
. 'Das vorher zugewiesene Menü steht in previous_menu_id.';
}
@@ -86,7 +86,7 @@ final class MenuAssignLocationAbility implements Ability
}
if ($menuId > 0 && ! is_object(wp_get_nav_menu_object($menuId))) {
return Errors::notFound(sprintf('Menü %d nicht gefunden.', $menuId), 'Menüs über lit-menu-list abrufen.');
return Errors::notFound(sprintf('Menü %d nicht gefunden.', $menuId), 'Menüs über lit/menu-list abrufen.');
}
$previous = MenuLocations::assigned()[$location] ?? 0;
@@ -34,7 +34,7 @@ final class MenuCreateAbility implements Ability
public function description(): string
{
return 'Legt ein leeres Menü an und weist es optional einer Theme-Position zu. Einträge danach mit '
. 'lit-menu-set-items setzen.';
. 'lit/menu-set-items setzen.';
}
public function inputSchema(): array
@@ -43,7 +43,7 @@ final class MenuCreateAbility implements Ability
'type' => 'object',
'properties' => [
'name' => ['type' => 'string', 'minLength' => 1],
'location' => ['type' => 'string', 'description' => 'Theme-Position aus lit-menu-list.'],
'location' => ['type' => 'string', 'description' => 'Theme-Position aus lit/menu-list.'],
],
'required' => ['name'],
'additionalProperties' => false,
@@ -88,7 +88,7 @@ final class MenuCreateAbility implements Ability
return Errors::invalidInput(
'Menü konnte nicht angelegt werden: ' . $menuId->get_error_message(),
['name' => 'bereits vergeben oder ungültig'],
'Vorhandene Menüs über lit-menu-list abrufen.'
'Vorhandene Menüs über lit/menu-list abrufen.'
);
}
@@ -29,7 +29,7 @@ final class MenuGetAbility implements Ability
return 'Liefert ein Menü als Baum (id, title, type post/taxonomy/custom, object/object_id, url, '
. 'children). object_id und url sind bei post/taxonomy-Einträgen nur informativ (WordPress leitet '
. 'sie aus dem verlinkten Objekt ab); nur bei custom-Einträgen ist url maßgeblich. Der Baum kann '
. 'bearbeitet an lit-menu-set-items zurückgegeben werden.';
. 'bearbeitet an lit/menu-set-items zurückgegeben werden.';
}
public function inputSchema(): array
@@ -78,7 +78,7 @@ final class MenuGetAbility implements Ability
$menuId = (int) ($input['menu_id'] ?? 0);
$menu = wp_get_nav_menu_object($menuId);
if (! is_object($menu)) {
return Errors::notFound(sprintf('Menü %d nicht gefunden.', $menuId), 'Menüs über lit-menu-list abrufen.');
return Errors::notFound(sprintf('Menü %d nicht gefunden.', $menuId), 'Menüs über lit/menu-list abrufen.');
}
$items = wp_get_nav_menu_items($menuId);
@@ -44,7 +44,7 @@ final class MenuSetItemsAbility implements Ability
return 'Setzt die Einträge eines Menüs. Entweder items = vollständiger Zielbaum oder operations = Liste aus '
. '{op: add, item, parent_id?, position?}, {op: move, id, parent_id?, position?}, {op: remove, id} '
. '(Kinder eines entfernten Eintrags rücken an seine Stelle; position 0-basiert, ohne = ans Ende). '
. 'Der Baum aus lit-menu-get kann bearbeitet unverändert zurückgegeben werden: bestehende Einträge '
. 'Der Baum aus lit/menu-get kann bearbeitet unverändert zurückgegeben werden: bestehende Einträge '
. 'werden über id erkannt, type/object/object_id und bei post/taxonomy auch url sind nur informativ '
. 'und werden ignoriert; title wird nur bei Änderung zur eigenen Beschriftung, url nur bei custom '
. 'geändert. Neue Einträge ohne id: type post|taxonomy mit object_id oder custom mit url (/pfad, '
@@ -70,7 +70,7 @@ final class MenuSetItemsAbility implements Ability
'items' => [
'type' => 'array',
'items' => ['type' => 'object'],
'description' => 'Vollständiger Zielbaum (Knoten wie in lit-menu-get, neue Einträge ohne id).',
'description' => 'Vollständiger Zielbaum (Knoten wie in lit/menu-get, neue Einträge ohne id).',
],
'operations' => [
'type' => 'array',
@@ -132,7 +132,7 @@ final class MenuSetItemsAbility implements Ability
$menuId = (int) ($input['menu_id'] ?? 0);
$menu = wp_get_nav_menu_object($menuId);
if (! is_object($menu)) {
return Errors::notFound(sprintf('Menü %d nicht gefunden.', $menuId), 'Menüs über lit-menu-list abrufen.');
return Errors::notFound(sprintf('Menü %d nicht gefunden.', $menuId), 'Menüs über lit/menu-list abrufen.');
}
if (array_key_exists('items', $input) === array_key_exists('operations', $input)) {
@@ -203,7 +203,7 @@ final class MenuSetItemsAbility implements Ability
$after = FollowUp::run(
fn () => MenuTree::build(array_values($this->currentItems($menuId))),
$this->name() . ' re-read',
'Das Menü ist gespeichert, der neue Stand konnte aber nicht gelesen werden; mit lit-menu-get abrufen.',
'Das Menü ist gespeichert, der neue Stand konnte aber nicht gelesen werden; mit lit/menu-get abrufen.',
$warnings
);
@@ -462,9 +462,10 @@ class MenuWriter
$cause,
$detail,
sprintf('Menü %d ist möglicherweise teilweise geändert worden.', $menuId),
'Den Aufruf nicht einfach wiederholen. Zuerst den aktuellen Stand mit lit-menu-get prüfen und ihn ggf. '
. 'mit lit-menu-set-items anhand von previous_items (Stand vorher) wiederherstellen; entfernte '
. 'Einträge müssen dabei neu angelegt werden. Dem Nutzer Bescheid geben.',
'Den Aufruf nicht einfach wiederholen. Zuerst den aktuellen Stand mit lit/menu-get prüfen und ihn ggf. '
. 'mit lit/menu-set-items (beide über mcp-adapter-execute-ability) anhand von previous_items (Stand '
. 'vorher) wiederherstellen; entfernte Einträge müssen dabei neu angelegt werden. Dem Nutzer Bescheid '
. 'geben.',
['menu_id' => $menuId, 'previous_items' => MenuTree::build(array_values($current))]
);
}