ai-search-auditor 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/CHANGELOG.md +8 -1
  2. package/README.md +140 -12
  3. package/package.json +36 -7
package/CHANGELOG.md CHANGED
@@ -1,11 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.1.1](https://github.com/a-bibikov/ai-search-audit/compare/v0.1.0...v0.1.1) (2026-11-03)
4
+
5
+
6
+ ### Documentation
7
+
8
+ * what the audit checks, roadmap, release process ([365965a](https://github.com/a-bibikov/ai-search-audit/commit/365965a7f2f0842a4dba13a0d1b8f1dfa8a8404b))
9
+
3
10
  ## 0.1.0 — 2026-11-03
4
11
 
5
12
  First release, published to npm as `ai-search-auditor` (commands `ai-search-auditor` and `ai-search-audit`).
6
13
 
7
14
  - CLI `ai-search-audit <url>`: checks whether ChatGPT, Claude, Perplexity and other answer engines can read, understand and cite a site.
8
- - 18 rules in seven groups: access for AI agents (A), text without JavaScript (B), entities and authorship (C), answer first (D), machine-readable versions such as `llms.txt` (E), freshness (F), content safety (G).
15
+ - 20 checks in seven groups: access for AI agents (A), text without JavaScript (B), entities and authorship (C), answer first (D), machine-readable versions such as `llms.txt` (E), freshness (F), content safety (G).
9
16
  - Score 0–100 with a grade; a rule counts once, not per page.
10
17
  - Local builds with `--base`, page sampling across templates with `--max-pages`, CI exit codes with `--fail-on`.
11
18
  - `llms-txt` subcommand: checks only `llms.txt` and `llms-full.txt`.
package/README.md CHANGED
@@ -10,6 +10,12 @@ No sign-up, no API keys, no dependencies. Node.js 22.18+.
10
10
 
11
11
  The npm package is `ai-search-auditor`; once installed (`npm i -g ai-search-auditor`), the command is also available as `ai-search-audit`.
12
12
 
13
+ ## Why this matters now
14
+
15
+ People increasingly get answers from ChatGPT, Claude, Perplexity and Google AI Overviews instead of a list of links. An answer engine reads a handful of pages, picks a few sources and cites them. The rest of the web does not exist for that answer.
16
+
17
+ Whether your site is among those sources depends on things classic SEO tools rarely look at: whether AI agents are let in, whether the text is there without JavaScript, whether the model can tell who the author is, whether the answer sits where it gets quoted. A site can rank well in Google and still be invisible, misread or skipped by AI search. Most of these problems are a few lines of code to fix, once you know they are there.
18
+
13
19
  ## Why another GEO checker
14
20
 
15
21
  Most GEO / AI SEO checkers score a checklist: "is there an FAQ?", "are AI bots named in robots.txt?". They miss what breaks citations in practice and raise alarms that are not problems. This one reads the site the way a model does:
@@ -22,15 +28,43 @@ Most GEO / AI SEO checkers score a checklist: "is there an FAQ?", "are AI bots n
22
28
 
23
29
  ## What it checks
24
30
 
25
- | Group | Rules |
26
- |---|---|
27
- | **A. Access** | A-1 search agents (OAI-SearchBot, ChatGPT-User, Claude-SearchBot, PerplexityBot, Googlebot, Bingbot…) are allowed in robots.txt · A-2 training crawlers follow your policy · A-3 the server answers AI agents like a browser (no 403, no challenge) · A-4 no `noindex` / `noai` · A-5 the feed is declared in `<head>` |
28
- | **B. Text without JS** | B-1 the text is in the HTML · B-2 no invisible characters in title, meta, JSON-LD, feeds, `llms.txt` · B-3 headings do not glue words together |
29
- | **C. Entities** | C-1 Person or Organization with `@id`, `sameAs`, `jobTitle` · C-2 articles point at the author by `@id` · C-4 complete Article / BlogPosting · C-6 og:title, og:description, og:image · C-7 a visible FAQ is marked up |
30
- | **D. Answer first** | D-2 articles answer in the first two paragraphs |
31
- | **E. Machine-readable** | E-1 `llms.txt` follows llmstxt.org · E-2 its links work and match the sitemap · E-3 `llms.txt` per language · E-5 `llms-full.txt` carries the full text |
32
- | **F. Freshness** | F-1 sitemap `lastmod` matches `dateModified` |
33
- | **G. Content safety** | G-1 no instructions addressed to AI in the content |
31
+ 20 checks in seven groups.
32
+
33
+ **A. Access for AI agents**
34
+ - **A-1** AI search agents are allowed to read the site
35
+ - **A-2** Training crawlers are allowed or blocked the way you intend
36
+ - **A-3** The server answers AI agents the same way it answers a browser
37
+ - **A-4** Public pages are not marked as closed to indexing or AI
38
+ - **A-5** The news feed can be found from the pages
39
+
40
+ **B. Text without JavaScript**
41
+ - **B-1** The content is in the page itself, not only rendered by scripts
42
+ - **B-2** Titles, metadata, structured data, feeds and `llms.txt` are free of invisible characters that split words
43
+ - **B-3** Headings read as separate words, not glued together
44
+
45
+ **C. Entities and authorship**
46
+ - **C-1** The author or company is described as one clear entity with profiles
47
+ - **C-2** Articles are linked to that author
48
+ - **C-4** Articles carry complete markup: headline, dates, author, image, language
49
+ - **C-6** Every page has a link card: title, description, image
50
+ - **C-7** A visible FAQ is marked up as one
51
+
52
+ **D. Answer first**
53
+ - **D-2** Articles give the answer in the first two paragraphs
54
+
55
+ **E. Machine-readable versions**
56
+ - **E-1** `llms.txt` exists and follows the standard
57
+ - **E-2** Every link in `llms.txt` works and is a published page
58
+ - **E-3** Each language has its own `llms.txt`
59
+ - **E-5** `llms-full.txt` carries the full text
60
+
61
+ **F. Freshness**
62
+ - **F-1** The sitemap and the page agree on when it was last updated
63
+
64
+ **G. Content safety**
65
+ - **G-1** The content has no instructions addressed to AI
66
+
67
+ Gaps in the numbering are taken by the checks on the [roadmap](#roadmap).
34
68
 
35
69
  Levels: `error` — AI search cannot read the page or reads it wrong; `warn` — lowers the chance of a citation; `info` — a recommendation.
36
70
 
@@ -98,18 +132,112 @@ The report goes to the job summary.
98
132
 
99
133
  | | Before | After |
100
134
  |---|---|---|
101
- | Score | **60/100 (D)** | **95/100 (A)** |
135
+ | Score | **60/100 (D)** | **100/100 (A)** |
102
136
  | C-1 Person without `@id` on home and CV | ✖ | ✓ |
103
137
  | C-2 Articles do not point at the author by `@id` | ⚠ | ✓ |
104
138
  | B-3 H1 reads as «Aleksandr BibikovI build…» | ⚠ | ✓ |
105
139
  | B-2 Invisible U+2060 in RSS (32 + 56) | ⚠ | ✓ (kept in on-page typography, ℹ) |
106
140
  | G-1 «A note for AI agents…» in `llms.txt` | ⚠ | ✓ |
107
- | C-6 No og:image on home, CV, blog | ⚠ | ⚠ |
141
+ | C-6 No og:image on home, CV, blog | ⚠ | ✓ |
108
142
 
109
- Each fix was a few lines: a stable `@id`, a `{" "}` between two spans, stripping word joiners from the feed, deleting one line from `llms.txt`.
143
+ Most fixes were a few lines: a stable `@id`, a `{" "}` between two spans, stripping word joiners from the feed, deleting one line from `llms.txt`. The link cards took one image generator at build time.
110
144
 
111
145
  A score-based checker gave the same site 90/100 before the fixes and missed all five problems, while flagging an FAQ that does not exist.
112
146
 
147
+ ## Roadmap
148
+
149
+ Each check ships with tests on a site where it must fire and one where it must stay silent.
150
+
151
+ ### 0.2 — next
152
+
153
+ **L. Server logs** — a new command, `ai-search-auditor logs <access.log>`: what AI bots really do on your site, not what they could do
154
+ - **L-1** Which AI bots visit the site and which pages they read
155
+ - **L-2** How many of their requests end in errors, redirects or blocks
156
+ - **L-3** Important pages no AI bot has ever seen
157
+ - **L-4** Fake bots: an AI user agent coming from an address its operator does not use
158
+
159
+ **A. Access**
160
+ - **A-8** Every known AI bot — training, search and user-triggered — is allowed or blocked the way you intend
161
+ - **A-9** Opting out of Gemini training does not silently remove the site from Gemini answers
162
+ - **A-10** robots.txt, Content Signals, meta tags and `llms.txt` do not contradict each other
163
+ - **A-11** Bot protection does not show AI agents a challenge page or rate-limit them
164
+ - **A-12** Missing pages answer «not found», not a normal page that gets indexed and quoted
165
+
166
+ **D. Answer first**
167
+ - **D-6** Each section makes sense on its own, so it can be quoted without the rest of the page
168
+
169
+ **I. Ready for AI agents** — agents now fill in forms and place orders for people
170
+ - **I-1** Forms and buttons can be used by an agent acting for a person
171
+ - **I-2** Key actions — contact, sign-up, checkout — do not stop an agent at the first step
172
+ - **I-3** The site tells agents where its API or MCP server is, if it has one
173
+
174
+ ### Later
175
+
176
+ **A. Access**
177
+ - **A-6** Paywalls, cookie walls and pop-ups do not hide the text from crawlers
178
+ - **A-7** Pages answer fast enough and stay within the size crawlers read
179
+ - **A-13** Redirect chains are short
180
+ - **A-14** AI agents are not blocked by country
181
+ - **A-15** Signed agent requests are accepted
182
+ - **A-16** The EU text-and-data-mining reservation is stated where you need it
183
+
184
+ **B. Text without JavaScript**
185
+ - **B-4** The page after scripts run says the same as the raw HTML
186
+ - **B-5** Images have alt text and captions; data is not locked inside pictures
187
+ - **B-6** The main text is not drowned in menus, footers and banners
188
+ - **B-7** Text behind tabs, accordions and «show more» is reachable
189
+ - **B-8** Content is not hidden in frames or drawn on a canvas
190
+ - **B-9** Linked PDFs and documents contain real text
191
+
192
+ **C. Entities and authorship**
193
+ - **C-3** The about or CV page is marked up as a profile
194
+ - **C-5** Blog and listing pages are marked up as collections of articles
195
+ - **C-8** The company has a logo and contacts; a local business has one consistent name, address and phone
196
+ - **C-9** Product pages carry price, availability and ratings
197
+ - **C-10** Author profiles linked from the site are alive and link back
198
+ - **C-11** Structured data says the same as the visible text: FAQ, prices, dates
199
+ - **C-12** The company is described the same way on every page and profile
200
+ - **C-13** The site has about and contact pages
201
+ - **C-14** The company or author is known to Wikidata
202
+ - **C-15** Authors have their own page with their experience
203
+
204
+ **D. Answer first**
205
+ - **D-1** The first paragraph contains the page's main query
206
+ - **D-3** The publication and update dates are visible and match the markup
207
+ - **D-4** Content is easy to quote: question headings, lists, comparison tables
208
+ - **D-5** Facts are citable: numbers come with sources and dates
209
+ - **D-7** The page defines its subject and states a short conclusion
210
+
211
+ **E. Machine-readable versions**
212
+ - **E-4** Pages are available as Markdown
213
+ - **E-6** New pages are announced to search engines as they appear (IndexNow; ChatGPT search relies on Bing)
214
+
215
+ **F. Freshness**
216
+ - **F-2** Feeds carry the full text and correct dates
217
+ - **F-3** No stale signals: last year in a title, an «updated» date long ago
218
+
219
+ **G. Content safety**
220
+ - **G-2** No hidden text stuffed with keywords
221
+ - **G-3** No instructions to AI hidden in image text, comments or invisible elements
222
+ - **G-4** AI bots get the same page as people
223
+
224
+ **H. Languages**
225
+ - **H-1** Language versions point at each other correctly and do not compete as duplicates
226
+
227
+ ### Beyond the checks
228
+ - **Score per answer engine.** ChatGPT, Claude and Perplexity read raw HTML, Gemini and Apple run scripts: one site can be visible to some and invisible to others
229
+ - **Fact check.** Ask the models what they know about you and compare it with the site: «ChatGPT says you do not ship to Turkey, your site says you do»
230
+ - **Visibility monitor.** What ChatGPT, Claude and Perplexity answer to your queries, who they cite instead of you, and how it changes week to week
231
+ - **Site profiles:** blog, shop, SaaS, local business — each gets only the checks that matter for it
232
+ - **CI that reports only new problems,** with a file of accepted exceptions
233
+ - **SARIF output,** so findings show up in GitHub code scanning
234
+ - **Fixes for your stack:** ready snippets for Next.js, WordPress, Astro; a Claude Code skill and an MCP server that apply them
235
+ - **Online version** with no install at [albibikov.com/tools/ai-search-audit](https://albibikov.com/tools/ai-search-audit)
236
+ - **HTML report** to share with people who do not read Markdown
237
+ - **More report languages:** see below
238
+
239
+ Ideas are welcome in [issues](https://github.com/a-bibikov/ai-search-audit/issues); for pull requests see [CONTRIBUTING.md](CONTRIBUTING.md).
240
+
113
241
  ## Need the fixes, not just the report?
114
242
 
115
243
  The audit shows what blocks AI search. If you want it fixed and measured — what ChatGPT, Claude and Perplexity answer about your niche today and 30 days later — see [AI search audit on albibikov.com](https://albibikov.com/tools/ai-search-audit).
package/package.json CHANGED
@@ -1,18 +1,47 @@
1
1
  {
2
2
  "name": "ai-search-auditor",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Checks whether AI search (ChatGPT, Claude, Perplexity, Google AI Overviews) can read, understand and cite your site: robots.txt for AI agents, text without JavaScript, JSON-LD authorship, llms.txt, freshness.",
5
- "keywords": ["ai search audit", "ai seo", "aeo", "geo", "generative engine optimization", "ai search", "llms.txt", "seo", "audit", "json-ld", "chatgpt", "claude", "perplexity"],
5
+ "keywords": [
6
+ "ai search audit",
7
+ "ai seo",
8
+ "aeo",
9
+ "geo",
10
+ "generative engine optimization",
11
+ "ai search",
12
+ "llms.txt",
13
+ "seo",
14
+ "audit",
15
+ "json-ld",
16
+ "chatgpt",
17
+ "claude",
18
+ "perplexity"
19
+ ],
6
20
  "license": "MIT",
7
21
  "author": "Aleksandr Bibikov (https://albibikov.com)",
8
22
  "homepage": "https://github.com/a-bibikov/ai-search-audit#readme",
9
- "repository": { "type": "git", "url": "git+https://github.com/a-bibikov/ai-search-audit.git" },
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "git+https://github.com/a-bibikov/ai-search-audit.git"
26
+ },
10
27
  "bugs": "https://github.com/a-bibikov/ai-search-audit/issues",
11
28
  "type": "module",
12
- "bin": { "ai-search-auditor": "dist/cli.js", "ai-search-audit": "dist/cli.js" },
13
- "exports": { ".": "./dist/index.js" },
14
- "files": ["dist", "README.md", "LICENSE", "CHANGELOG.md"],
15
- "engines": { "node": ">=22.18" },
29
+ "bin": {
30
+ "ai-search-auditor": "dist/cli.js",
31
+ "ai-search-audit": "dist/cli.js"
32
+ },
33
+ "exports": {
34
+ ".": "./dist/index.js"
35
+ },
36
+ "files": [
37
+ "dist",
38
+ "README.md",
39
+ "LICENSE",
40
+ "CHANGELOG.md"
41
+ ],
42
+ "engines": {
43
+ "node": ">=22.18"
44
+ },
16
45
  "scripts": {
17
46
  "audit": "node src/cli.ts",
18
47
  "test": "node --test test/*.test.ts",