@pseolint/core 0.6.1 → 0.6.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
@@ -1,8 +1,8 @@
1
1
  # @pseolint/core
2
2
 
3
- > Programmatic SEO audit engine for SpamBrain-risk detection across large template-generated sites.
3
+ > Programmatic SEO audit engine 45 rules, surfaced per-template, on every monitored release.
4
4
 
5
- The core engine behind [pseolint](https://www.npmjs.com/package/pseolint). Use this package to embed pSEO auditing into your own tools, CI pipelines, or SaaS products.
5
+ The core engine behind [pseolint](https://www.npmjs.com/package/pseolint) v0.6.2. Use this package to embed pSEO auditing into your own tools, CI pipelines, or SaaS products.
6
6
 
7
7
  ## Install
8
8
 
@@ -15,9 +15,19 @@ npm install @pseolint/core
15
15
  ```ts
16
16
  import { auditSource } from "@pseolint/core";
17
17
 
18
- const summary = await auditSource("./out");
19
- console.log(`Score: ${summary.score}/100`);
20
- console.log(`Findings: ${summary.findings.length}`);
18
+ const result = await auditSource("https://example.com");
19
+ console.log(`Verdict: ${result.verdict}`);
20
+ console.log(`Findings: ${result.findings.length}`);
21
+
22
+ // v0.6: per-template breakdown
23
+ for (const t of result.templates) {
24
+ console.log(`${t.signature} ${t.verdict} risk=${t.risk}`);
25
+ if (t.variance.topDriver) {
26
+ const { ruleId, fireRate } = t.variance.topDriver;
27
+ const n = Math.round(fireRate * t.auditedUrls.length);
28
+ console.log(` ${n}/${t.auditedUrls.length} samples fail ${ruleId}`);
29
+ }
30
+ }
21
31
  ```
22
32
 
23
33
  `auditSource` accepts a local directory, a single HTML file, a page URL, or a sitemap URL.
@@ -35,6 +45,70 @@ console.log(`Findings: ${summary.findings.length}`);
35
45
  - **Cannibalization** (1) — URL pattern conflicts (`title-overlap` and `keyword-collision` were dropped in v0.4 due to high false-positive rates)
36
46
  - **Data binding** (2) — verify rendered pages expose values from a source dataset (missing or identical-across-pages bindings)
37
47
 
48
+ ## What's new in v0.6 — audit-as-template
49
+
50
+ The unit of analysis is now the **template**, not the URL. When ≥2 template clusters are detected (each with ≥1% URL coverage and ≥5 pages), the engine runs a two-phase pipeline:
51
+
52
+ 1. **Template detection** — clusters the sitemap via `clusterUrlTemplates`, canonicality-verifies one sample per cluster. Cost: ~T HTTP fetches.
53
+ 2. **Per-template deep audit** — stratified-samples K pages per template (K=10 monitoring, K=20 re-audit), runs all per-page rules, tags each `RuleResult` with its `template` field, computes per-template verdict + variance.
54
+
55
+ `AuditResult.templates` is additive — old code reading `findings` continues to work.
56
+
57
+ ### `Template` type
58
+
59
+ ```ts
60
+ import type { Template, TemplateVariance, AuditResult } from "@pseolint/core";
61
+
62
+ // Each entry in result.templates:
63
+ // {
64
+ // signature: string; e.g. "/listing/:slug"
65
+ // totalUrls: number; cluster size in the sitemap
66
+ // auditedUrls: string[]; pages actually fetched in phase 2
67
+ // verdict: Verdict;
68
+ // risk: number; 0-100, independent of site-level risk
69
+ // categories: CategoryGrades;
70
+ // variance: {
71
+ // ruleFireRates: Record<string, number>; per-rule fraction of samples that fired
72
+ // uniformityScore: number; 0-1; high = same problems on every page
73
+ // topDriver: { ruleId: string; fireRate: number } | null;
74
+ // };
75
+ // findingIds: string[]; references into result.findings
76
+ // }
77
+ ```
78
+
79
+ ### `siteVerdictFromTemplates` helper
80
+
81
+ ```ts
82
+ import { siteVerdictFromTemplates } from "@pseolint/core";
83
+
84
+ // Returns the worst verdict among templates with ≥5% URL coverage.
85
+ // Falls back to "ready" when no template clears the 5% floor.
86
+ const verdict = siteVerdictFromTemplates(result.templates);
87
+ ```
88
+
89
+ ### Full example — audit a site, log per-template verdicts
90
+
91
+ ```ts
92
+ import { auditSource } from "@pseolint/core";
93
+
94
+ const result = await auditSource("https://example.com", {
95
+ samplingStrategy: "stratified",
96
+ cache: { dir: ".pseolint/cache" },
97
+ });
98
+
99
+ console.log(`Site verdict: ${result.verdict} risk: ${result.risk}`);
100
+
101
+ for (const t of result.templates) {
102
+ const td = t.variance.topDriver;
103
+ const driverLine = td
104
+ ? ` top driver: ${td.ruleId} (${Math.round(td.fireRate * 100)}% of samples)`
105
+ : "";
106
+ console.log(` ${t.signature} ${t.verdict} uniformity ${Math.round(t.variance.uniformityScore * 100)}%${driverLine}`);
107
+ }
108
+ ```
109
+
110
+ Design rationale: [`docs/superpowers/specs/2026-05-04-pseolint-v0.6-audit-as-template-reframe.md`](../../docs/superpowers/specs/2026-05-04-pseolint-v0.6-audit-as-template-reframe.md)
111
+
38
112
  ## What's new in v0.5.2 — credibility layer
39
113
 
40
114
  - **4 new content-quality rules** addressing the v0.5.1 blind-spot audit's tier-1 gaps: `content/title-uniqueness` (raw, not entity-masked — catalog templates with per-record entity values still pass), `content/heading-structure` (H1 presence, single-H1, hierarchy), `content/image-alt-text` (skips `role="presentation"` / `aria-hidden="true"` / explicit `alt=""`), `tech/og-completeness` (the README-promised rule that finally ships).
@@ -52,7 +126,7 @@ The full per-round iteration story (9 calibration rounds against a curated reput
52
126
 
53
127
  ### `auditSource(source, options?)`
54
128
 
55
- Returns an `AuditSummary` with composite score, category scores, enriched findings, and optional cache / state / AI-triage metadata.
129
+ Returns an `AuditResult` with verdict, risk score, category grades, enriched findings, and — since v0.6 — a `templates: Template[]` array with per-template verdicts and variance metrics. Also carries optional cache / state / AI-triage metadata.
56
130
 
57
131
  Selected options (see `AuditOptions` in `types.ts` for the full surface):
58
132
 
@@ -4,20 +4,32 @@
4
4
  * Loads the prebuilt Wikipedia trigram bloom filter and provides a
5
5
  * paraphrase-rate estimator. Used by content/wikipedia-paraphrase rule.
6
6
  *
7
- * Bloom filter layout (data/wikipedia-trigrams.bin):
7
+ * v0.6.2 — bloom filter inlined as base64 to remove filesystem dependency.
8
+ * Production hotfix: Vercel serverless deployments couldn't resolve the
9
+ * relative file path. Inlining the 8 KB binary into the JS source removes
10
+ * deployment-config dependencies and makes the rule work in any runtime
11
+ * (Node, Bun, Cloudflare Workers, Vercel serverless, etc.).
12
+ *
13
+ * Bloom filter layout:
8
14
  * m = 65536 bits (8192 bytes)
9
15
  * k = 3 FNV-1a-32 hash functions with distinct seeds
10
16
  *
11
17
  * FP rate ~5% for the curated corpus of ~10 k unique trigrams.
18
+ *
19
+ * If the underlying corpus is regenerated via `bun run build-wikipedia-bloom`,
20
+ * also re-run the inline script that produced BLOOM_BASE64 below — see
21
+ * `scripts/inline-wikipedia-bloom.ts` (or regenerate manually):
22
+ * node -e "console.log(require(node:fs).readFileSync(packages/core/data/wikipedia-trigrams.bin).toString(base64))"
12
23
  */
13
- /** Load and cache the bloom filter binary. */
24
+ /** Decode and cache the bloom filter from the inlined base64 string. */
14
25
  export declare function loadWikipediaBloomFilter(): Uint8Array;
15
26
  /**
16
- * Compute the fraction of the text's trigrams that match the Wikipedia
17
- * bloom filter. Returns a 0-1 ratio. Returns 0 for text with fewer than
18
- * 3 words (no trigrams extractable).
27
+ * Compute the paraphrase rate of `text` against the Wikipedia reference
28
+ * corpus. Returns a value in [0, 1] the fraction of trigrams that are
29
+ * present in the bloom filter. Returns 0 for text shorter than 3 tokens.
19
30
  */
20
31
  export declare function wikipediaParaphraseRate(text: string): number;
21
- /** Reset the in-memory cache. For testing purposes only. */
32
+ /** Test-only: reset the bloom-filter cache so loadWikipediaBloomFilter
33
+ * re-decodes the inlined base64 on next call. Used by unit tests. */
22
34
  export declare function _resetBloomCache(): void;
23
35
  //# sourceMappingURL=wikipedia-paraphrase.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wikipedia-paraphrase.d.ts","sourceRoot":"","sources":["../../src/algorithms/wikipedia-paraphrase.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAyBH,8CAA8C;AAC9C,wBAAgB,wBAAwB,IAAI,UAAU,CAKrD;AAuBD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAU5D;AAED,4DAA4D;AAC5D,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
1
+ {"version":3,"file":"wikipedia-paraphrase.d.ts","sourceRoot":"","sources":["../../src/algorithms/wikipedia-paraphrase.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAoBH,wEAAwE;AACxE,wBAAgB,wBAAwB,IAAI,UAAU,CAUrD;AAuBD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAS5D;AAED;sEACsE;AACtE,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
@@ -4,17 +4,24 @@
4
4
  * Loads the prebuilt Wikipedia trigram bloom filter and provides a
5
5
  * paraphrase-rate estimator. Used by content/wikipedia-paraphrase rule.
6
6
  *
7
- * Bloom filter layout (data/wikipedia-trigrams.bin):
7
+ * v0.6.2 — bloom filter inlined as base64 to remove filesystem dependency.
8
+ * Production hotfix: Vercel serverless deployments couldn't resolve the
9
+ * relative file path. Inlining the 8 KB binary into the JS source removes
10
+ * deployment-config dependencies and makes the rule work in any runtime
11
+ * (Node, Bun, Cloudflare Workers, Vercel serverless, etc.).
12
+ *
13
+ * Bloom filter layout:
8
14
  * m = 65536 bits (8192 bytes)
9
15
  * k = 3 FNV-1a-32 hash functions with distinct seeds
10
16
  *
11
17
  * FP rate ~5% for the curated corpus of ~10 k unique trigrams.
18
+ *
19
+ * If the underlying corpus is regenerated via `bun run build-wikipedia-bloom`,
20
+ * also re-run the inline script that produced BLOOM_BASE64 below — see
21
+ * `scripts/inline-wikipedia-bloom.ts` (or regenerate manually):
22
+ * node -e "console.log(require(node:fs).readFileSync(packages/core/data/wikipedia-trigrams.bin).toString(base64))"
12
23
  */
13
- import { readFileSync } from "node:fs";
14
- import { join, dirname } from "node:path";
15
- import { fileURLToPath } from "node:url";
16
- const __dirname = dirname(fileURLToPath(import.meta.url));
17
- const DATA_PATH = join(__dirname, "..", "..", "data", "wikipedia-trigrams.bin");
24
+ const BLOOM_BASE64 = "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";
18
25
  const BLOOM_BITS = 65536;
19
26
  const BLOOM_K = 3;
20
27
  const FNV_PRIME = 0x01000193;
@@ -28,12 +35,17 @@ function fnv1a32(str, seed) {
28
35
  return hash;
29
36
  }
30
37
  let _cache = null;
31
- /** Load and cache the bloom filter binary. */
38
+ /** Decode and cache the bloom filter from the inlined base64 string. */
32
39
  export function loadWikipediaBloomFilter() {
33
40
  if (_cache !== null)
34
41
  return _cache;
35
- const buf = readFileSync(DATA_PATH);
36
- _cache = new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
42
+ // Buffer.from is available in Node + Bun. For browser/edge runtimes that
43
+ // lack it, atob + manual conversion would be the fallback (not needed yet
44
+ // — the engine runs server-side only).
45
+ const decoded = typeof Buffer !== "undefined"
46
+ ? Buffer.from(BLOOM_BASE64, "base64")
47
+ : Uint8Array.from(atob(BLOOM_BASE64), (c) => c.charCodeAt(0));
48
+ _cache = new Uint8Array(decoded.buffer, decoded.byteOffset, decoded.byteLength);
37
49
  return _cache;
38
50
  }
39
51
  function bloomQuery(bits, trigram) {
@@ -57,25 +69,24 @@ function extractTrigrams(text) {
57
69
  return trigrams;
58
70
  }
59
71
  /**
60
- * Compute the fraction of the text's trigrams that match the Wikipedia
61
- * bloom filter. Returns a 0-1 ratio. Returns 0 for text with fewer than
62
- * 3 words (no trigrams extractable).
72
+ * Compute the paraphrase rate of `text` against the Wikipedia reference
73
+ * corpus. Returns a value in [0, 1] the fraction of trigrams that are
74
+ * present in the bloom filter. Returns 0 for text shorter than 3 tokens.
63
75
  */
64
76
  export function wikipediaParaphraseRate(text) {
65
- if (!text || text.trim().length === 0)
66
- return 0;
67
77
  const trigrams = extractTrigrams(text);
68
78
  if (trigrams.length === 0)
69
79
  return 0;
70
80
  const bits = loadWikipediaBloomFilter();
71
- let matched = 0;
72
- for (const t of trigrams) {
73
- if (bloomQuery(bits, t))
74
- matched++;
81
+ let hits = 0;
82
+ for (const tg of trigrams) {
83
+ if (bloomQuery(bits, tg))
84
+ hits += 1;
75
85
  }
76
- return matched / trigrams.length;
86
+ return hits / trigrams.length;
77
87
  }
78
- /** Reset the in-memory cache. For testing purposes only. */
88
+ /** Test-only: reset the bloom-filter cache so loadWikipediaBloomFilter
89
+ * re-decodes the inlined base64 on next call. Used by unit tests. */
79
90
  export function _resetBloomCache() {
80
91
  _cache = null;
81
92
  }
@@ -1 +1 @@
1
- {"version":3,"file":"wikipedia-paraphrase.js","sourceRoot":"","sources":["../../src/algorithms/wikipedia-paraphrase.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wikipedia-paraphrase.js","sourceRoot":"","sources":["../../src/algorithms/wikipedia-paraphrase.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,15 @@
1
1
  import type { ParsedPage, RuleResult } from "../../types.js";
2
2
  export declare function robotsSitemapPresenceRule(source: string): Promise<RuleResult[]>;
3
+ /**
4
+ * Parse all `Sitemap:` directive URLs from a robots.txt string.
5
+ *
6
+ * Case-insensitive per the Sitemaps protocol spec. Multiple occurrences are
7
+ * allowed and all are returned. Comment lines and blank lines are skipped.
8
+ * Leading/trailing whitespace around the URL value is stripped.
9
+ *
10
+ * Returns `[]` when no `Sitemap:` directives are present.
11
+ */
12
+ export declare function parseSitemapDirectives(robotsTxt: string): string[];
3
13
  /**
4
14
  * Parses Disallow directives from the `User-agent: *` block of a robots.txt string.
5
15
  * Returns an array of raw pattern strings (e.g. "/secret", "/templates/", "/*.json").
@@ -1 +1 @@
1
- {"version":3,"file":"robots-sitemap-presence.d.ts","sourceRoot":"","sources":["../../../src/rules/tech/robots-sitemap-presence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAc7D,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAqDrF;AAED;;;GAGG;AACH,6FAA6F;AAC7F,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAmBhE;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,GAAE,SAAS,MAAM,EAAU,GAAG,MAAM,EAAE,CA+BxG;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CA8B5E;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,UAAU,EAAE,EACnB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,EACxB,gBAAgB,EAAE,MAAM,GACvB,UAAU,EAAE,CA+Bd"}
1
+ {"version":3,"file":"robots-sitemap-presence.d.ts","sourceRoot":"","sources":["../../../src/rules/tech/robots-sitemap-presence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAc7D,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAqDrF;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAYlE;AAED;;;GAGG;AACH,6FAA6F;AAC7F,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAmBhE;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,GAAE,SAAS,MAAM,EAAU,GAAG,MAAM,EAAE,CA+BxG;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CA8B5E;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,UAAU,EAAE,EACnB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,EACxB,gBAAgB,EAAE,MAAM,GACvB,UAAU,EAAE,CA+Bd"}
@@ -58,6 +58,30 @@ export async function robotsSitemapPresenceRule(source) {
58
58
  }
59
59
  return findings;
60
60
  }
61
+ /**
62
+ * Parse all `Sitemap:` directive URLs from a robots.txt string.
63
+ *
64
+ * Case-insensitive per the Sitemaps protocol spec. Multiple occurrences are
65
+ * allowed and all are returned. Comment lines and blank lines are skipped.
66
+ * Leading/trailing whitespace around the URL value is stripped.
67
+ *
68
+ * Returns `[]` when no `Sitemap:` directives are present.
69
+ */
70
+ export function parseSitemapDirectives(robotsTxt) {
71
+ const sitemaps = [];
72
+ for (const rawLine of robotsTxt.split(/\r?\n/)) {
73
+ const line = rawLine.trim();
74
+ if (!line || line.startsWith("#"))
75
+ continue;
76
+ const m = /^sitemap\s*:\s*(.+)/i.exec(line);
77
+ if (m) {
78
+ const url = m[1].trim();
79
+ if (url)
80
+ sitemaps.push(url);
81
+ }
82
+ }
83
+ return sitemaps;
84
+ }
61
85
  /**
62
86
  * Parses Disallow directives from the `User-agent: *` block of a robots.txt string.
63
87
  * Returns an array of raw pattern strings (e.g. "/secret", "/templates/", "/*.json").
@@ -1 +1 @@
1
- {"version":3,"file":"robots-sitemap-presence.js","sourceRoot":"","sources":["../../../src/rules/tech/robots-sitemap-presence.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"robots-sitemap-presence.js","sourceRoot":"","sources":["../../../src/rules/tech/robots-sitemap-presence.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pseolint/core",
3
- "version": "0.6.1",
3
+ "version": "0.6.3",
4
4
  "description": "Programmatic SEO audit engine — 32 rules across 4 categories (integrity, discoverability, citation, data) for SpamBrain risk + AI Overview citability. v0.4 verdict ladder + site classifier.",
5
5
  "license": "MIT",
6
6
  "author": "Ouranos Labs <contact@ouranos-labs.dev>",
@@ -31,8 +31,7 @@
31
31
  "node": ">=18"
32
32
  },
33
33
  "files": [
34
- "dist",
35
- "data/wikipedia-trigrams.bin"
34
+ "dist"
36
35
  ],
37
36
  "scripts": {
38
37
  "build": "tsc -p tsconfig.json",
Binary file