feat: Site audit and Crawls screens with their MCP tools

- golem15.seo.issues (Site audit): current issues errors first, labels,
  summary and fix columns, filters, P7 issue_details, Check this address
  again, Ignore, Stop ignoring, bulk Ignore, ignored rows badged
- golem15.seo.crawls (Crawls): newest first, P6 crawl_summary with one
  status callout, staging and rendered-comparison lines, stats strip and
  per-kind table; Cancel; a running crawl refuses delete
- Start crawl toolbar action on both, refusing already_running and
  no_site_url; navigation Site audit (gauge) and Crawls (globe)
- routes and MCP tools start/cancel/list/get/delete crawls, list_issues
  with filters (open by default), recheck_url, ignore and unignore
- AdminOperations maps both controllers; toolbar actions get their own
  operation kind
- TestCrawlAdmin, TestCrawlTools, TestIssueKindLabels
This commit is contained in:
Jakub Zych
2026-11-04 15:34:22 +01:00
parent edc03cae4b
commit c4f0b4f94c
32 changed files with 2778 additions and 20 deletions

View File

@@ -323,7 +323,7 @@ func TestIssueMerge(t *testing.T) {
}
site.plant(doc{path: "/p/fixme", title: "Fix me"})
second := env.crawlOnce(t, token, ctx)
list = env.issues(t, token, "")
list = env.issues(t, token, "status=all")
again := findIssue(t, list, "heading_skipped", "/cat/news")
if !again.Ignored || again.CrawlID == nil || *again.CrawlID != second {
t.Fatalf("ignored issue in the next crawl = %+v", again)