feat(v3.13.0): settings live DB reads, remove Directus/Appwrite, admin stats

Settings fixes:
- MAX_SITES_PER_USER, USER_RATE_LIMIT_PER_MIN/HR now read from DB settings
  table (DB > ENV > default), so dashboard/settings changes apply without
  restart. Sync cache refreshed on every save or delete.
- /api/me reports the live DB value for max_sites_per_user.

Admin improvements:
- Admin users bypass per-user rate limiting entirely (role=admin or ADMIN_EMAILS).
- Admin Overview now shows platform stats: registered users, new users (7d),
  total user sites, available tools.

Plugin cleanup:
- Appwrite and Directus plugins removed from the active registry (8 plugins
  now: WordPress, WooCommerce, WordPress Specialist, Gitea, n8n, Supabase,
  OpenPanel, Coolify). Plugin code is retained for future re-enabling.
- Settings page plugin visibility list updated to match.

Mobile onboarding:
- Stepper steps on narrow viewports stack vertically with correct full border
  and rounded corners on each step.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-20 23:33:20 +02:00
parent f203ca88de
commit 43fd2201a0
223 changed files with 36183 additions and 4115 deletions

View File

@@ -292,7 +292,7 @@ def get_tool_specifications() -> list[dict[str, Any]]:
{
"name": "update_page",
"method_name": "update_page",
"description": "Update an existing WordPress page. Can update title, content, status, slug, and parent page.",
"description": "Update an existing WordPress page. Can update title, content, status, slug, parent page, featured image, and post meta (e.g. Yoast fields).",
"schema": {
"type": "object",
"properties": {
@@ -322,6 +322,14 @@ def get_tool_specifications() -> list[dict[str, Any]]:
"anyOf": [{"type": "integer"}, {"type": "null"}],
"description": "Parent page ID",
},
"featured_media": {
"anyOf": [{"type": "integer"}, {"type": "null"}],
"description": "Featured image attachment ID. Pass 0 to clear.",
},
"meta": {
"anyOf": [{"type": "object"}, {"type": "null"}],
"description": "Post meta key/value map forwarded as REST `meta` (e.g. Yoast fields like `_yoast_wpseo_metadesc`). Only registered/whitelisted keys are persisted by WordPress.",
},
},
"required": ["page_id"],
},
@@ -892,6 +900,8 @@ class PostsHandler:
status: str | None = None,
slug: str | None = None,
parent: int | None = None,
featured_media: int | None = None,
meta: dict | None = None,
) -> str:
"""
Update an existing WordPress page.
@@ -903,6 +913,8 @@ class PostsHandler:
status: Publication status
slug: Page URL slug
parent: Parent page ID
featured_media: Featured image attachment ID (0 clears it)
meta: Post meta key/value map (e.g. Yoast fields)
Returns:
JSON string with updated page data
@@ -920,6 +932,10 @@ class PostsHandler:
data["slug"] = slug
if parent is not None:
data["parent"] = parent
if featured_media is not None:
data["featured_media"] = featured_media
if meta is not None:
data["meta"] = meta
page = await self.client.post(f"pages/{page_id}", json_data=data)