@se-studio/site-check 1.1.3 → 1.3.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/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Upstream CMS SEO tooling from pedestal-sites: JSON-LD `@context` fix, new `@se-studio/cms-seo` package, production HTML audit in site-check, and `cms-seo-audit` agent skill.
8
+
9
+ ## 1.2.0
10
+
11
+ ### Minor Changes
12
+
13
+ - Add production HTML SEO audit module (`@se-studio/site-check/production-audit`) — sitemap crawl, title/meta/H1/schema/markdown checks, CSV and markdown reports, Rich Results spot-checks.
14
+
3
15
  ## 1.1.3
4
16
 
5
17
  ### Patch Changes
@@ -0,0 +1,84 @@
1
+ export interface ProductionSeoAuditConfig {
2
+ baseUrl: string;
3
+ /** Site display title for homepage and generic-title checks */
4
+ siteTitle: string;
5
+ trailingSlash?: boolean;
6
+ sitemapPath?: string;
7
+ markdownIndexPath?: string;
8
+ articlePathPrefixes?: string[];
9
+ outputDir: string;
10
+ outputCsvName?: string;
11
+ outputMdName?: string;
12
+ concurrency?: number;
13
+ /** Minimum visible text length in <main> (or body fallback) */
14
+ thinContentThreshold?: number;
15
+ /** Minimum markdown body length */
16
+ minMarkdownLength?: number;
17
+ requestDelayMs?: number;
18
+ /** Path prefixes where .md export is not expected (e.g. PDF download routes) */
19
+ skipMarkdownPathPrefixes?: string[];
20
+ }
21
+ export interface ProductionSeoAuditRow {
22
+ url: string;
23
+ finalUrl: string;
24
+ httpStatus: number;
25
+ title: string;
26
+ description: string;
27
+ descLen: number;
28
+ h1: string;
29
+ mainTextLen: number;
30
+ canonical: string;
31
+ noindex: boolean;
32
+ jsonldCount: number;
33
+ jsonldErrors: string;
34
+ schemaTypes: string;
35
+ titleFlags: string;
36
+ descFlags: string;
37
+ schemaFlags: string;
38
+ contentFlags: string;
39
+ mdStatus: number;
40
+ mdLen: number;
41
+ mdCanonicalOk: boolean;
42
+ allFlags: string;
43
+ severity: 'ok' | 'warn' | 'error';
44
+ }
45
+ export interface ProductionSeoAuditResult {
46
+ rows: ProductionSeoAuditRow[];
47
+ sitemapUrlCount: number;
48
+ markdownIndexUrlCount: number;
49
+ missingFromMarkdownIndex: string[];
50
+ flagCounts: Record<string, number>;
51
+ errorCount: number;
52
+ warnCount: number;
53
+ }
54
+ export declare function htmlUrlToMarkdownUrl(pageUrl: string): string;
55
+ export declare function parseMarkdownIndexUrls(text: string, baseUrl: string): string[];
56
+ /** CMS Mustache placeholders ({{var}} / {{{var}}}), not JSON `}}` closers or `{search_term_string}`. */
57
+ export declare function hasUnfilledMustache(text: string): boolean;
58
+ export declare function runProductionSeoAudit(config: ProductionSeoAuditConfig): Promise<ProductionSeoAuditResult>;
59
+ export declare function rowsToCsv(rows: ProductionSeoAuditRow[]): string;
60
+ export interface RichResultsSpotCheck {
61
+ label: string;
62
+ url: string;
63
+ result: 'pass' | 'fail' | 'warn';
64
+ notes: string;
65
+ }
66
+ export declare function evaluateRichResultsSpotCheck(input: {
67
+ label: string;
68
+ url: string;
69
+ httpStatus: number;
70
+ schemaTypes: Set<string>;
71
+ jsonldErrors: string[];
72
+ }): RichResultsSpotCheck;
73
+ export declare function pickRichResultsSampleUrls(rows: ProductionSeoAuditRow[], baseUrl: string): {
74
+ label: string;
75
+ url: string;
76
+ }[];
77
+ export declare function buildRichResultsSpotChecks(rows: ProductionSeoAuditRow[], config: ProductionSeoAuditConfig): RichResultsSpotCheck[];
78
+ export declare function buildMarkdownReport(result: ProductionSeoAuditResult, config: ProductionSeoAuditConfig, richResults?: RichResultsSpotCheck[]): string;
79
+ export declare function writeProductionSeoAuditOutputs(result: ProductionSeoAuditResult, config: ProductionSeoAuditConfig, richResults?: RichResultsSpotCheck[]): Promise<{
80
+ csvPath: string;
81
+ mdPath: string;
82
+ }>;
83
+ export declare function getProductionAuditExitCode(result: ProductionSeoAuditResult): number;
84
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/production-audit/index.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,mCAAmC;IACnC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gFAAgF;IAChF,wBAAwB,CAAC,EAAE,MAAM,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,IAAI,GAAG,MAAM,GAAG,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,qBAAqB,EAAE,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,wBAAwB,EAAE,MAAM,EAAE,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAkDD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAW5D;AAcD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAe9E;AAoID,wGAAwG;AACxG,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzD;AA8ND,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,wBAAwB,GAC/B,OAAO,CAAC,wBAAwB,CAAC,CAgKnC;AA2BD,wBAAgB,SAAS,CAAC,IAAI,EAAE,qBAAqB,EAAE,GAAG,MAAM,CAiC/D;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB,GAAG,oBAAoB,CAuDvB;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,qBAAqB,EAAE,EAC7B,OAAO,EAAE,MAAM,GACd;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,CAoClC;AAED,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,qBAAqB,EAAE,EAC7B,MAAM,EAAE,wBAAwB,GAC/B,oBAAoB,EAAE,CAwBxB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,wBAAwB,EAChC,MAAM,EAAE,wBAAwB,EAChC,WAAW,CAAC,EAAE,oBAAoB,EAAE,GACnC,MAAM,CAyER;AAED,wBAAsB,8BAA8B,CAClD,MAAM,EAAE,wBAAwB,EAChC,MAAM,EAAE,wBAAwB,EAChC,WAAW,CAAC,EAAE,oBAAoB,EAAE,GACnC,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAW9C;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,wBAAwB,GAAG,MAAM,CAEnF"}
@@ -0,0 +1,794 @@
1
+ import { mkdir, writeFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ const STOPWORDS = new Set([
4
+ 'a',
5
+ 'an',
6
+ 'and',
7
+ 'are',
8
+ 'as',
9
+ 'at',
10
+ 'be',
11
+ 'by',
12
+ 'for',
13
+ 'from',
14
+ 'in',
15
+ 'is',
16
+ 'it',
17
+ 'of',
18
+ 'on',
19
+ 'or',
20
+ 'the',
21
+ 'to',
22
+ 'with',
23
+ 'our',
24
+ 'your',
25
+ 'we',
26
+ 'us',
27
+ ]);
28
+ function escapeCsv(value) {
29
+ if (/[",\n]/.test(value))
30
+ return `"${value.replace(/"/g, '""')}"`;
31
+ return value;
32
+ }
33
+ function normalizeBaseUrl(baseUrl) {
34
+ return baseUrl.replace(/\/$/, '');
35
+ }
36
+ function normalizePageUrl(url, trailingSlash) {
37
+ const parsed = new URL(url);
38
+ let pathname = parsed.pathname;
39
+ if (pathname !== '/' && trailingSlash && !pathname.endsWith('/')) {
40
+ pathname = `${pathname}/`;
41
+ }
42
+ if (pathname !== '/' && !trailingSlash && pathname.endsWith('/')) {
43
+ pathname = pathname.slice(0, -1);
44
+ }
45
+ parsed.pathname = pathname;
46
+ return parsed.toString();
47
+ }
48
+ export function htmlUrlToMarkdownUrl(pageUrl) {
49
+ const parsed = new URL(pageUrl);
50
+ if (parsed.pathname === '/' || parsed.pathname === '') {
51
+ parsed.pathname = '/index.md';
52
+ return parsed.toString();
53
+ }
54
+ const path = parsed.pathname.endsWith('/')
55
+ ? `${parsed.pathname.slice(0, -1)}.md`
56
+ : `${parsed.pathname}.md`;
57
+ parsed.pathname = path;
58
+ return parsed.toString();
59
+ }
60
+ function parseSitemapLocs(xml) {
61
+ const locs = [];
62
+ const re = /<loc>\s*([^<]+?)\s*<\/loc>/gi;
63
+ let match = re.exec(xml);
64
+ while (match) {
65
+ const loc = match[1];
66
+ if (loc)
67
+ locs.push(loc.trim());
68
+ match = re.exec(xml);
69
+ }
70
+ return [...new Set(locs)];
71
+ }
72
+ export function parseMarkdownIndexUrls(text, baseUrl) {
73
+ const base = normalizeBaseUrl(baseUrl);
74
+ const urls = [];
75
+ for (const line of text.split('\n')) {
76
+ const trimmed = line.trim();
77
+ if (!trimmed.startsWith('http'))
78
+ continue;
79
+ let htmlUrl = trimmed;
80
+ if (htmlUrl.endsWith('/index.md')) {
81
+ htmlUrl = `${base}/`;
82
+ }
83
+ else if (htmlUrl.endsWith('.md')) {
84
+ htmlUrl = `${htmlUrl.slice(0, -3)}/`;
85
+ }
86
+ urls.push(normalizePageUrl(htmlUrl, true));
87
+ }
88
+ return urls;
89
+ }
90
+ function stripHtml(html) {
91
+ return html
92
+ .replace(/<script[\s\S]*?<\/script>/gi, ' ')
93
+ .replace(/<style[\s\S]*?<\/style>/gi, ' ')
94
+ .replace(/<[^>]+>/g, ' ')
95
+ .replace(/\s+/g, ' ')
96
+ .trim();
97
+ }
98
+ function extractAttr(tag, attr) {
99
+ const re = new RegExp(`${attr}\\s*=\\s*["']([^"']*)["']`, 'i');
100
+ const m = tag.match(re);
101
+ return m?.[1];
102
+ }
103
+ function extractMetaContent(html, name) {
104
+ const re = new RegExp(`<meta[^>]+(?:name=["']${name}["'][^>]+content=["']([^"']*)["']|content=["']([^"']*)["'][^>]+name=["']${name}["'])`, 'i');
105
+ const m = html.match(re);
106
+ return (m?.[1] ?? m?.[2] ?? '').trim();
107
+ }
108
+ function extractTitle(html) {
109
+ const m = html.match(/<title[^>]*>([\s\S]*?)<\/title>/i);
110
+ return m?.[1] ? stripHtml(m[1]) : '';
111
+ }
112
+ function extractCanonical(html) {
113
+ const tags = html.match(/<link[^>]+>/gi) ?? [];
114
+ for (const tag of tags) {
115
+ if (!/rel=["']canonical["']/i.test(tag))
116
+ continue;
117
+ return extractAttr(tag, 'href') ?? '';
118
+ }
119
+ return '';
120
+ }
121
+ function extractH1(html) {
122
+ const m = html.match(/<h1[^>]*>([\s\S]*?)<\/h1>/i);
123
+ return m?.[1] ? stripHtml(m[1]) : '';
124
+ }
125
+ function extractMainTextLen(html) {
126
+ const mainMatch = html.match(/<main[^>]*>([\s\S]*?)<\/main>/i);
127
+ if (mainMatch?.[1])
128
+ return stripHtml(mainMatch[1]).length;
129
+ let body = html.replace(/<nav[\s\S]*?<\/nav>/gi, ' ');
130
+ body = body.replace(/<footer[\s\S]*?<\/footer>/gi, ' ');
131
+ const bodyMatch = body.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
132
+ return bodyMatch?.[1] ? stripHtml(bodyMatch[1]).length : stripHtml(html).length;
133
+ }
134
+ function extractJsonLdBlocks(html) {
135
+ const blocks = [];
136
+ const re = /<script[^>]*type=["']application\/ld\+json["'][^>]*>([\s\S]*?)<\/script>/gi;
137
+ let match = re.exec(html);
138
+ while (match) {
139
+ const block = match[1];
140
+ if (block)
141
+ blocks.push(block.trim());
142
+ match = re.exec(html);
143
+ }
144
+ return blocks;
145
+ }
146
+ function significantTokens(text) {
147
+ const tokens = new Set();
148
+ for (const raw of text.toLowerCase().split(/[^a-z0-9]+/)) {
149
+ if (raw.length < 2 || STOPWORDS.has(raw))
150
+ continue;
151
+ tokens.add(raw);
152
+ }
153
+ return tokens;
154
+ }
155
+ function tokenOverlap(a, b) {
156
+ let count = 0;
157
+ for (const t of a) {
158
+ if (b.has(t))
159
+ count++;
160
+ }
161
+ return count;
162
+ }
163
+ function stripBrandSuffix(title, siteTitle) {
164
+ const suffix = `| ${siteTitle}`;
165
+ if (title.endsWith(suffix))
166
+ return title.slice(0, -suffix.length).trim();
167
+ return title;
168
+ }
169
+ function slugTokens(pathname) {
170
+ const segments = pathname
171
+ .replace(/^\/|\/$/g, '')
172
+ .split('/')
173
+ .filter(Boolean);
174
+ const last = segments.at(-1) ?? '';
175
+ return significantTokens(last.replace(/-/g, ' '));
176
+ }
177
+ function collectSchemaTypes(value, types) {
178
+ if (!value || typeof value !== 'object')
179
+ return;
180
+ if (Array.isArray(value)) {
181
+ for (const item of value)
182
+ collectSchemaTypes(item, types);
183
+ return;
184
+ }
185
+ const obj = value;
186
+ if (typeof obj['@type'] === 'string')
187
+ types.add(obj['@type']);
188
+ if (Array.isArray(obj['@type'])) {
189
+ for (const t of obj['@type']) {
190
+ if (typeof t === 'string')
191
+ types.add(t);
192
+ }
193
+ }
194
+ if (obj['@graph'])
195
+ collectSchemaTypes(obj['@graph'], types);
196
+ for (const v of Object.values(obj)) {
197
+ if (v && typeof v === 'object')
198
+ collectSchemaTypes(v, types);
199
+ }
200
+ }
201
+ function parseLinkCanonical(headers) {
202
+ const link = headers.get('link');
203
+ if (!link)
204
+ return undefined;
205
+ const m = link.match(/<([^>]+)>;\s*rel="canonical"/i);
206
+ return m?.[1];
207
+ }
208
+ function urlsEquivalent(a, b, trailingSlash) {
209
+ try {
210
+ return normalizePageUrl(a, trailingSlash) === normalizePageUrl(b, trailingSlash);
211
+ }
212
+ catch {
213
+ return a === b;
214
+ }
215
+ }
216
+ /** CMS Mustache placeholders ({{var}} / {{{var}}}), not JSON `}}` closers or `{search_term_string}`. */
217
+ export function hasUnfilledMustache(text) {
218
+ return /\{\{\{[^}]+\}\}\}/.test(text) || /\{\{[^}]+\}\}/.test(text);
219
+ }
220
+ function shouldSkipMarkdown(pathname, prefixes) {
221
+ return prefixes.some((p) => pathname.startsWith(p.startsWith('/') ? p : `/${p}`));
222
+ }
223
+ function classifyRow(input) {
224
+ const titleFlags = [];
225
+ const descFlags = [];
226
+ const schemaFlags = [];
227
+ const contentFlags = [];
228
+ const jsonldErrors = [];
229
+ const schemaTypes = new Set();
230
+ const isHome = input.pathname === '/' || input.pathname === '';
231
+ if (input.httpStatus !== 200)
232
+ contentFlags.push('http_error');
233
+ if (!input.title) {
234
+ titleFlags.push('missing_title');
235
+ }
236
+ else if (isHome) {
237
+ if (input.title !== input.siteTitle)
238
+ titleFlags.push('homepage_title_unexpected');
239
+ }
240
+ else {
241
+ const titleCore = stripBrandSuffix(input.title, input.siteTitle);
242
+ if (titleCore === input.siteTitle)
243
+ titleFlags.push('generic_title');
244
+ const slugTok = slugTokens(input.pathname);
245
+ const titleTok = significantTokens(titleCore);
246
+ const h1Tok = significantTokens(input.h1);
247
+ if (slugTok.size > 0 &&
248
+ tokenOverlap(slugTok, titleTok) === 0 &&
249
+ tokenOverlap(slugTok, h1Tok) === 0) {
250
+ titleFlags.push('title_slug_mismatch');
251
+ }
252
+ const h1WordCount = input.h1.split(/\s+/).filter(Boolean).length;
253
+ if (h1WordCount >= 4 && tokenOverlap(significantTokens(titleCore), h1Tok) < 1) {
254
+ titleFlags.push('title_h1_mismatch');
255
+ }
256
+ for (const prefix of input.articlePathPrefixes) {
257
+ if (!input.pathname.startsWith(`/${prefix}/`))
258
+ continue;
259
+ const segments = input.pathname.replace(`/${prefix}/`, '').split('/').filter(Boolean);
260
+ if (segments.length < 2)
261
+ continue;
262
+ const articleSlug = segments.at(-1) ?? '';
263
+ const slugWords = significantTokens(articleSlug.replace(/-/g, ' '));
264
+ if (slugWords.size > 0 && tokenOverlap(slugWords, titleTok) === 0) {
265
+ titleFlags.push('article_title_slug_mismatch');
266
+ }
267
+ }
268
+ }
269
+ if (!input.description) {
270
+ descFlags.push('missing_description');
271
+ }
272
+ else {
273
+ if (hasUnfilledMustache(input.description))
274
+ descFlags.push('mustache_leak');
275
+ if (input.description.length < 50)
276
+ descFlags.push('short_description');
277
+ else if (input.description.length > 160)
278
+ descFlags.push('long_description');
279
+ else if (input.description.length < 120)
280
+ descFlags.push('suboptimal_description');
281
+ }
282
+ const thinContentExempt = /^\/(tags|categories|resources\/news|resources\/publications)\//.test(input.pathname) &&
283
+ input.pathname.split('/').filter(Boolean).length <= 3;
284
+ if (input.mainTextLen < input.thinContentThreshold &&
285
+ input.httpStatus === 200 &&
286
+ !thinContentExempt) {
287
+ contentFlags.push('thin_content');
288
+ }
289
+ if (input.jsonLdBlocks.length === 0 && !input.noindex && input.httpStatus === 200) {
290
+ schemaFlags.push('missing_jsonld');
291
+ }
292
+ for (const block of input.jsonLdBlocks) {
293
+ if (hasUnfilledMustache(block))
294
+ schemaFlags.push('unfilled_mustache');
295
+ try {
296
+ const parsed = JSON.parse(block);
297
+ const serialized = JSON.stringify(parsed);
298
+ if (!/schema\.org/i.test(serialized))
299
+ schemaFlags.push('missing_schema_context');
300
+ collectSchemaTypes(parsed, schemaTypes);
301
+ const hasType = schemaTypes.size > 0;
302
+ if (!hasType)
303
+ schemaFlags.push('missing_schema_type');
304
+ }
305
+ catch {
306
+ jsonldErrors.push('invalid_json');
307
+ }
308
+ }
309
+ if (isHome && input.httpStatus === 200 && !input.noindex) {
310
+ if (!schemaTypes.has('Organization'))
311
+ schemaFlags.push('expected_organization');
312
+ if (!schemaTypes.has('WebSite'))
313
+ schemaFlags.push('expected_website');
314
+ }
315
+ if (input.pathname.startsWith('/people/') && input.httpStatus === 200) {
316
+ if (!schemaTypes.has('Person') && !schemaTypes.has('ProfilePage')) {
317
+ schemaFlags.push('expected_person_schema');
318
+ }
319
+ }
320
+ for (const prefix of input.articlePathPrefixes) {
321
+ if (input.pathname.startsWith(`/${prefix}/`) && input.pathname.split('/').length > 3) {
322
+ if (!schemaTypes.has('BlogPosting') &&
323
+ !schemaTypes.has('ScholarlyArticle') &&
324
+ !schemaTypes.has('NewsArticle')) {
325
+ schemaFlags.push('expected_article_schema');
326
+ }
327
+ }
328
+ if (input.pathname === `/${prefix}/` || input.pathname === `/${prefix}`) {
329
+ if (!schemaTypes.has('CollectionPage'))
330
+ schemaFlags.push('expected_collection_page');
331
+ }
332
+ }
333
+ if (input.pathname.startsWith('/categories/') && input.httpStatus === 200) {
334
+ if (!schemaTypes.has('CollectionPage'))
335
+ schemaFlags.push('expected_collection_page');
336
+ }
337
+ if (input.expectMarkdown) {
338
+ if (input.mdStatus !== 200) {
339
+ contentFlags.push('markdown_missing');
340
+ }
341
+ else if (input.mdLen < 50) {
342
+ contentFlags.push('markdown_empty');
343
+ }
344
+ if (input.mdCanonical &&
345
+ !urlsEquivalent(input.mdCanonical, input.pageUrl, input.trailingSlash)) {
346
+ contentFlags.push('markdown_canonical_mismatch');
347
+ }
348
+ }
349
+ const errorFlags = new Set([
350
+ 'http_error',
351
+ 'missing_title',
352
+ 'missing_description',
353
+ 'mustache_leak',
354
+ 'missing_jsonld',
355
+ 'invalid_json',
356
+ 'unfilled_mustache',
357
+ 'markdown_missing',
358
+ 'markdown_empty',
359
+ 'markdown_canonical_mismatch',
360
+ ]);
361
+ const all = [...titleFlags, ...descFlags, ...schemaFlags, ...contentFlags, ...jsonldErrors];
362
+ let severity = 'ok';
363
+ if (all.some((f) => errorFlags.has(f)))
364
+ severity = 'error';
365
+ else if (all.length > 0)
366
+ severity = 'warn';
367
+ return {
368
+ titleFlags,
369
+ descFlags,
370
+ schemaFlags,
371
+ contentFlags,
372
+ jsonldErrors,
373
+ schemaTypes,
374
+ severity,
375
+ };
376
+ }
377
+ async function fetchWithTimeout(url, init, timeoutMs = 30_000) {
378
+ const controller = new AbortController();
379
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
380
+ try {
381
+ return await fetch(url, { ...init, signal: controller.signal, redirect: 'follow' });
382
+ }
383
+ finally {
384
+ clearTimeout(timer);
385
+ }
386
+ }
387
+ async function mapPool(items, concurrency, fn) {
388
+ const results = new Array(items.length);
389
+ let nextIndex = 0;
390
+ async function worker() {
391
+ while (true) {
392
+ const i = nextIndex++;
393
+ if (i >= items.length)
394
+ return;
395
+ const item = items[i];
396
+ if (item === undefined)
397
+ return;
398
+ results[i] = await fn(item, i);
399
+ }
400
+ }
401
+ await Promise.all(Array.from({ length: Math.min(concurrency, items.length) }, () => worker()));
402
+ return results;
403
+ }
404
+ export async function runProductionSeoAudit(config) {
405
+ const base = normalizeBaseUrl(config.baseUrl);
406
+ const trailingSlash = config.trailingSlash ?? true;
407
+ const sitemapUrl = `${base}${config.sitemapPath ?? '/sitemap.xml'}`;
408
+ const markdownIndexUrl = `${base}${config.markdownIndexPath ?? '/markdown-index.txt'}`;
409
+ const concurrency = config.concurrency ?? 8;
410
+ const thinContentThreshold = config.thinContentThreshold ?? 200;
411
+ const minMarkdownLength = config.minMarkdownLength ?? 50;
412
+ const requestDelayMs = config.requestDelayMs ?? 0;
413
+ const articlePathPrefixes = config.articlePathPrefixes ?? [];
414
+ const skipMarkdownPathPrefixes = config.skipMarkdownPathPrefixes ?? ['/download/'];
415
+ const sitemapRes = await fetchWithTimeout(sitemapUrl);
416
+ if (!sitemapRes.ok)
417
+ throw new Error(`Failed to fetch sitemap: ${sitemapRes.status} ${sitemapUrl}`);
418
+ const sitemapXml = await sitemapRes.text();
419
+ const sitemapUrls = parseSitemapLocs(sitemapXml).map((u) => normalizePageUrl(u, trailingSlash));
420
+ let markdownIndexUrls = [];
421
+ try {
422
+ const indexRes = await fetchWithTimeout(markdownIndexUrl);
423
+ if (indexRes.ok) {
424
+ const indexText = await indexRes.text();
425
+ markdownIndexUrls = parseMarkdownIndexUrls(indexText, base);
426
+ }
427
+ }
428
+ catch {
429
+ // optional cross-check
430
+ }
431
+ const markdownSet = new Set(markdownIndexUrls.map((u) => normalizePageUrl(u, trailingSlash)));
432
+ const missingFromMarkdownIndex = sitemapUrls.filter((u) => !markdownSet.has(u));
433
+ const rows = await mapPool(sitemapUrls, concurrency, async (pageUrl) => {
434
+ if (requestDelayMs > 0)
435
+ await new Promise((r) => setTimeout(r, requestDelayMs));
436
+ const htmlRes = await fetchWithTimeout(pageUrl, {
437
+ headers: { Accept: 'text/html', 'User-Agent': 'PedestalProductionSeoAudit/1.0' },
438
+ });
439
+ const html = htmlRes.ok ? await htmlRes.text() : '';
440
+ const pathname = new URL(htmlRes.url || pageUrl).pathname;
441
+ const title = extractTitle(html);
442
+ const description = extractMetaContent(html, 'description');
443
+ const h1 = extractH1(html);
444
+ const mainTextLen = extractMainTextLen(html);
445
+ const canonical = extractCanonical(html) || pageUrl;
446
+ const robots = extractMetaContent(html, 'robots');
447
+ const noindex = /noindex/i.test(robots);
448
+ const jsonLdBlocks = extractJsonLdBlocks(html);
449
+ const normalizedPageUrl = normalizePageUrl(htmlRes.url || pageUrl, trailingSlash);
450
+ const inMarkdownIndex = markdownSet.has(normalizedPageUrl);
451
+ const expectMarkdown = inMarkdownIndex && !shouldSkipMarkdown(pathname, skipMarkdownPathPrefixes);
452
+ const mdUrl = htmlUrlToMarkdownUrl(pageUrl);
453
+ let mdStatus = 0;
454
+ let mdLen = 0;
455
+ let mdCanonical;
456
+ if (expectMarkdown) {
457
+ try {
458
+ const mdRes = await fetchWithTimeout(mdUrl, {
459
+ headers: { Accept: 'text/markdown', 'User-Agent': 'PedestalProductionSeoAudit/1.0' },
460
+ });
461
+ mdStatus = mdRes.status;
462
+ if (mdRes.ok) {
463
+ const mdText = await mdRes.text();
464
+ mdLen = mdText.trim().length;
465
+ mdCanonical = parseLinkCanonical(mdRes.headers);
466
+ }
467
+ }
468
+ catch {
469
+ mdStatus = 0;
470
+ }
471
+ }
472
+ const classified = classifyRow({
473
+ url: pageUrl,
474
+ pathname,
475
+ siteTitle: config.siteTitle,
476
+ title,
477
+ description,
478
+ h1,
479
+ mainTextLen,
480
+ httpStatus: htmlRes.status,
481
+ noindex,
482
+ jsonLdBlocks,
483
+ articlePathPrefixes,
484
+ thinContentThreshold,
485
+ mdStatus,
486
+ mdLen: mdLen,
487
+ mdCanonical,
488
+ pageUrl: normalizedPageUrl,
489
+ trailingSlash,
490
+ inMarkdownIndex,
491
+ expectMarkdown,
492
+ });
493
+ const allFlags = [
494
+ ...classified.titleFlags,
495
+ ...classified.descFlags,
496
+ ...classified.schemaFlags,
497
+ ...classified.contentFlags,
498
+ ...classified.jsonldErrors,
499
+ ];
500
+ if (mdLen < minMarkdownLength && mdStatus === 200) {
501
+ allFlags.push('markdown_short');
502
+ }
503
+ return {
504
+ url: pageUrl,
505
+ finalUrl: htmlRes.url || pageUrl,
506
+ httpStatus: htmlRes.status,
507
+ title,
508
+ description,
509
+ descLen: description.length,
510
+ h1,
511
+ mainTextLen,
512
+ canonical,
513
+ noindex,
514
+ jsonldCount: jsonLdBlocks.length,
515
+ jsonldErrors: classified.jsonldErrors.join(';'),
516
+ schemaTypes: [...classified.schemaTypes].sort().join(', '),
517
+ titleFlags: classified.titleFlags.join(';'),
518
+ descFlags: classified.descFlags.join(';'),
519
+ schemaFlags: classified.schemaFlags.join(';'),
520
+ contentFlags: classified.contentFlags.join(';'),
521
+ mdStatus,
522
+ mdLen,
523
+ mdCanonicalOk: !expectMarkdown
524
+ ? true
525
+ : mdCanonical
526
+ ? urlsEquivalent(mdCanonical, normalizedPageUrl, trailingSlash)
527
+ : mdStatus === 200,
528
+ allFlags: [...new Set(allFlags)].join(';'),
529
+ severity: classified.severity,
530
+ };
531
+ });
532
+ const flagCounts = {};
533
+ let errorCount = 0;
534
+ let warnCount = 0;
535
+ for (const row of rows) {
536
+ if (row.severity === 'error')
537
+ errorCount++;
538
+ if (row.severity === 'warn')
539
+ warnCount++;
540
+ for (const flag of row.allFlags.split(';').filter(Boolean)) {
541
+ flagCounts[flag] = (flagCounts[flag] ?? 0) + 1;
542
+ }
543
+ }
544
+ if (missingFromMarkdownIndex.length > 0) {
545
+ flagCounts.missing_from_markdown_index = missingFromMarkdownIndex.length;
546
+ }
547
+ return {
548
+ rows,
549
+ sitemapUrlCount: sitemapUrls.length,
550
+ markdownIndexUrlCount: markdownIndexUrls.length,
551
+ missingFromMarkdownIndex,
552
+ flagCounts,
553
+ errorCount,
554
+ warnCount,
555
+ };
556
+ }
557
+ const CSV_HEADERS = [
558
+ 'url',
559
+ 'finalUrl',
560
+ 'httpStatus',
561
+ 'title',
562
+ 'description',
563
+ 'descLen',
564
+ 'h1',
565
+ 'mainTextLen',
566
+ 'canonical',
567
+ 'noindex',
568
+ 'jsonldCount',
569
+ 'jsonldErrors',
570
+ 'schemaTypes',
571
+ 'titleFlags',
572
+ 'descFlags',
573
+ 'schemaFlags',
574
+ 'contentFlags',
575
+ 'mdStatus',
576
+ 'mdLen',
577
+ 'mdCanonicalOk',
578
+ 'allFlags',
579
+ 'severity',
580
+ ];
581
+ export function rowsToCsv(rows) {
582
+ const lines = [CSV_HEADERS.join(',')];
583
+ for (const row of rows) {
584
+ lines.push([
585
+ row.url,
586
+ row.finalUrl,
587
+ String(row.httpStatus),
588
+ row.title,
589
+ row.description,
590
+ String(row.descLen),
591
+ row.h1,
592
+ String(row.mainTextLen),
593
+ row.canonical,
594
+ row.noindex ? 'true' : 'false',
595
+ String(row.jsonldCount),
596
+ row.jsonldErrors,
597
+ row.schemaTypes,
598
+ row.titleFlags,
599
+ row.descFlags,
600
+ row.schemaFlags,
601
+ row.contentFlags,
602
+ String(row.mdStatus),
603
+ String(row.mdLen),
604
+ row.mdCanonicalOk ? 'true' : 'false',
605
+ row.allFlags,
606
+ row.severity,
607
+ ]
608
+ .map(escapeCsv)
609
+ .join(','));
610
+ }
611
+ return `${lines.join('\n')}\n`;
612
+ }
613
+ export function evaluateRichResultsSpotCheck(input) {
614
+ const types = input.schemaTypes;
615
+ let result = 'pass';
616
+ const notes = [];
617
+ if (input.httpStatus !== 200) {
618
+ return {
619
+ label: input.label,
620
+ url: input.url,
621
+ result: 'fail',
622
+ notes: `HTTP ${input.httpStatus}`,
623
+ };
624
+ }
625
+ if (input.jsonldErrors.length > 0) {
626
+ return {
627
+ label: input.label,
628
+ url: input.url,
629
+ result: 'fail',
630
+ notes: input.jsonldErrors.join(', '),
631
+ };
632
+ }
633
+ if (types.size === 0) {
634
+ return { label: input.label, url: input.url, result: 'fail', notes: 'No JSON-LD types' };
635
+ }
636
+ const pathname = new URL(input.url).pathname;
637
+ if (pathname === '/' || pathname === '') {
638
+ if (!types.has('Organization'))
639
+ notes.push('missing Organization');
640
+ if (!types.has('WebSite'))
641
+ notes.push('missing WebSite');
642
+ }
643
+ else if (pathname.startsWith('/people/')) {
644
+ if (!types.has('Person') && !types.has('ProfilePage'))
645
+ notes.push('missing Person/ProfilePage');
646
+ }
647
+ else if (pathname.startsWith('/categories/')) {
648
+ if (!types.has('CollectionPage'))
649
+ notes.push('missing CollectionPage (warn)');
650
+ }
651
+ else if (pathname.match(/^\/resources\/news\/[^/]+\/[^/]+\/$/)) {
652
+ if (!types.has('BlogPosting') && !types.has('NewsArticle') && !types.has('ScholarlyArticle')) {
653
+ notes.push('missing article schema');
654
+ }
655
+ }
656
+ else if (pathname.startsWith('/resources/publications/') && pathname.split('/').length > 5) {
657
+ if (!types.has('ScholarlyArticle') && !types.has('BlogPosting')) {
658
+ notes.push('missing ScholarlyArticle/BlogPosting');
659
+ }
660
+ }
661
+ else if (pathname === '/resources/news/' || pathname === '/resources/news') {
662
+ if (!types.has('CollectionPage'))
663
+ notes.push('missing CollectionPage (warn)');
664
+ }
665
+ if (notes.length > 0) {
666
+ result = notes.some((n) => n.startsWith('missing CollectionPage')) ? 'warn' : 'fail';
667
+ }
668
+ return {
669
+ label: input.label,
670
+ url: input.url,
671
+ result,
672
+ notes: notes.length > 0 ? notes.join('; ') : `Types: ${[...types].sort().join(', ')}`,
673
+ };
674
+ }
675
+ export function pickRichResultsSampleUrls(rows, baseUrl) {
676
+ const base = normalizeBaseUrl(baseUrl);
677
+ const find = (pred) => rows.find(pred)?.url;
678
+ const newsArticle = find((r) => r.url.includes('/resources/news/') &&
679
+ r.url.replace(base, '').split('/').filter(Boolean).length >= 4 &&
680
+ r.httpStatus === 200);
681
+ const publication = find((r) => r.url.includes('/resources/publications/') &&
682
+ r.url.includes('/abstract-manuscript/') &&
683
+ r.httpStatus === 200);
684
+ const person = find((r) => {
685
+ const segments = r.url.replace(base, '').split('/').filter(Boolean);
686
+ return (segments[0] === 'people' && segments.length >= 2 && r.httpStatus === 200 && r.jsonldCount > 0);
687
+ });
688
+ const category = find((r) => {
689
+ const segments = r.url.replace(base, '').split('/').filter(Boolean);
690
+ return segments[0] === 'categories' && segments.length >= 2 && r.httpStatus === 200;
691
+ });
692
+ return [
693
+ { label: 'Homepage', url: `${base}/` },
694
+ { label: 'News hub', url: `${base}/resources/news/` },
695
+ ...(newsArticle ? [{ label: 'News article', url: newsArticle }] : []),
696
+ ...(publication ? [{ label: 'Publication', url: publication }] : []),
697
+ ...(person ? [{ label: 'Person', url: person }] : []),
698
+ ...(category ? [{ label: 'Category hub', url: category }] : []),
699
+ ];
700
+ }
701
+ export function buildRichResultsSpotChecks(rows, config) {
702
+ const samples = pickRichResultsSampleUrls(rows, config.baseUrl);
703
+ const rowByUrl = new Map(rows.map((r) => [normalizePageUrl(r.url, config.trailingSlash ?? true), r]));
704
+ return samples.map(({ label, url }) => {
705
+ const row = rowByUrl.get(normalizePageUrl(url, config.trailingSlash ?? true));
706
+ const types = new Set(row?.schemaTypes
707
+ ? row.schemaTypes
708
+ .split(',')
709
+ .map((t) => t.trim())
710
+ .filter(Boolean)
711
+ : []);
712
+ return evaluateRichResultsSpotCheck({
713
+ label,
714
+ url,
715
+ httpStatus: row?.httpStatus ?? 0,
716
+ schemaTypes: types,
717
+ jsonldErrors: row?.jsonldErrors ? row.jsonldErrors.split(';').filter(Boolean) : [],
718
+ });
719
+ });
720
+ }
721
+ export function buildMarkdownReport(result, config, richResults) {
722
+ const sortedFlags = Object.entries(result.flagCounts).sort((a, b) => b[1] - a[1]);
723
+ const errors = result.rows.filter((r) => r.severity === 'error');
724
+ const warns = result.rows.filter((r) => r.severity === 'warn');
725
+ const lines = [
726
+ '# Pedestal production SEO audit',
727
+ '',
728
+ `**Site:** ${config.baseUrl}`,
729
+ `**Generated:** ${new Date().toISOString()}`,
730
+ '',
731
+ '## Summary',
732
+ '',
733
+ `| Metric | Count |`,
734
+ `|--------|------:|`,
735
+ `| Sitemap URLs crawled | ${result.sitemapUrlCount} |`,
736
+ `| Markdown index URLs | ${result.markdownIndexUrlCount} |`,
737
+ `| Rows with errors | ${result.errorCount} |`,
738
+ `| Rows with warnings | ${result.warnCount} |`,
739
+ `| Missing from markdown-index.txt | ${result.missingFromMarkdownIndex.length} |`,
740
+ '',
741
+ '## Flag counts',
742
+ '',
743
+ '| Flag | Count |',
744
+ '|------|------:|',
745
+ ...sortedFlags.map(([flag, count]) => `| ${flag} | ${count} |`),
746
+ '',
747
+ ];
748
+ if (errors.length > 0) {
749
+ lines.push('## Errors (sample)', '', '| URL | Flags |', '|-----|-------|');
750
+ for (const row of errors.slice(0, 40)) {
751
+ lines.push(`| ${row.url} | ${row.allFlags} |`);
752
+ }
753
+ if (errors.length > 40)
754
+ lines.push('', `_…and ${errors.length - 40} more. See CSV._`);
755
+ lines.push('');
756
+ }
757
+ if (warns.length > 0) {
758
+ lines.push('## Warnings (sample)', '', '| URL | Flags |', '|-----|-------|');
759
+ for (const row of warns.slice(0, 30)) {
760
+ lines.push(`| ${row.url} | ${row.allFlags} |`);
761
+ }
762
+ if (warns.length > 30)
763
+ lines.push('', `_…and ${warns.length - 30} more. See CSV._`);
764
+ lines.push('');
765
+ }
766
+ if (result.missingFromMarkdownIndex.length > 0) {
767
+ lines.push('## Missing from markdown-index.txt', '');
768
+ for (const url of result.missingFromMarkdownIndex.slice(0, 50)) {
769
+ lines.push(`- ${url}`);
770
+ }
771
+ if (result.missingFromMarkdownIndex.length > 50) {
772
+ lines.push(`- _…and ${result.missingFromMarkdownIndex.length - 50} more_`);
773
+ }
774
+ lines.push('');
775
+ }
776
+ const spotChecks = richResults ?? [];
777
+ lines.push('## Rich Results spot-check', '', 'Automated JSON-LD type checks on representative URLs. Confirm in [Google Rich Results Test](https://search.google.com/test/rich-results) if needed.', '', '| Page | URL | Result | Notes |', '|------|-----|--------|-------|', ...(spotChecks.length > 0
778
+ ? spotChecks.map((s) => `| ${s.label} | ${s.url} | ${s.result} | ${s.notes} |`)
779
+ : ['| (no samples) | | | |']), '');
780
+ return lines.join('\n');
781
+ }
782
+ export async function writeProductionSeoAuditOutputs(result, config, richResults) {
783
+ await mkdir(config.outputDir, { recursive: true });
784
+ const csvPath = path.join(config.outputDir, config.outputCsvName ?? 'pedestal-production-audit.csv');
785
+ const mdPath = path.join(config.outputDir, config.outputMdName ?? 'pedestal-production-audit.md');
786
+ const spotChecks = richResults ?? buildRichResultsSpotChecks(result.rows, config);
787
+ await writeFile(csvPath, rowsToCsv(result.rows), 'utf8');
788
+ await writeFile(mdPath, buildMarkdownReport(result, config, spotChecks), 'utf8');
789
+ return { csvPath, mdPath };
790
+ }
791
+ export function getProductionAuditExitCode(result) {
792
+ return result.errorCount > 0 ? 1 : 0;
793
+ }
794
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/production-audit/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@se-studio/site-check",
3
- "version": "1.1.3",
3
+ "version": "1.3.0",
4
4
  "description": "Validate SE marketing sites (sitemap, llms.txt) and download markdown files preserving structure",
5
5
  "repository": {
6
6
  "type": "git",
@@ -10,6 +10,21 @@
10
10
  "license": "MIT",
11
11
  "type": "module",
12
12
  "main": "./dist/cli.js",
13
+ "types": "./dist/cli.d.ts",
14
+ "exports": {
15
+ ".": {
16
+ "types": "./dist/cli.d.ts",
17
+ "import": "./dist/cli.js"
18
+ },
19
+ "./screaming-frog": {
20
+ "types": "./dist/screaming-frog/index.d.ts",
21
+ "import": "./dist/screaming-frog/index.js"
22
+ },
23
+ "./production-audit": {
24
+ "types": "./dist/production-audit/index.d.ts",
25
+ "import": "./dist/production-audit/index.js"
26
+ }
27
+ },
13
28
  "bin": {
14
29
  "site-check": "./dist/cli.js",
15
30
  "site-check-screaming-frog": "./dist/screaming-frog-cli.js"
@@ -44,6 +59,6 @@
44
59
  "type-check": "tsc --noEmit",
45
60
  "lint": "biome lint .",
46
61
  "clean": "rm -rf dist .turbo *.tsbuildinfo",
47
- "test": "pnpm build && node --test scripts/screaming-frog-audit.test.mjs"
62
+ "test": "pnpm build && node --test scripts/screaming-frog-audit.test.mjs scripts/production-audit.test.mjs"
48
63
  }
49
64
  }