aiseo-audit 1.4.1 → 1.4.3

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
@@ -16,11 +16,12 @@
16
16
  Deterministic CLI that audits web pages for **AI search readiness**. Think Lighthouse, but for how well AI engines can fetch, extract, understand, and cite your content.
17
17
 
18
18
  > [!TIP]
19
- > Run `aiseo-audit https://www.aiseo-audit.com` to see a 100/100 [A+ Score](https://www.aiseo-audit.com/).
19
+ > Run `aiseo-audit https://www.aiseo-audit.com` to see a 100/100 [A Score](https://www.aiseo-audit.com/).
20
20
 
21
21
  **AI SEO measures how reusable your content is for generative engines, not traditional search rankings.**
22
22
 
23
23
  - [Quick Start](#quick-start)
24
+ - [CI/CD](#cicd)
24
25
  - [CLI Options](#cli-options)
25
26
  - [Site-Wide Auditing](#site-wide-auditing)
26
27
  - [Local Development](#local-development)
@@ -51,6 +52,11 @@ aiseo-audit goes deeper:
51
52
 
52
53
  ## Quick Start
53
54
 
55
+ ```bash
56
+ # Try it instantly — no install required
57
+ npx aiseo-audit https://yoursite.com
58
+ ```
59
+
54
60
  ```bash
55
61
  # As a project dependency
56
62
  npm install aiseo-audit
@@ -95,6 +101,25 @@ aiseo-audit https://example.com --user-agent "MyBot/1.0"
95
101
  aiseo-audit https://example.com --config aiseo.config.json
96
102
  ```
97
103
 
104
+ ## CI/CD
105
+
106
+ Drop this into any GitHub Actions workflow to gate PRs on AI search readiness:
107
+
108
+ ```yaml
109
+ # .github/workflows/aiseo-audit.yml
110
+ name: AI SEO Audit
111
+ on:
112
+ pull_request:
113
+ push:
114
+ branches: [main]
115
+
116
+ jobs:
117
+ audit:
118
+ runs-on: ubuntu-latest
119
+ steps:
120
+ - run: npx aiseo-audit https://yoursite.com --fail-under 70
121
+ ```
122
+
98
123
  ## CLI Options
99
124
 
100
125
  | Option | Description | Default |
@@ -155,23 +180,6 @@ aiseo-audit --sitemap https://example.com/projects/sitemap.xml --signals-base ht
155
180
 
156
181
  Every report format explicitly shows which URL domain signals were fetched from, so there is no guesswork about where `robots.txt`, `llms.txt`, and `llms-full.txt` were checked.
157
182
 
158
- ## CI/CD
159
-
160
- ```yaml
161
- # .github/workflows/aiseo-audit.yml
162
- name: AI SEO Audit
163
- on:
164
- pull_request:
165
- push:
166
- branches: [main]
167
-
168
- jobs:
169
- audit:
170
- runs-on: ubuntu-latest
171
- steps:
172
- - run: npx aiseo-audit https://yoursite.com --fail-under 70
173
- ```
174
-
175
183
  ## User Agent
176
184
 
177
185
  By default, all HTTP requests (page fetch, `robots.txt`, `llms.txt`) are sent with the header `User-Agent: AISEOAudit/<version>`. This is intentional. If a site blocks unknown bots, that is a meaningful negative signal for AI search readiness, and the audit should surface it as a failing "Fetch Success" score.
package/dist/cli.js CHANGED
@@ -28,7 +28,7 @@ var import_zod3 = require("zod");
28
28
 
29
29
  // src/modules/analyzer/constants.ts
30
30
  var DOMAIN_SIGNAL_TIMEOUT_CAP = 5e3;
31
- var VERSION = true ? "1.4.1" : "0.0.0";
31
+ var VERSION = true ? "1.4.3" : "0.0.0";
32
32
 
33
33
  // src/modules/fetcher/constants.ts
34
34
  var MAX_RESPONSE_SIZE = 10 * 1024 * 1024;
@@ -1136,13 +1136,14 @@ function auditEntityClarity(page) {
1136
1136
  }
1137
1137
  }
1138
1138
  const consistencyRatio = keyWords.length > 0 ? topicOverlap / keyWords.length : 0;
1139
- const consistencyScore = consistencyRatio >= 0.5 ? 25 : consistencyRatio > 0 ? 15 : 5;
1139
+ const consistencyScore = keyWords.length === 0 ? 0 : consistencyRatio >= 0.5 ? 25 : consistencyRatio > 0 ? 15 : 0;
1140
1140
  factors.push(
1141
1141
  makeFactor(
1142
1142
  "Topic Consistency",
1143
1143
  consistencyScore,
1144
1144
  25,
1145
- `${topicOverlap}/${keyWords.length} title keywords align with content topics`
1145
+ `${topicOverlap}/${keyWords.length} title keywords align with content topics`,
1146
+ keyWords.length === 0 ? "neutral" : void 0
1146
1147
  )
1147
1148
  );
1148
1149
  const wordCount = countWords(text);
@@ -1855,16 +1856,17 @@ function generateRecommendations(auditResult) {
1855
1856
 
1856
1857
  // src/modules/scoring/constants.ts
1857
1858
  var GRADE_THRESHOLDS = [
1858
- [95, "A+"],
1859
- [90, "A"],
1860
- [85, "A-"],
1861
- [80, "B+"],
1862
- [75, "B"],
1863
- [70, "B-"],
1864
- [65, "C+"],
1865
- [60, "C"],
1866
- [55, "C-"],
1867
- [45, "D"],
1859
+ [93, "A"],
1860
+ [90, "A-"],
1861
+ [87, "B+"],
1862
+ [83, "B"],
1863
+ [80, "B-"],
1864
+ [77, "C+"],
1865
+ [73, "C"],
1866
+ [70, "C-"],
1867
+ [67, "D+"],
1868
+ [63, "D"],
1869
+ [60, "D-"],
1868
1870
  [0, "F"]
1869
1871
  ];
1870
1872
 
package/dist/cli.mjs CHANGED
@@ -4,7 +4,7 @@ import { z as z3 } from "zod";
4
4
 
5
5
  // src/modules/analyzer/constants.ts
6
6
  var DOMAIN_SIGNAL_TIMEOUT_CAP = 5e3;
7
- var VERSION = true ? "1.4.1" : "0.0.0";
7
+ var VERSION = true ? "1.4.3" : "0.0.0";
8
8
 
9
9
  // src/modules/fetcher/constants.ts
10
10
  var MAX_RESPONSE_SIZE = 10 * 1024 * 1024;
@@ -1112,13 +1112,14 @@ function auditEntityClarity(page) {
1112
1112
  }
1113
1113
  }
1114
1114
  const consistencyRatio = keyWords.length > 0 ? topicOverlap / keyWords.length : 0;
1115
- const consistencyScore = consistencyRatio >= 0.5 ? 25 : consistencyRatio > 0 ? 15 : 5;
1115
+ const consistencyScore = keyWords.length === 0 ? 0 : consistencyRatio >= 0.5 ? 25 : consistencyRatio > 0 ? 15 : 0;
1116
1116
  factors.push(
1117
1117
  makeFactor(
1118
1118
  "Topic Consistency",
1119
1119
  consistencyScore,
1120
1120
  25,
1121
- `${topicOverlap}/${keyWords.length} title keywords align with content topics`
1121
+ `${topicOverlap}/${keyWords.length} title keywords align with content topics`,
1122
+ keyWords.length === 0 ? "neutral" : void 0
1122
1123
  )
1123
1124
  );
1124
1125
  const wordCount = countWords(text);
@@ -1831,16 +1832,17 @@ function generateRecommendations(auditResult) {
1831
1832
 
1832
1833
  // src/modules/scoring/constants.ts
1833
1834
  var GRADE_THRESHOLDS = [
1834
- [95, "A+"],
1835
- [90, "A"],
1836
- [85, "A-"],
1837
- [80, "B+"],
1838
- [75, "B"],
1839
- [70, "B-"],
1840
- [65, "C+"],
1841
- [60, "C"],
1842
- [55, "C-"],
1843
- [45, "D"],
1835
+ [93, "A"],
1836
+ [90, "A-"],
1837
+ [87, "B+"],
1838
+ [83, "B"],
1839
+ [80, "B-"],
1840
+ [77, "C+"],
1841
+ [73, "C"],
1842
+ [70, "C-"],
1843
+ [67, "D+"],
1844
+ [63, "D"],
1845
+ [60, "D-"],
1844
1846
  [0, "F"]
1845
1847
  ];
1846
1848
 
package/dist/index.d.mts CHANGED
@@ -703,12 +703,13 @@ declare const GradeSchema: z.ZodEnum<{
703
703
  C: "C";
704
704
  D: "D";
705
705
  F: "F";
706
- "A+": "A+";
707
706
  "A-": "A-";
708
707
  "B+": "B+";
709
708
  "B-": "B-";
710
709
  "C+": "C+";
711
710
  "C-": "C-";
711
+ "D+": "D+";
712
+ "D-": "D-";
712
713
  }>;
713
714
  declare const ScoreSummarySchema: z.ZodObject<{
714
715
  overallScore: z.ZodNumber;
@@ -718,12 +719,13 @@ declare const ScoreSummarySchema: z.ZodObject<{
718
719
  C: "C";
719
720
  D: "D";
720
721
  F: "F";
721
- "A+": "A+";
722
722
  "A-": "A-";
723
723
  "B+": "B+";
724
724
  "B-": "B-";
725
725
  "C+": "C+";
726
726
  "C-": "C-";
727
+ "D+": "D+";
728
+ "D-": "D-";
727
729
  }>;
728
730
  totalPoints: z.ZodNumber;
729
731
  maxPoints: z.ZodNumber;
package/dist/index.d.ts CHANGED
@@ -703,12 +703,13 @@ declare const GradeSchema: z.ZodEnum<{
703
703
  C: "C";
704
704
  D: "D";
705
705
  F: "F";
706
- "A+": "A+";
707
706
  "A-": "A-";
708
707
  "B+": "B+";
709
708
  "B-": "B-";
710
709
  "C+": "C+";
711
710
  "C-": "C-";
711
+ "D+": "D+";
712
+ "D-": "D-";
712
713
  }>;
713
714
  declare const ScoreSummarySchema: z.ZodObject<{
714
715
  overallScore: z.ZodNumber;
@@ -718,12 +719,13 @@ declare const ScoreSummarySchema: z.ZodObject<{
718
719
  C: "C";
719
720
  D: "D";
720
721
  F: "F";
721
- "A+": "A+";
722
722
  "A-": "A-";
723
723
  "B+": "B+";
724
724
  "B-": "B-";
725
725
  "C+": "C+";
726
726
  "C-": "C-";
727
+ "D+": "D+";
728
+ "D-": "D-";
727
729
  }>;
728
730
  totalPoints: z.ZodNumber;
729
731
  maxPoints: z.ZodNumber;
package/dist/index.js CHANGED
@@ -1135,13 +1135,14 @@ function auditEntityClarity(page) {
1135
1135
  }
1136
1136
  }
1137
1137
  const consistencyRatio = keyWords.length > 0 ? topicOverlap / keyWords.length : 0;
1138
- const consistencyScore = consistencyRatio >= 0.5 ? 25 : consistencyRatio > 0 ? 15 : 5;
1138
+ const consistencyScore = keyWords.length === 0 ? 0 : consistencyRatio >= 0.5 ? 25 : consistencyRatio > 0 ? 15 : 0;
1139
1139
  factors.push(
1140
1140
  makeFactor(
1141
1141
  "Topic Consistency",
1142
1142
  consistencyScore,
1143
1143
  25,
1144
- `${topicOverlap}/${keyWords.length} title keywords align with content topics`
1144
+ `${topicOverlap}/${keyWords.length} title keywords align with content topics`,
1145
+ keyWords.length === 0 ? "neutral" : void 0
1145
1146
  )
1146
1147
  );
1147
1148
  const wordCount = countWords(text);
@@ -1527,7 +1528,7 @@ var import_zod = require("zod");
1527
1528
 
1528
1529
  // src/modules/analyzer/constants.ts
1529
1530
  var DOMAIN_SIGNAL_TIMEOUT_CAP = 5e3;
1530
- var VERSION = true ? "1.4.1" : "0.0.0";
1531
+ var VERSION = true ? "1.4.3" : "0.0.0";
1531
1532
 
1532
1533
  // src/modules/fetcher/schema.ts
1533
1534
  var FetchOptionsSchema = import_zod.z.object({
@@ -1860,16 +1861,17 @@ function generateRecommendations(auditResult) {
1860
1861
 
1861
1862
  // src/modules/scoring/constants.ts
1862
1863
  var GRADE_THRESHOLDS = [
1863
- [95, "A+"],
1864
- [90, "A"],
1865
- [85, "A-"],
1866
- [80, "B+"],
1867
- [75, "B"],
1868
- [70, "B-"],
1869
- [65, "C+"],
1870
- [60, "C"],
1871
- [55, "C-"],
1872
- [45, "D"],
1864
+ [93, "A"],
1865
+ [90, "A-"],
1866
+ [87, "B+"],
1867
+ [83, "B"],
1868
+ [80, "B-"],
1869
+ [77, "C+"],
1870
+ [73, "C"],
1871
+ [70, "C-"],
1872
+ [67, "D+"],
1873
+ [63, "D"],
1874
+ [60, "D-"],
1873
1875
  [0, "F"]
1874
1876
  ];
1875
1877
 
package/dist/index.mjs CHANGED
@@ -1095,13 +1095,14 @@ function auditEntityClarity(page) {
1095
1095
  }
1096
1096
  }
1097
1097
  const consistencyRatio = keyWords.length > 0 ? topicOverlap / keyWords.length : 0;
1098
- const consistencyScore = consistencyRatio >= 0.5 ? 25 : consistencyRatio > 0 ? 15 : 5;
1098
+ const consistencyScore = keyWords.length === 0 ? 0 : consistencyRatio >= 0.5 ? 25 : consistencyRatio > 0 ? 15 : 0;
1099
1099
  factors.push(
1100
1100
  makeFactor(
1101
1101
  "Topic Consistency",
1102
1102
  consistencyScore,
1103
1103
  25,
1104
- `${topicOverlap}/${keyWords.length} title keywords align with content topics`
1104
+ `${topicOverlap}/${keyWords.length} title keywords align with content topics`,
1105
+ keyWords.length === 0 ? "neutral" : void 0
1105
1106
  )
1106
1107
  );
1107
1108
  const wordCount = countWords(text);
@@ -1487,7 +1488,7 @@ import { z } from "zod";
1487
1488
 
1488
1489
  // src/modules/analyzer/constants.ts
1489
1490
  var DOMAIN_SIGNAL_TIMEOUT_CAP = 5e3;
1490
- var VERSION = true ? "1.4.1" : "0.0.0";
1491
+ var VERSION = true ? "1.4.3" : "0.0.0";
1491
1492
 
1492
1493
  // src/modules/fetcher/schema.ts
1493
1494
  var FetchOptionsSchema = z.object({
@@ -1820,16 +1821,17 @@ function generateRecommendations(auditResult) {
1820
1821
 
1821
1822
  // src/modules/scoring/constants.ts
1822
1823
  var GRADE_THRESHOLDS = [
1823
- [95, "A+"],
1824
- [90, "A"],
1825
- [85, "A-"],
1826
- [80, "B+"],
1827
- [75, "B"],
1828
- [70, "B-"],
1829
- [65, "C+"],
1830
- [60, "C"],
1831
- [55, "C-"],
1832
- [45, "D"],
1824
+ [93, "A"],
1825
+ [90, "A-"],
1826
+ [87, "B+"],
1827
+ [83, "B"],
1828
+ [80, "B-"],
1829
+ [77, "C+"],
1830
+ [73, "C"],
1831
+ [70, "C-"],
1832
+ [67, "D+"],
1833
+ [63, "D"],
1834
+ [60, "D-"],
1833
1835
  [0, "F"]
1834
1836
  ];
1835
1837
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aiseo-audit",
3
- "version": "1.4.1",
3
+ "version": "1.4.3",
4
4
  "description": "Lighthouse for AI SEO. Audit any webpage for AI search readiness. 7 categories, 30+ factors, research-backed scoring. Deterministic, engine-agnostic, zero API keys.",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",