Skip to content

feat(seo): resolve Search Console issues + AI agent-readiness#2135

Merged
JSONbored merged 7 commits into
mainfrom
feat/seo-and-agent-readiness
Jun 13, 2026
Merged

feat(seo): resolve Search Console issues + AI agent-readiness#2135
JSONbored merged 7 commits into
mainfrom
feat/seo-and-agent-readiness

Conversation

@JSONbored

@JSONbored JSONbored commented Jun 13, 2026

Copy link
Copy Markdown
Owner

Summary

Resolves every Google Search Console finding for heyclau.de and adds an SEO growth + AI-agent-discovery layer.

GSC fixes

  • Breadcrumbs (Invalid URL in item): absolute breadcrumb/canonical/OG/JSON-LD URLs across all routes.
  • Datasets: creator + license added.
  • 404s: sanitizer strips relative-href anchors so rendered content paths stop becoming crawlable 404s.
  • Crawl budget / not-indexed: robots.txt disallows /api,/data,/downloads,/_next; disallowed URLs removed from sitemap.
  • Soft-404 / duplicates: invalid-category 301, /search/browse 301, /jobs/post canonical.
  • Dev subdomain duplicate: host-aware X-Robots-Tag: noindex for non-prod hosts.

Growth

  • Indexable category hubs at /<category> (ItemList/FAQ/Breadcrumb JSON-LD).
  • Tag hubs: /tags + /tags/:tag (entry tag chips now link out).
  • Platform landing pages: /for + /for/:platform (e.g. "Claude resources for Cursor").
  • Category-aware entry schema + HowTo for guides.
  • Unique per-entry fallback copy for bodyless entries.
  • Per-entry + per-category sitemap lastmod; tag/platform pages in sitemap.

AI agent readiness

  • /.well-known/api-catalog (RFC 9727), /.well-known/mcp/server-card.json (SEP-1649, version synced to packages/mcp), /.well-known/agent-skills/index.json (checksummed skills).
  • RFC 8288 Link headers; fully-open Content-Signal; WebMCP provider.
  • DNS-AID: SVCB records live; DNSSEC unavailable on .de via the current registrar (documented in docs/agent-discovery.md).

Housekeeping

  • Retired the deprecated /data/llms/*.txt scheme (generators already use /api/registry/.../llms).

Validation

pnpm type-check, pnpm test (703), pnpm validate:raycast-feed (922), raycast node --test (49), pnpm validate:openapi, pnpm build, git diff --check — all green. Reviewed via a multi-angle finder→verify pass; fixes applied (orphan-anchor a11y, duplicate Content-Signal, ranking reuse, canonical builder alignment).

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • AI agent discovery: in-page WebMCP tool plus /.well-known agent-skills, api-catalog, and MCP server-card endpoints
    • New hub pages: categories, platforms, tags, tag index; tag grouping and platform listings; richer SEO and JSON-LD across many pages
    • Search redirect route for legacy /search
  • Bug Fixes

    • Request-aware security headers (noindex on non-prod) and safer external link handling
    • Sitemap omits robots-disallowed JSON endpoints and emits per-item lastmod
  • Documentation

    • Added agent discovery guide and verification steps
  • Tests

    • Updated crawler, sitemap, security-header, and integration tests

JSONbored and others added 3 commits June 13, 2026 02:04
- Absolute canonical/OG/breadcrumb/JSON-LD URLs across routes; Dataset creator+license
- Category-aware entry schema; strip relative-href links from rendered content (404 source)
- robots Disallow /api,/data,/downloads,/_next + Content-Signal; non-prod host noindex
- Per-entry + per-category sitemap lastmod; reclaim /<category> as indexable hubs
- browse invalid-category 301; /search->/browse and /jobs/post canonicals

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- /.well-known/api-catalog (RFC 9727), /.well-known/mcp/server-card.json (SEP-1649)
- /.well-known/agent-skills/index.json (checksummed skill packages)
- RFC 8288 Link headers advertising the above on HTML responses
- WebMCP provider exposing directory search to in-browser agents
- docs/agent-discovery.md incl. DNS-AID ops steps

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- robots Disallow + Content-Signal, host-aware noindex, Link header
- sitemap excludes disallowed /data, adds category hubs + per-category lastmod

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@dosubot dosubot Bot added the size:XL This PR changes 500-999 lines, ignoring generated files. label Jun 13, 2026
@coderabbitai

coderabbitai Bot commented Jun 13, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 6d97a8a3-6e9f-4afb-8368-67b96f59a4e9

📥 Commits

Reviewing files that changed from the base of the PR and between dc445f7 and 88010d9.

📒 Files selected for processing (7)
  • apps/web/src/lib/tags.ts
  • apps/web/src/routes/[.]well-known.agent-skills.index[.]json.ts
  • apps/web/src/routes/entry.$category.$slug.tsx
  • apps/web/src/routes/feeds.tsx
  • apps/web/src/routes/validators.tsx
  • docs/agent-discovery.md
  • scripts/validate-raycast-feed.mjs
✅ Files skipped from review due to trivial changes (1)
  • docs/agent-discovery.md
🚧 Files skipped from review as they are similar to previous changes (5)
  • apps/web/src/routes/feeds.tsx
  • apps/web/src/routes/validators.tsx
  • apps/web/src/lib/tags.ts
  • scripts/validate-raycast-feed.mjs
  • apps/web/src/routes/[.]well-known.agent-skills.index[.]json.ts

📝 Walkthrough

Walkthrough

Adds an in-page WebMCP tool and multiple well-known discovery endpoints, centralizes crawler disallow rules and a Content-Signal, makes security headers request-aware (non-prod noindex + discovery Link), introduces category/tag/platform hub routes with enriched SEO/JSON-LD, updates sitemap lastmod handling and static-path exclusions, and aligns tests and docs.

Changes

AI Agent Discovery Platform

Layer / File(s) Summary
Crawler policy & security headers
apps/web/src/lib/robots-policy.ts, apps/web/src/lib/security-headers.ts, apps/web/src/lib/detail-assembly.ts, apps/web/src/server.ts, tests/crawler-policy.test.ts
Centralizes DISALLOW_PATHS and Content-Signal in robots policy; applySecurityHeaders accepts request to set x-robots-tag: noindex for non-prod hosts and to advertise agent discovery via a Link header; sanitization unwraps scheme-less anchors.
Discovery endpoints & WebMCP
apps/web/src/components/webmcp-provider.tsx, apps/web/src/routes/[.]well-known.mcp.server-card[.]json.ts, apps/web/src/routes/[.]well-known.agent-skills.index[.]json.ts, apps/web/src/routes/[.]well-known.api-catalog.ts, apps/web/src/routes/__root.tsx, docs/agent-discovery.md
Registers search_heyclaude via WebMCP in-browser provider; adds MCP server-card, agent-skills index, and RFC-9727 API catalog endpoints; mounts provider at app root and documents the discovery surface.
Category hub & browse normalization
apps/web/src/routes/$category.tsx, apps/web/src/routes/browse.tsx, apps/web/src/routes/search.ts
Replaces redirect-based category handling with a validated CategoryHub (throws notFound() for unknown ids), adds SEO/JSON-LD, normalizes invalid search.category via beforeLoad redirect, and provides /search/browse redirect preserving q.
Entry schema, breadcrumbs, and tags
apps/web/src/routes/entry.$category.$slug.tsx
Generates category-aware Schema.org JSON-LD (TechArticle/SoftwareSourceCode/CreativeWork), conditional HowTo for guides, uses absolute URLs for metadata/breadcrumbs, improves fallback content, and makes tags link to /tags/$tag.
Tags & platform hubs
apps/web/src/lib/tags.ts, apps/web/src/routes/tags.*, apps/web/src/routes/for.*
Adds tagSlug and tag-group utilities, plus tag index and tag hub routes and platform index/per-platform hub routes with SEO and JSON-LD.
Sitemap & data exclusions
apps/web/src/routes/sitemap[.]xml.ts, tests/atlas-production-data.test.ts, tests/sitemap-policy.test.ts
Sitemap supports per-category/per-entry lastmod, adds /tags and /for static paths, and excludes /data/feeds/index.json (robots-disallowed); tests updated to assert exclusions and lastmod logic.
Sitewide absolute URL migration
multiple apps/web/src/routes/* files (best, feeds, index, changelog, compare, ecosystem, jobs, quality, subscriptions, validators, etc.)
Systematically switch canonical/OpenGraph URLs and JSON-LD entry URLs to absoluteUrl(...) for fully-qualified metadata, and expand validators dataset schema.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Suggested labels

growth:trust, gittensor:priority, size:L

Poem

🐰 I hopped through routes and headers late at night,
I taught the site to wave a discovery light.
WebMCP tools and JSON‑LD in tow,
Robots and sitemaps now kindly let agents know.
Hop! The registry sings—agents find their bite.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 21.21% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title 'feat(seo): resolve Search Console issues + AI agent-readiness' clearly summarizes the main change: addressing GSC findings and implementing AI agent discovery features.
Description check ✅ Passed The description comprehensively covers the PR scope with detailed GSC fixes, growth features, and AI agent readiness improvements, plus validation evidence. It follows the template structure appropriately for a platform/code PR.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/seo-and-agent-readiness

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@gittensory

gittensory Bot commented Jun 13, 2026

Copy link
Copy Markdown

Note

Gittensory Gate skipped

PR closed before full evaluation. No late first comment was created.

Signal Result Evidence Action
Gate result ⚠️ Skipped #2135 is no longer open. No action.

💰 Earn for open-source contributions like this. Gittensor lets GitHub contributors earn for the work they already do — register to start earning →.

Checked by Gittensory, a quiet PR intelligence layer for OSS maintainers.

@gittensory gittensory Bot added the gittensory:reviewed Gittensor contributor context label Jun 13, 2026
@superagent-security

Copy link
Copy Markdown

Superagent didn't find any vulnerabilities or security issues in this PR.

@reviewwed

reviewwed Bot commented Jun 13, 2026

Copy link
Copy Markdown

🔍 Maintainer advisory review

Reviewed 38 changed file(s) — two independent AI reviewers. This is an advisory review — it does not merge or close the PR.

Suggested action: 🛠️ Request changes. (reviewers split: merge / request changes) Address the suggestions below before merging.

Reviewer A · gpt-oss-120b — recommends ✅ merge
The changes implement SEO, AI discovery, and routing enhancements correctly. Security headers are strengthened (non‑prod noindex, Link header, content‑signal), robots.txt disallows internal paths, and relative anchors are stripped. New well‑known endpoints expose only public metadata without leaking secrets. The WebMcpProvider safely registers an in‑browser tool. Type signatures were updated consistently, and related tests were added. No obvious injection, SSRF, or supply‑chain risks are introduced. Minor regression risk is low as existing functionality is preserved and redirects handle stale category queries.

Suggestions

  • Run the full test suite to confirm no TypeScript compile errors due to the changed applySecurityHeaders signature.
  • Add integration tests for the new well‑known endpoints to ensure they return expected JSON and headers.
  • Verify that the Link header length stays within typical limits for browsers and crawlers.

Worth double-checking

  • If any external code still calls applySecurityHeaders with a single argument, it will fail at runtime.
  • The expanded Link header may be ignored by some agents but should not cause failures.

Reviewer B · nemotron-3-120b-a12b — recommends 🛠️ request changes
The changes implement SEO improvements and AI agent readiness features as described. Most modifications are correct and safe: WebMCP provider exposes search safely, HTML sanitization fixes relative links, robots.txt adds disallow paths and content signals, security headers add non-production noindex and agent discovery links, new routes follow existing patterns, and absolute URLs fix SEO issues. However, there are notable gaps: 1) Missing tests for new features (WebMcpProvider, well-known endpoints, tags utility), 2) The category hub route change ($category.tsx) alters behavior from redirect to direct rendering (acceptable but should be verified doesn't break existing links), 3) Raycast feed validation changes are internal and already tested. Security risks are low: WebMCP is read-only, sanitization is client-side, new endpoints serve public data, and absoluteUrl uses trusted config.

Suggestions

  • Add unit tests for WebMcpProvider (API registration/unregistration), well-known endpoints (JSON structure and headers), and tags utility (slug generation and grouping).
  • Verify that existing category links (e.g., from external sites) still work correctly with the new direct rendering (should be fine as it's a UI improvement, not a URL change).
  • Consider adding e2e test for WebMCP tool execution to ensure it returns expected results.
  • Ensure the new disallow paths in robots.txt don't accidentally block valuable content (paths look safe: /api/, /data/, /downloads/, /_next/).

Worth double-checking

  • Missing test coverage for new features could lead to undetected regressions.
  • Category hub route change might affect users with deep links to old redirect targets (low impact as redirects were transparent).
  • WebMCP is experimental API - potential future browser changes, but component has safe fallbacks.
  • Relative link stripping in detail-assembly might affect legitimate use-cases (e.g., intentional relative links in guides), but GFM autolinking makes this unlikely and safer for SEO.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
apps/web/src/routes/feeds.tsx (1)

11-28: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Add missing og:url meta tag to feeds route.

The /feeds route's <head> metadata has canonical with absoluteUrl() but is missing the og:url meta tag. All peer routes in this cohort (ecosystem, quality, jobs.index, jobs.$slug) include both. Per the PR objectives, OG URLs should be absolute across routes.

🔗 Proposed fix to add og:url
     meta: [
       { title: "Feeds & subscriptions — HeyClaude" },
       {
         name: "description",
         content:
           "Subscribe to HeyClaude registry updates via RSS, Atom, or email. Follow the whole registry, a single category, or a changelog stream.",
       },
       { property: "og:title", content: "Feeds & subscriptions — HeyClaude" },
       {
         property: "og:description",
         content: "RSS, Atom, and email subscriptions for the HeyClaude registry.",
       },
+      { property: "og:url", content: absoluteUrl("/feeds") },
     ],
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/web/src/routes/feeds.tsx` around lines 11 - 28, The meta array in the
feeds route is missing an Open Graph URL entry; add a meta object { property:
"og:url", content: absoluteUrl("/feeds") } to the meta array in
apps/web/src/routes/feeds.tsx (near the existing
canonical/og:title/og:description entries) so the OG URL is absolute and
consistent with the other routes.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@apps/web/src/routes/`[.]well-known.agent-skills.index[.]json.ts:
- Around line 8-16: The skills[] construction currently sets url to the entry
HTML page; change it to use the artifact download URL so clients can fetch the
bytes that match sha256: in the skills mapping (where skills is built from
ENTRIES.filter(...).map(...)) replace the url value that uses
absoluteUrl(`/entry/${e.category}/${e.slug}`) with the checked artifact URL
(e.downloadUrl or absoluteUrl(e.downloadUrl) if downloadUrl is relative)
ensuring the url and sha256 now point at the same downloadable artifact.

In `@apps/web/src/routes/validators.tsx`:
- Around line 54-55: The JSON-LD emitter in validators.tsx is currently always
setting datePublished and dateModified to String(atlasRegistry.generatedAt ||
"").slice(0,10), which emits empty/invalid date strings when
atlasRegistry.generatedAt is missing; change the code that builds the JSON-LD
object (the place that sets datePublished and dateModified) to only include
those properties when atlasRegistry.generatedAt is truthy (e.g., compute const
generatedDate = atlasRegistry.generatedAt ?
String(atlasRegistry.generatedAt).slice(0,10) : undefined and either
conditionally spread { ...(generatedDate && { datePublished: generatedDate,
dateModified: generatedDate }) } into the object or add the properties inside an
if block), referencing the datePublished/dateModified fields and
atlasRegistry.generatedAt to locate where to apply the conditional inclusion.

In `@docs/agent-discovery.md`:
- Line 36: Change the opening fenced code block for the DNS SVCB example from
``` to ```dns so the block has a language identifier (e.g., use ```dns) to
satisfy markdownlint MD040; no other content changes required.

---

Outside diff comments:
In `@apps/web/src/routes/feeds.tsx`:
- Around line 11-28: The meta array in the feeds route is missing an Open Graph
URL entry; add a meta object { property: "og:url", content:
absoluteUrl("/feeds") } to the meta array in apps/web/src/routes/feeds.tsx (near
the existing canonical/og:title/og:description entries) so the OG URL is
absolute and consistent with the other routes.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 9d2d98d6-a61c-4205-9f32-a97b0dd1ac2c

📥 Commits

Reviewing files that changed from the base of the PR and between c89748d and 5a4d55d.

📒 Files selected for processing (31)
  • apps/web/src/components/webmcp-provider.tsx
  • apps/web/src/lib/detail-assembly.ts
  • apps/web/src/lib/robots-policy.ts
  • apps/web/src/lib/security-headers.ts
  • apps/web/src/routes/$category.tsx
  • apps/web/src/routes/[.]well-known.agent-skills.index[.]json.ts
  • apps/web/src/routes/[.]well-known.api-catalog.ts
  • apps/web/src/routes/[.]well-known.mcp.server-card[.]json.ts
  • apps/web/src/routes/__root.tsx
  • apps/web/src/routes/best.$slug.tsx
  • apps/web/src/routes/best.tsx
  • apps/web/src/routes/browse.tsx
  • apps/web/src/routes/changelog.tsx
  • apps/web/src/routes/compare.tsx
  • apps/web/src/routes/ecosystem.tsx
  • apps/web/src/routes/entry.$category.$slug.tsx
  • apps/web/src/routes/feeds.tsx
  • apps/web/src/routes/index.tsx
  • apps/web/src/routes/jobs.$slug.tsx
  • apps/web/src/routes/jobs.index.tsx
  • apps/web/src/routes/jobs.post.tsx
  • apps/web/src/routes/quality.tsx
  • apps/web/src/routes/search.ts
  • apps/web/src/routes/sitemap[.]xml.ts
  • apps/web/src/routes/subscriptions.tsx
  • apps/web/src/routes/validators.tsx
  • apps/web/src/server.ts
  • docs/agent-discovery.md
  • tests/atlas-production-data.test.ts
  • tests/crawler-policy.test.ts
  • tests/sitemap-policy.test.ts

Comment thread apps/web/src/routes/[.]well-known.agent-skills.index[.]json.ts
Comment thread apps/web/src/routes/validators.tsx Outdated
Comment thread docs/agent-discovery.md Outdated
JSONbored and others added 2 commits June 13, 2026 02:16
…copy

- /tags + /tags/:tag topic hubs (ItemList+breadcrumb JSON-LD); entry tag chips now link out
- /for + /for/:platform landing pages per platform (ItemList+FAQ+breadcrumb), reusing search()
- HowTo JSON-LD for guides (steps from headings)
- Unique, per-entry fallback copy for bodyless entries (category/tags/platforms)
- Sitemap: tag hubs + platform pages

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ta/llms

- MCP server-card version sourced from the mcp-server integration (synced to packages/mcp)
- Drop deprecated /data/llms llms-url tolerance; generators already use /api/registry/.../llms

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@dosubot dosubot Bot added size:XXL This PR changes 1000+ lines, ignoring generated files. and removed size:XL This PR changes 500-999 lines, ignoring generated files. labels Jun 13, 2026
@JSONbored JSONbored self-assigned this Jun 13, 2026
- agent-skills index: url points at the download artifact matching sha256 (not entry page)
- validators Dataset: omit datePublished/dateModified when generatedAt is missing
- feeds: add absolute og:url
- docs: language hint on DNS-AID fenced block

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (1)
apps/web/src/lib/tags.ts (1)

14-30: ⚡ Quick win

Tag name may vary if entries use different casings for the same slug.

Line 25 sets name: tag using the first encountered raw tag string for each slug. If different entries use different casings (e.g., "AI" vs. "ai"), the group name will be whichever appears first, potentially causing display inconsistency.

Consider normalizing tag names upstream in the data layer, or selecting a canonical name (e.g., the most common casing or title-case).

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/web/src/lib/tags.ts` around lines 14 - 30, getAllTagGroups currently
uses the first raw tag string as the group's name which can vary by casing;
update getAllTagGroups to choose a canonical name per slug (e.g., compute the
most frequent raw tag casing among entries for that slug or apply a
deterministic normalization like title-case) instead of using the first seen
tag; reference getAllTagGroups and tagSlug when locating the logic that builds
TagGroup objects and modify the branch that sets name: tag so it aggregates
candidate names (or normalizes) and assigns the chosen canonical name before
caching the TagGroup list.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@apps/web/src/routes/entry`.$category.$slug.tsx:
- Around line 551-555: The Link rendering currently uses tagSlug(t) directly
which can return an empty string and produce broken /tags/$tag links; update the
rendering around the Link that uses tagSlug(t) so you compute const slug =
tagSlug(t) and only render the <Link ... to="/tags/$tag" params={{ tag: slug }}
...> when slug is non-empty, otherwise render a non-interactive chip (e.g., a
<span> or <div> with the same classes and content) so empty slugs do not produce
navigable/broken links; apply the same guard to the other identical instance
that uses tagSlug(t).
- Around line 116-129: The guideHowTo function currently maps all headings into
HowTo steps, but the comment specifies only H2/H3 should be emitted; update the
step construction to first filter (e.headings ?? []) for headings with level ===
2 or level === 3 and then map that filtered array to the HowToStep objects
(e.g., replace the current step: (e.headings ?? []).map(...) with (e.headings ??
[]).filter(h => h.level === 2 || h.level === 3).map(...)); apply the same
filter-and-map change to the other HowTo step serialization in this file so only
H2/H3 headings are included.

In `@scripts/validate-raycast-feed.mjs`:
- Around line 284-286: The regex for validLlmsUrl is too permissive (it allows
extra path segments via (?:/.*)?); update the validation so validLlmsUrl
enforces the exact endpoint shape by replacing the pattern with one that anchors
the end, e.g. use /^\/api\/registry\/entries\/[^/]+\/[^/]+\/llms\/?$/ (allowing
optional trailing slash) against llmsUrl in the same check that sets
validLlmsUrl and leave the subsequent fail(...) behavior unchanged.

---

Nitpick comments:
In `@apps/web/src/lib/tags.ts`:
- Around line 14-30: getAllTagGroups currently uses the first raw tag string as
the group's name which can vary by casing; update getAllTagGroups to choose a
canonical name per slug (e.g., compute the most frequent raw tag casing among
entries for that slug or apply a deterministic normalization like title-case)
instead of using the first seen tag; reference getAllTagGroups and tagSlug when
locating the logic that builds TagGroup objects and modify the branch that sets
name: tag so it aggregates candidate names (or normalizes) and assigns the
chosen canonical name before caching the TagGroup list.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: ad1c7ee6-2de8-47ff-8bc8-f60b474517bc

📥 Commits

Reviewing files that changed from the base of the PR and between 5a4d55d and dc445f7.

📒 Files selected for processing (10)
  • apps/web/src/lib/tags.ts
  • apps/web/src/routes/[.]well-known.mcp.server-card[.]json.ts
  • apps/web/src/routes/entry.$category.$slug.tsx
  • apps/web/src/routes/for.$platform.tsx
  • apps/web/src/routes/for.index.tsx
  • apps/web/src/routes/sitemap[.]xml.ts
  • apps/web/src/routes/tags.$tag.tsx
  • apps/web/src/routes/tags.index.tsx
  • integrations/raycast/test/feed.test.ts
  • scripts/validate-raycast-feed.mjs
🚧 Files skipped from review as they are similar to previous changes (1)
  • apps/web/src/routes/[.]well-known.mcp.server-card[.]json.ts

Comment thread apps/web/src/routes/entry.$category.$slug.tsx
Comment thread apps/web/src/routes/entry.$category.$slug.tsx Outdated
Comment thread scripts/validate-raycast-feed.mjs Outdated
- entry tags: render a static chip when the tag slugifies to empty (no broken /tags link)
- guide HowTo: emit steps from H2/H3 headings only (filter by depth), shared with the guard
- raycast feed validator: anchor the llms-url regex to the exact endpoint shape
- tags: pick the most-frequent raw casing as a tag's canonical display name

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@JSONbored JSONbored merged commit 0a24e44 into main Jun 13, 2026
26 checks passed
@JSONbored JSONbored deleted the feat/seo-and-agent-readiness branch June 13, 2026 09:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

gittensory:reviewed Gittensor contributor context size:XXL This PR changes 1000+ lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant