lintpage 0.4.0 → 0.5.0

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.
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
  [![npm downloads](https://img.shields.io/npm/dm/lintpage.svg)](https://www.npmjs.com/package/lintpage)
5
5
  [![license](https://img.shields.io/npm/l/lintpage.svg)](https://github.com/lintpage/lintpage/blob/main/packages/cli/LICENSE)
6
6
 
7
- CLI tool that audits websites for SEO, accessibility, and performance issues. Catch noindex tag, broken meta tags, missing alt text, slow pages, and security problems before they hurt your rankings.
7
+ CLI tool that audits websites for SEO, accessibility, performance, and AI visibility issues. Catch noindex tags, broken meta tags, missing alt text, slow pages, security problems, and AI crawler blocks before they hurt your rankings and AI search visibility.
8
8
 
9
9
  ## Install
10
10
 
@@ -30,6 +30,31 @@ The CLI automatically prepends `https://` if no protocol is provided:
30
30
  lintpage example.com
31
31
  ```
32
32
 
33
+ ### Auditing localhost
34
+
35
+ ```bash
36
+ npx lintpage localhost:3000
37
+ ```
38
+
39
+ No flag is needed. A loopback target is detected, `http://` is assumed unless
40
+ you type a protocol, and the audit runs against your dev server.
41
+
42
+ Checks needing a public origin do not run: robots.txt, sitemap.xml, CORS, TTFB,
43
+ broken internal links, and the AI crawler checks, which probe your site as
44
+ external bots that cannot reach your machine. They appear in the output rather
45
+ than being silently skipped: by default you see only the counts, but you can use
46
+ `--format json` or `--format github` to see which individual checks were
47
+ skipped. `ssl`, `https-links` and `canonical-self-referencing` still run but
48
+ report as INFO, since a dev server is expected to be http.
49
+
50
+ `--ai-only` is refused against localhost for the same reason.
51
+
52
+ In a pre-commit hook:
53
+
54
+ ```bash
55
+ npx lintpage localhost:3000 --quiet
56
+ ```
57
+
33
58
  ### Output
34
59
 
35
60
  ```
@@ -53,15 +78,18 @@ Exit codes:
53
78
 
54
79
  ## Options
55
80
 
56
- | Flag | Description |
81
+ | Flag | Description |
57
82
  | ------------------- | ------------------------------------------------- |
58
83
  | `--format <format>` | Output format: `text` (default), `json`, `github` |
84
+ | `--config <path>` | Path to a config file |
59
85
  | `--fail-on-warning` | Exit 1 on warnings, not just criticals |
86
+ | `--ai-only` | Run only the AI Visibility module (LP-050–LP-060) |
87
+ | `--skip-ai` | Skip the AI Visibility module |
60
88
  | `--quiet` | Minimal output (counts only) |
61
89
 
62
90
  ## Rules
63
91
 
64
- LintPage checks **60 rules** out of the box across four categories:
92
+ LintPage checks **60 rules** out of the box across five categories:
65
93
 
66
94
  ### Pre-Launch
67
95
 
@@ -132,6 +160,24 @@ LintPage checks **60 rules** out of the box across four categories:
132
160
  | `performance` | INFO | Lazy loading, inline styles, and script count |
133
161
  | `image-dimensions` | INFO | Images have explicit width/height to prevent layout shift |
134
162
 
163
+ ### AI Visibility
164
+
165
+ Probes how AI assistants and crawlers (ChatGPT, Claude, Perplexity, Gemini) see your page — combining `robots.txt` directives with live per-bot fetches to catch silent edge blocks (e.g. Cloudflare's default AI-bot 403). Run these in isolation with `--ai-only`, or skip them with `--skip-ai`.
166
+
167
+ | Rule | Severity | What it checks |
168
+ | ------------------------------- | -------- | ------------------------------------------------------------------- |
169
+ | `ai/all-crawlers-blocked` | CRITICAL | Every tested AI bot is blocked — page is invisible to AI assistants |
170
+ | `ai/gptbot-silent-block` | CRITICAL | robots.txt allows GPTBot but the live fetch is blocked (403/429) |
171
+ | `ai/claudebot-silent-block` | CRITICAL | robots.txt allows ClaudeBot but the live fetch is blocked (403/429) |
172
+ | `ai/perplexitybot-silent-block` | CRITICAL | robots.txt allows PerplexityBot but the live fetch is blocked |
173
+ | `ai/chatgpt-user-blocked` | CRITICAL | ChatGPT-User (live retrieval) cannot reach the page |
174
+ | `ai/claude-user-blocked` | CRITICAL | Claude-User (live retrieval) cannot reach the page |
175
+ | `ai/perplexity-user-blocked` | CRITICAL | Perplexity-User (live retrieval) cannot reach the page |
176
+ | `ai/google-extended-disallowed` | WARNING | Google-Extended (Gemini) disallowed in robots.txt |
177
+ | `ai/applebot-extended-disallowed` | INFO | Applebot-Extended disallowed in robots.txt |
178
+ | `ai/empty-content-to-bot` | WARNING | Bot receives near-empty HTML (content needs JS to render) |
179
+ | `ai/llms-txt-missing` | INFO | No `llms.txt` file found |
180
+
135
181
  ## Verdict
136
182
 
137
183
  LintPage emits one of two verdicts after each scan: