diff --git a/docs/guides/workflows.md b/docs/guides/workflows.md index 3b0b2d9..7ae6496 100644 --- a/docs/guides/workflows.md +++ b/docs/guides/workflows.md @@ -8,7 +8,8 @@ 3. Seiten als Entwürfe anlegen (`lit-content-create`), Hierarchie über `parent`. 4. Startseite: Seite veröffentlichen (nach Rückfrage), dann `{"settings": {"page_on_front": , "show_on_front": "page"}}`. -5. Menü: `lit/menu-create` (optional mit `location` aus `lit/menu-list`), Einträge mit `lit/menu-set-items`. +5. Menü: `lit/menu-create` (optional mit `location` aus `lit/menu-list`), Einträge mit `lit/menu-set-items` – mit + `menu_id` und `menu_rev` aus der Antwort von `lit/menu-create` (kein `lit/menu-get` nötig). 6. Veröffentlichen erst, wenn der Nutzer es ausdrücklich möchte. ## Divi-Seite bauen @@ -32,8 +33,8 @@ geändert, sondern in `skipped_nodes` genannt – dem Nutzer sagen, dass er sie ## Menüs pflegen -- `lit/menu-get` liefert den Baum und `menu_rev` (Stand des Menüs). `lit/menu-set-items` verlangt diese - `menu_rev`; hat sich das Menü inzwischen geändert, kommt `rev_mismatch` – dann mit `lit/menu-get` neu lesen. +- `lit/menu-get` liefert den Baum und `menu_rev` (Stand des Menüs; für ein neues Menü schon `lit/menu-create`). + `lit/menu-set-items` verlangt diese `menu_rev`; hat sich das Menü inzwischen geändert, kommt `rev_mismatch` – dann mit `lit/menu-get` neu lesen. Die Antwort enthält die neue `menu_rev` für weitere Änderungen. - Für größere Umbauten den Baum verändern und vollständig als `items` an `lit/menu-set-items` senden (bestehende Einträge mit `id`, neue ohne `id`). Wird der Baum unverändert zurückgeschickt, meldet das Tool diff --git a/src/Integrations/WordPress/Menus/MenuCreateAbility.php b/src/Integrations/WordPress/Menus/MenuCreateAbility.php index d87eaf1..873a9db 100644 --- a/src/Integrations/WordPress/Menus/MenuCreateAbility.php +++ b/src/Integrations/WordPress/Menus/MenuCreateAbility.php @@ -8,6 +8,7 @@ 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; use LIT\MCP\Abilities\ToolResult; use LIT\MCP\ChangeLog\ChangeLog; use WP_Error; @@ -35,7 +36,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; die Antwort enthält dafür menu_id und menu_rev.'; } public function inputSchema(): array @@ -53,7 +54,13 @@ final class MenuCreateAbility implements Ability public function outputSchema(): ?array { - return ToolResult::schema(['menu_id' => ['type' => 'integer']], ['menu_id']); + return ToolResult::schema( + [ + 'menu_id' => ['type' => 'integer'], + 'menu_rev' => ['type' => 'string', 'description' => 'Stand des Menüs für lit/menu-set-items.'], + ], + ['menu_id', 'menu_rev'] + ); } public function annotations(): array @@ -98,6 +105,8 @@ final class MenuCreateAbility implements Ability MenuLocations::assign($location, $menuId); } + $items = wp_get_nav_menu_items($menuId); + // The menu is saved – a change log failure from here on is logged and reported as a warning only. $warnings = []; $summary = sprintf('Menü "%s" angelegt', $name) @@ -114,6 +123,7 @@ final class MenuCreateAbility implements Ability ->logId(is_int($logId) ? $logId : null) ->warnings($warnings) ->with('menu_id', $menuId) + ->with('menu_rev', Rev::ofMenu(is_array($items) ? $items : [])) ->toArray(); } } diff --git a/tests/Unit/Integrations/WordPress/Menus/MenuCreateAbilityTest.php b/tests/Unit/Integrations/WordPress/Menus/MenuCreateAbilityTest.php index 65bf163..376c164 100644 --- a/tests/Unit/Integrations/WordPress/Menus/MenuCreateAbilityTest.php +++ b/tests/Unit/Integrations/WordPress/Menus/MenuCreateAbilityTest.php @@ -44,11 +44,15 @@ final class MenuCreateAbilityTest extends TestCase 'nav_menu_locations', ['footer-menu' => 2, 'primary-menu' => 8] ); + Functions\expect('wp_get_nav_menu_items')->once()->with(8)->andReturn([]); $log = new FakeChangeLog(5); $result = (new MenuCreateAbility($log))->execute(['name' => 'Neu', 'location' => 'primary-menu']); self::assertSame(8, $result['menu_id']); + // Trial: the first lit/menu-set-items needs no lit/menu-get just for the lock. + self::assertSame(\LIT\MCP\Abilities\Rev::ofMenu([]), $result['menu_rev']); + self::assertContains('menu_rev', (new MenuCreateAbility($log))->outputSchema()['required']); self::assertSame('created', $result['changed'][0]['action']); self::assertSame(5, $result['log_id']); $log->assertRecorded([