Skip to content

Commit 6816bcb

Browse files
feat(ai-geo): llms.txt discoverability signals (v1.1.0, marketplace v2.4.1)
Extend all three ai-geo skills with the stackable weak-signal stack for llms.txt discovery beyond serving /llms.txt at root. geo-audit — Category 1 adds four checks: <head> link[rel=alternate] (Medium), sitemap /llms.txt entry (Medium), robots.txt LLM index comment (Low), public directory submission (Low/manual). Report template gains "On llms.txt discovery" subsection noting no major LLM provider has publicly committed to reading llms.txt yet (marked experimental). geo-fix — Safe-auto bucket adds three fixes: head link via framework-idiomatic API, sitemap entry (Next.js app/sitemap.ts, static XML, Nuxt/Astro modules), robots.txt comment with auto-derived domain. New informational bucket for manual directory submission. Build-order rule codified: llms.txt generator must precede sitemap generator. Terminal summary gains discovery-signal statuses + directory URLs. geo-llms-txt — New Step 7.5 wires post-write head link, sitemap entry, and robots comment per framework (Next.js Metadata API, Nuxt useHead, Vue @unhead/vue, Astro, SvelteKit, Remix, vanilla). New Build pipeline subsection under Step 6 documents per-framework order rules. Terminal summary + QA checklist extended. llms-full.txt logic unchanged.
1 parent 74ec4ee commit 6816bcb

7 files changed

Lines changed: 197 additions & 7 deletions

File tree

.claude-plugin/marketplace.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
},
77
"metadata": {
88
"description": "A curated list of custom Claude Code plugins, agents, and skills for developers.",
9-
"version": "2.4.0",
9+
"version": "2.4.1",
1010
"pluginRoot": "./plugins"
1111
},
1212
"plugins": [
@@ -325,8 +325,8 @@
325325
{
326326
"name": "ai-geo",
327327
"source": "./plugins/ai-geo",
328-
"description": "Generative Engine Optimization (GEO) auditing and remediation. Optimizes web content for AI answer engines like ChatGPT, Perplexity, Claude, and Google AI Overviews. Generates llms.txt files, audits AI crawler access, validates citation-worthiness signals, and structures content for LLM extraction.",
329-
"version": "1.0.0",
328+
"description": "Generative Engine Optimization (GEO) auditing and remediation. Optimizes web content for AI answer engines like ChatGPT, Perplexity, Claude, and Google AI Overviews. Generates llms.txt files, wires head link[rel=alternate] + sitemap + robots.txt discoverability signals, audits AI crawler access, validates citation-worthiness signals, and structures content for LLM extraction.",
329+
"version": "1.1.0",
330330
"keywords": [
331331
"geo",
332332
"ai-seo",

CHANGELOG.md

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,31 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [2.4.1] - 2026-04-18
11+
12+
### Changed
13+
14+
#### AI-GEO Plugin (v1.0.0 → v1.1.0)
15+
16+
- `/geo-audit` — Category 1 (llms.txt Protocol Compliance) extended with four discoverability-signal checks:
17+
- `<head>` `<link rel="alternate" type="text/markdown" title="llms.txt" href="/llms.txt">` presence (Medium if missing)
18+
- `sitemap.xml` `<url><loc>/llms.txt</loc></url>` entry presence (Medium if missing)
19+
- `robots.txt` `# LLM index: https://<domain>/llms.txt` comment presence (Low / informational)
20+
- Public directory submission to llmstxt.site and directory.llmstxt.cloud (Low / manual — never auto-detected, never Critical/High)
21+
- `/geo-audit` — "What is GEO?" report section gained "On llms.txt discovery" subsection documenting that no major LLM provider (OpenAI, Anthropic, Perplexity, Google) has publicly committed to reading `llms.txt` as a first-class signal, marked 🧪 experimental, and listing the five stackable weak signals (root serve, head link, sitemap entry, robots comment, directory submission)
22+
- `/geo-fix` — Safe-auto fix bucket extended with three new fixes:
23+
- Inject `<link rel="alternate" type="text/markdown" href="/llms.txt">` via the framework-idiomatic head API (Next.js Metadata API `alternates.types`, Nuxt `useHead`, Vue + `@unhead/vue`, Astro layout, SvelteKit `<svelte:head>`, Remix `meta` export, vanilla `<head>`) — skip if already present
24+
- Add `/llms.txt` entry to sitemap (Next.js `app/sitemap.ts` push, static `sitemap.xml` `<url>` block with `changefreq=monthly` + `priority=0.5`, `@nuxtjs/sitemap` `urls`, `@astrojs/sitemap` `customPages`) — skip if already present
25+
- Add `# LLM index: https://<domain>/llms.txt` comment to `robots.txt` with auto-derived domain (falls back to prompt when unresolvable) — skip if already present
26+
- `/geo-fix` — New informational bucket for non-automatable actions: terminal summary prints directory-submission URLs (`llmstxt.site/submit`, `directory.llmstxt.cloud`) as a manual next step (web forms, never automated)
27+
- `/geo-fix` — Terminal summary gained "llms.txt discovery signals" block (head link / sitemap entry / robots comment statuses + build-order warning)
28+
- `/geo-fix` — Build-order rule codified: when both `llms.txt` and the sitemap are build-time generated, the llms.txt generator MUST run before the sitemap so the sitemap can read llms.txt's mtime (warn with suggested reordering rather than silent reshuffle)
29+
- `/geo-llms-txt` — New Step 7.5 "Wire Discoverability Signals (post-write)" offers to add the head `link[rel=alternate]` hint, sitemap `/llms.txt` entry, and `robots.txt` comment after writing llms.txt, with framework-specific code for Next.js, Nuxt, Vue + `@unhead/vue`, Astro, SvelteKit, Remix, and vanilla HTML (each step skipped silently if already present or not applicable)
30+
- `/geo-llms-txt` — New "Build pipeline — order dependency" subsection documents per-framework rules: Next.js Metadata API has no order issue, Astro endpoint vs static differ, Nuxt prebuild hook, Vite/SvelteKit/Remix/TanStack Start warn-don't-reshuffle
31+
- `/geo-llms-txt` — Terminal summary gained discoverability-signal statuses and manual directory-submission URLs
32+
- `/geo-llms-txt` — Quality Assurance Checklist extended with post-write wiring items, build-order surfacing, and directory-submission printout
33+
- Existing LLM Knowledge Gap Corrections, examples, and Quality Assurance Checklist items preserved across all three skills — `llms-full.txt` generator logic unchanged
34+
1035
## [2.4.0] - 2026-04-17
1136

1237
### Added
@@ -1002,7 +1027,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
10021027

10031028
- README.md, CLAUDE.md, individual plugin READMEs, and MIT license
10041029

1005-
[Unreleased]: https://github.com/charlesjones-dev/claude-code-plugins-dev/compare/v2.4.0...HEAD
1030+
[Unreleased]: https://github.com/charlesjones-dev/claude-code-plugins-dev/compare/v2.4.1...HEAD
1031+
[2.4.1]: https://github.com/charlesjones-dev/claude-code-plugins-dev/compare/v2.4.0...v2.4.1
10061032
[2.4.0]: https://github.com/charlesjones-dev/claude-code-plugins-dev/compare/v2.3.4...v2.4.0
10071033
[2.2.2]: https://github.com/charlesjones-dev/claude-code-plugins-dev/compare/v2.2.1...v2.2.2
10081034
[2.2.1]: https://github.com/charlesjones-dev/claude-code-plugins-dev/compare/v2.2.0...v2.2.1

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Claude Code Plugins for Developers
22

3-
[![Version](https://img.shields.io/badge/version-2.4.0-blue.svg)](https://github.com/charlesjones-dev/claude-code-plugins-dev/releases)
3+
[![Version](https://img.shields.io/badge/version-2.4.1-blue.svg)](https://github.com/charlesjones-dev/claude-code-plugins-dev/releases)
44
[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
55
[![GitHub Issues](https://img.shields.io/github/issues/charlesjones-dev/claude-code-plugins-dev.svg)](https://github.com/charlesjones-dev/claude-code-plugins-dev/issues)
66
[![GitHub Stars](https://img.shields.io/github/stars/charlesjones-dev/claude-code-plugins-dev.svg)](https://github.com/charlesjones-dev/claude-code-plugins-dev/stargazers)

plugins/ai-geo/.claude-plugin/plugin.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "ai-geo",
3-
"version": "1.0.0",
4-
"description": "Generative Engine Optimization (GEO) auditing and remediation. Optimizes web content for AI answer engines like ChatGPT, Perplexity, Claude, and Google AI Overviews. Generates llms.txt files, audits AI crawler access, validates citation-worthiness signals, and structures content for LLM extraction.",
3+
"version": "1.1.0",
4+
"description": "Generative Engine Optimization (GEO) auditing and remediation. Optimizes web content for AI answer engines like ChatGPT, Perplexity, Claude, and Google AI Overviews. Generates llms.txt files, wires head link[rel=alternate] + sitemap + robots.txt discoverability signals, audits AI crawler access, validates citation-worthiness signals, and structures content for LLM extraction.",
55
"author": {
66
"name": "Charles Jones",
77
"url": "https://charlesjones.dev"

plugins/ai-geo/skills/geo-audit/SKILL.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,13 @@ Analyze the scope across all ten categories. For each finding capture: exact fil
113113
- Staleness: compare `llms.txt` mtime vs newest content file mtime. Flag if content is materially newer.
114114
- If missing entirely, generate a tailored example in the report body and recommend running `/geo-llms-txt`.
115115

116+
**Discoverability signals** (stackable hints beyond serving `/llms.txt` at root). No major LLM provider has publicly committed to reading `llms.txt` as a first-class signal 🧪, so discovery today depends on multiple weak signals stacked together. Audit each:
117+
118+
- `<head>` includes `<link rel="alternate" type="text/markdown" title="llms.txt" href="/llms.txt">` on at least the root layout / index page. **Severity: Medium** if missing. Check via the framework's head API source (Next.js Metadata API, Nuxt `useHead`, Astro layout `<head>`, SvelteKit `<svelte:head>`, Remix `meta` export, vanilla `<head>`) or static HTML output.
119+
- `sitemap.xml` (or framework equivalent: `app/sitemap.ts`, `@nuxtjs/sitemap`, `astro-sitemap`) contains a `<url><loc>` entry for `/llms.txt`. **Severity: Medium** if missing. Confirms sitemap-reading crawlers pick up the path.
120+
- `robots.txt` contains a comment line referencing the llms.txt URL, e.g. `# LLM index: https://<domain>/llms.txt`. **Severity: Low (informational).** Comments are non-standard for robots.txt parsers but human/LLM readable.
121+
- Public directory submissions: llmstxt.site, directory.llmstxt.cloud, and similar aggregators. **Cannot be auto-detected.** Emit as a **Low / Suggestion** finding with text: "Manual: submit `https://<domain>/llms.txt` to llmstxt.site and directory.llmstxt.cloud." Never mark as Critical/High — outside the codebase.
122+
116123
#### Category 2: AI Crawler Access Audit
117124

118125
Parse `robots.txt` from project root or `public/`. Detect per-user-agent `Allow` / `Disallow` directives. Categorize bots:
@@ -379,6 +386,18 @@ Companion: run /seo-audit (ai-seo plugin) for traditional SEO coverage.
379386

380387
Generative Engine Optimization (GEO) is the practice of optimizing web content for AI answer engines like ChatGPT, Perplexity, Claude, and Google AI Overviews. Unlike traditional SEO which targets search rankings, GEO targets citation probability and answer inclusion in AI-generated responses.
381388

389+
### On llms.txt discovery
390+
391+
🧪 No major LLM provider (OpenAI, Anthropic, Perplexity, Google) has publicly committed to reading `llms.txt` as a first-class signal. Adoption today is strongest among dev-tool platforms (Cursor, Continue.dev, Mintlify) and aggregator directories. There is no central submission portal. Discovery therefore relies on **multiple weak signals stacked together**:
392+
393+
1. Serving `/llms.txt` at the web root (table-stakes).
394+
2. `<link rel="alternate" type="text/markdown" href="/llms.txt">` in `<head>` so HTML-aware crawlers can discover it.
395+
3. A `/llms.txt` entry in `sitemap.xml` so sitemap-reading crawlers pick up the path.
396+
4. A `# LLM index: https://<domain>/llms.txt` comment in `robots.txt` (human/LLM readable).
397+
5. Manual submission to public directories (llmstxt.site, directory.llmstxt.cloud).
398+
399+
Each is cheap; stacking them compounds the probability of any given crawler discovering the index.
400+
382401
---
383402

384403
## Executive Summary

plugins/ai-geo/skills/geo-fix/SKILL.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,20 @@ Split findings into four buckets:
5757
- Add `@type: "FAQPage"` wrapper around existing Q&A prose where H2/H3 are already question-shaped.
5858
- Add `<link rel="alternate" type="text/markdown" href="<url>.md">` when a markdown-accessible route exists.
5959
- Remove context-dependent phrases that clearly break chunking ("as mentioned above" where a backward reference can be replaced with explicit repeat, with user confirmation per change).
60+
- **llms.txt discovery — `<head>` hint.** If `/llms.txt` is present but the page `<head>` lacks `<link rel="alternate" type="text/markdown" title="llms.txt" href="/llms.txt">`, add it via the framework-idiomatic head API (Next.js Metadata API `alternates.types`, Nuxt `useHead`, Vue + `@unhead/vue` `useHead`, Astro layout `<head>`, SvelteKit `<svelte:head>`, Remix `meta` export, vanilla `<head>`). Skip if already present. Apply to the root layout so every page inherits.
61+
- **llms.txt discovery — sitemap entry.** If `sitemap.xml` (or the framework generator) exists and lacks a `/llms.txt` entry, add it. For Next.js `app/sitemap.ts` push an entry `{ url: '<base>/llms.txt', changeFrequency: 'monthly', priority: 0.5 }`. For static `sitemap.xml` emit:
62+
```xml
63+
<url>
64+
<loc>https://<domain>/llms.txt</loc>
65+
<changefreq>monthly</changefreq>
66+
<priority>0.5</priority>
67+
</url>
68+
```
69+
Skip if entry already present. **Build-order rule** (flag, don't silently reorder): if both `llms.txt` and the sitemap are build-time generated, the llms.txt generator MUST run before the sitemap generator so the sitemap can read llms.txt's mtime. If the detected build script runs them in the wrong order, surface as a warning with the suggested reordering.
70+
- **llms.txt discovery — robots.txt comment.** If `/llms.txt` exists, add a comment line to `robots.txt` (or the framework generator): `# LLM index: https://<domain>/llms.txt`. Auto-derive `<domain>` from canonical URL / existing sitemap declaration / environment config. If domain is not resolvable, prompt the user once. Skip if a matching comment is already present. For Next.js `app/robots.ts` emit the comment via a leading `host` / preamble string block, since `MetadataRoute.Robots` doesn't directly support comments — fall back to `public/robots.txt` if the route generator can't express it cleanly.
71+
72+
**Informational (manual action items — never automated):**
73+
- **Public directory submission.** Print a manual action item in the terminal summary listing aggregator directories the user should submit `https://<domain>/llms.txt` to. Minimum list: `https://llmstxt.site/submit` and `https://directory.llmstxt.cloud`. These are web forms — do not attempt to automate submission. Emit as an informational line in the summary, not as a file edit.
6074

6175
**Intent-requiring fixes** (prompt user for policy):
6276
- `robots.txt` AI-bot directives. Prompt separately:
@@ -234,6 +248,17 @@ Changes by category:
234248
Entity Optimization: <count>
235249
Technical Accessibility: <count>
236250
251+
llms.txt discovery signals:
252+
<head> link[rel=alternate]: <added | present | n/a — no llms.txt>
253+
sitemap /llms.txt entry: <added | present | n/a — no sitemap>
254+
robots.txt comment: <added | present | n/a — no robots.txt>
255+
Build-order warning: <none | llms.txt must run before sitemap in <script>>
256+
257+
Manual next step — submit llms.txt to public directories:
258+
- https://llmstxt.site/submit
259+
- https://directory.llmstxt.cloud
260+
(Web forms — manual action, not automated.)
261+
237262
Recommended next: run /geo-audit again to verify improvements.
238263
To generate/update llms.txt: run /geo-llms-txt.
239264
For traditional SEO: run /seo-fix (ai-seo plugin).

0 commit comments

Comments
 (0)