feat: add seo_meta service for AI-generated SEO metadata with CLI management and database layer

Implement a new `SeoMetaService` subservice that generates clean SEO title/description/keywords for published content items, distinct from the existing SEO diagnostics auditor. Add `seo_metadata` polymorphic table with soft-delete support, batch query methods, and usage tracking. Extend the CLI with `seo-meta prune` and `seo-meta clear` commands for job row lifecycle management. Wire `schedule_seo_meta_for_table` into content creation and editing flows in `content.py`. Document the new service in `AGENTS.md` and `README.md`, including the `extra_head` site setting for custom `<head>` injection.
This commit is contained in:
2026-06-19 20:15:22 +00:00
parent 426d3639c6
commit d10f1af118
51 changed files with 2262 additions and 93 deletions
@@ -618,6 +618,23 @@ ACTIONS: tuple[Action, ...] = (
params=(path("uid", "SEO job uid returned by seo_diagnostics."),),
requires_auth=False,
),
Action(
name="seo_meta_status",
method="GET",
path="/tools/seo-meta/{target_type}/{target_uid}",
summary="Read the SEO metadata generated for a content item",
description=(
"Returns the clean SEO title, description and keywords for a published content "
"item. target_type is one of post, project, gist, news or issue and target_uid "
"is its uid (or issue number). When the AI value is not ready yet a plain-content "
"default is returned with status 'pending'."
),
params=(
path("target_type", "One of post, project, gist, news or issue."),
path("target_uid", "The content uid (or issue number)."),
),
requires_auth=False,
),
Action(
name="deepsearch",
method="POST",