diff --git a/Fabric.Backend.Guild b/Fabric.Backend.Guild index f54ed6a..3e96de7 160000 --- a/Fabric.Backend.Guild +++ b/Fabric.Backend.Guild @@ -1 +1 @@ -Subproject commit f54ed6abb5e220352ade5797d8213561e2887db1 +Subproject commit 3e96de730add595292b3ab17f3e4ed5517624b3b diff --git a/Fabric.Frontend b/Fabric.Frontend index 8be68d4..46cad0e 160000 --- a/Fabric.Frontend +++ b/Fabric.Frontend @@ -1 +1 @@ -Subproject commit 8be68d4c875aa951caec05788f68cc9bd56c79a8 +Subproject commit 46cad0ec7cb60aa1d44d497f53f246ea39519d84 diff --git a/Fabric.OpenclawPlugin b/Fabric.OpenclawPlugin index c035620..fc6edaa 160000 --- a/Fabric.OpenclawPlugin +++ b/Fabric.OpenclawPlugin @@ -1 +1 @@ -Subproject commit c03562046d422d3732edb6c66450bf097b4282d4 +Subproject commit fc6edaabfdaf296e79645786f1c360c04b9978c4 diff --git a/docs/TEST_POINTS.md b/docs/TEST_POINTS.md index b3cf9c7..1ff28bb 100644 --- a/docs/TEST_POINTS.md +++ b/docs/TEST_POINTS.md @@ -179,6 +179,17 @@ Guild1 :7002 = `test-guild1`, Guild2 :7003 = `test-guild2`, Frontend :8088). | X5 | metadata/message separation | one message-id; metadata only at push; frontend/desktop metadata-agnostic; `author=guild` hidden unless debug | | X6 | submodule pointers | parent `Fabric` repo bumped after each submodule change; pushed to `origin/main` | +## 10. Slash commands (registry / sync / autocomplete) + +| # | Test point | Expected | +|---|---|---| +| SC1 | Guild registry API | `PUT /api/commands {commands}` idempotent full replace; `GET /api/commands` → `{commands,updatedAt}`; both authed (no token → 401). Verified | +| SC2 | plugin builds catalog | `buildFabricCommandSpecs(cfg)` via `openclaw/plugin-sdk/native-command-registry` (`listNativeCommandSpecsForConfig`+`findCommandByNativeName`); dynamic arg `choices` resolved to a static snapshot (`resolveCommandArgChoices`). Verified (41 specs, choices incl. dynamic) | +| SC3 | plugin syncs on start | `syncFabricCommands` runs after inbound on `gateway_start`; PUTs catalog to each connected guild (one per guild, idempotent). Verified via direct call (`synced 41 -> test-guild1`); in-gateway run needs plugin reinstall + gateway restart | +| SC4 | no `nativeCommands` capability | Fabric stays a TEXT-command surface; a `/` message is delivered normally → plugin → OpenClaw command system. Only `/no-reply`,`/force-proceed` stay server-intercepted | +| SC5 | frontend autocomplete | `/` opens a command panel (filter, ↑↓/Enter/Esc); pick inserts `/ `; arg stage shows args + clickable `choices`. Built & deployed; **browser interaction not automated** — catalog fetch + bundle wiring verified | +| SC6 | command execution | a registered `/` reuses the existing message→plugin→OpenClaw path (text-command + command session + auth); not re-verified end-to-end here (same path as P13/P14) | + --- ## Known coverage gaps / notes