seo 0.14.0 → 0.15.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/dist/index.d.ts CHANGED
@@ -923,6 +923,32 @@ declare const RULE_DEFINITIONS: readonly [{
923
923
  readonly evidenceFields: ["page.robotsTxt"];
924
924
  readonly suggestedCommands: ["seo crawl <url> --json"];
925
925
  };
926
+ }, {
927
+ readonly id: "robots_txt_html";
928
+ readonly title: "robots.txt returns an HTML page";
929
+ readonly category: "indexability";
930
+ readonly defaultSeverity: "medium";
931
+ readonly whyItMatters: "Crawlers read /robots.txt as plain text rules. An HTML page there, often the home page served for every path, holds no rules and no Sitemap line, so crawlers treat the site as having no robots.txt.";
932
+ readonly howToFix: "Serve a plain text /robots.txt with the rules the site needs and a Sitemap line. Check that the catch-all route does not answer before the static file.";
933
+ readonly impactIfIgnored: "Rules meant to keep crawlers out of some paths do nothing, and crawlers must find the sitemap another way.";
934
+ readonly howToVerify: "Request /robots.txt and confirm a 200 text/plain response with User-agent lines.";
935
+ readonly agentHints: {
936
+ readonly evidenceFields: ["report.ai.robotsTxt"];
937
+ readonly suggestedCommands: ["seo crawl <url> --json"];
938
+ };
939
+ }, {
940
+ readonly id: "sitemap_url_off_host";
941
+ readonly title: "Sitemap lists URLs on another host";
942
+ readonly category: "indexability";
943
+ readonly defaultSeverity: "high";
944
+ readonly whyItMatters: "A sitemap may list only URLs on its own host, unless the other host's robots.txt or Search Console vouches for it. Localhost URLs, left by a build that used a development base URL, can never be fetched. Either way, those entries tell search engines nothing about the real pages.";
945
+ readonly howToFix: "Build the sitemap with the production URL as the base, so every <loc> uses the same scheme and host as the live site.";
946
+ readonly impactIfIgnored: "Search engines find pages only through links, and new or deep pages can take longer to be crawled.";
947
+ readonly howToVerify: "Open the sitemap and confirm every <loc> starts with the live site URL, then re-run the crawl.";
948
+ readonly agentHints: {
949
+ readonly evidenceFields: ["report.sitemapDiscovery.roots[].offHost"];
950
+ readonly suggestedCommands: ["seo crawl <url> --json"];
951
+ };
926
952
  }, {
927
953
  readonly id: "canonicalized_page";
928
954
  readonly title: "Canonicalized page";
@@ -2866,6 +2892,8 @@ type CrawlAiSignals = {
2866
2892
  exists: boolean;
2867
2893
  availability: CrawlAiAvailability;
2868
2894
  status?: number;
2895
+ contentType?: string;
2896
+ servesHtml?: boolean;
2869
2897
  error?: string;
2870
2898
  sitemapUrls: string[];
2871
2899
  contentSignals?: string[];
@@ -2876,6 +2904,8 @@ type CrawlAiSignals = {
2876
2904
  exists: boolean;
2877
2905
  availability?: CrawlAiAvailability;
2878
2906
  status?: number;
2907
+ contentType?: string;
2908
+ servesHtml?: boolean;
2879
2909
  error?: string;
2880
2910
  links?: {
2881
2911
  found: number;
@@ -3016,6 +3046,12 @@ export type CrawlSitemapDiscovery = {
3016
3046
  documents: SitemapDocument[];
3017
3047
  possiblyTruncated: boolean;
3018
3048
  warnings: string[];
3049
+ offHost?: {
3050
+ count: number;
3051
+ localhost: number;
3052
+ hosts: string[];
3053
+ samples: string[];
3054
+ };
3019
3055
  }>;
3020
3056
  };
3021
3057
  export type CrawlExternalLinkVerification = {
@@ -5244,6 +5280,8 @@ export declare const crawlReportSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
5244
5280
  unreachable: "unreachable";
5245
5281
  }>;
5246
5282
  status: z.ZodOptional<z.ZodNumber>;
5283
+ contentType: z.ZodOptional<z.ZodString>;
5284
+ servesHtml: z.ZodOptional<z.ZodBoolean>;
5247
5285
  error: z.ZodOptional<z.ZodString>;
5248
5286
  sitemapUrls: z.ZodArray<z.ZodString>;
5249
5287
  contentSignals: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -5270,6 +5308,8 @@ export declare const crawlReportSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
5270
5308
  unreachable: "unreachable";
5271
5309
  }>>;
5272
5310
  status: z.ZodOptional<z.ZodNumber>;
5311
+ contentType: z.ZodOptional<z.ZodString>;
5312
+ servesHtml: z.ZodOptional<z.ZodBoolean>;
5273
5313
  error: z.ZodOptional<z.ZodString>;
5274
5314
  links: z.ZodOptional<z.ZodObject<{
5275
5315
  found: z.ZodNumber;
@@ -5405,6 +5445,12 @@ export declare const crawlReportSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
5405
5445
  }, z.core.$strip>>;
5406
5446
  possiblyTruncated: z.ZodBoolean;
5407
5447
  warnings: z.ZodArray<z.ZodString>;
5448
+ offHost: z.ZodOptional<z.ZodObject<{
5449
+ count: z.ZodNumber;
5450
+ localhost: z.ZodNumber;
5451
+ hosts: z.ZodArray<z.ZodString>;
5452
+ samples: z.ZodArray<z.ZodString>;
5453
+ }, z.core.$strip>>;
5408
5454
  }, z.core.$strip>>;
5409
5455
  }, z.core.$strip>>;
5410
5456
  externalLinkVerification: z.ZodOptional<z.ZodObject<{
@@ -6549,6 +6595,8 @@ export declare const crawlReportSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
6549
6595
  unreachable: "unreachable";
6550
6596
  }>;
6551
6597
  status: z.ZodOptional<z.ZodNumber>;
6598
+ contentType: z.ZodOptional<z.ZodString>;
6599
+ servesHtml: z.ZodOptional<z.ZodBoolean>;
6552
6600
  error: z.ZodOptional<z.ZodString>;
6553
6601
  sitemapUrls: z.ZodArray<z.ZodString>;
6554
6602
  contentSignals: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -6575,6 +6623,8 @@ export declare const crawlReportSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
6575
6623
  unreachable: "unreachable";
6576
6624
  }>>;
6577
6625
  status: z.ZodOptional<z.ZodNumber>;
6626
+ contentType: z.ZodOptional<z.ZodString>;
6627
+ servesHtml: z.ZodOptional<z.ZodBoolean>;
6578
6628
  error: z.ZodOptional<z.ZodString>;
6579
6629
  links: z.ZodOptional<z.ZodObject<{
6580
6630
  found: z.ZodNumber;
@@ -6710,6 +6760,12 @@ export declare const crawlReportSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
6710
6760
  }, z.core.$strip>>;
6711
6761
  possiblyTruncated: z.ZodBoolean;
6712
6762
  warnings: z.ZodArray<z.ZodString>;
6763
+ offHost: z.ZodOptional<z.ZodObject<{
6764
+ count: z.ZodNumber;
6765
+ localhost: z.ZodNumber;
6766
+ hosts: z.ZodArray<z.ZodString>;
6767
+ samples: z.ZodArray<z.ZodString>;
6768
+ }, z.core.$strip>>;
6713
6769
  }, z.core.$strip>>;
6714
6770
  }, z.core.$strip>>;
6715
6771
  externalLinkVerification: z.ZodOptional<z.ZodObject<{
@@ -7854,6 +7910,8 @@ export declare const crawlReportSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
7854
7910
  unreachable: "unreachable";
7855
7911
  }>;
7856
7912
  status: z.ZodOptional<z.ZodNumber>;
7913
+ contentType: z.ZodOptional<z.ZodString>;
7914
+ servesHtml: z.ZodOptional<z.ZodBoolean>;
7857
7915
  error: z.ZodOptional<z.ZodString>;
7858
7916
  sitemapUrls: z.ZodArray<z.ZodString>;
7859
7917
  contentSignals: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -7880,6 +7938,8 @@ export declare const crawlReportSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
7880
7938
  unreachable: "unreachable";
7881
7939
  }>>;
7882
7940
  status: z.ZodOptional<z.ZodNumber>;
7941
+ contentType: z.ZodOptional<z.ZodString>;
7942
+ servesHtml: z.ZodOptional<z.ZodBoolean>;
7883
7943
  error: z.ZodOptional<z.ZodString>;
7884
7944
  links: z.ZodOptional<z.ZodObject<{
7885
7945
  found: z.ZodNumber;
@@ -8015,6 +8075,12 @@ export declare const crawlReportSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
8015
8075
  }, z.core.$strip>>;
8016
8076
  possiblyTruncated: z.ZodBoolean;
8017
8077
  warnings: z.ZodArray<z.ZodString>;
8078
+ offHost: z.ZodOptional<z.ZodObject<{
8079
+ count: z.ZodNumber;
8080
+ localhost: z.ZodNumber;
8081
+ hosts: z.ZodArray<z.ZodString>;
8082
+ samples: z.ZodArray<z.ZodString>;
8083
+ }, z.core.$strip>>;
8018
8084
  }, z.core.$strip>>;
8019
8085
  }, z.core.$strip>>;
8020
8086
  externalLinkVerification: z.ZodOptional<z.ZodObject<{
@@ -9161,6 +9227,8 @@ export declare const crawlerSchemas: {
9161
9227
  unreachable: "unreachable";
9162
9228
  }>;
9163
9229
  status: z.ZodOptional<z.ZodNumber>;
9230
+ contentType: z.ZodOptional<z.ZodString>;
9231
+ servesHtml: z.ZodOptional<z.ZodBoolean>;
9164
9232
  error: z.ZodOptional<z.ZodString>;
9165
9233
  sitemapUrls: z.ZodArray<z.ZodString>;
9166
9234
  contentSignals: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -9187,6 +9255,8 @@ export declare const crawlerSchemas: {
9187
9255
  unreachable: "unreachable";
9188
9256
  }>>;
9189
9257
  status: z.ZodOptional<z.ZodNumber>;
9258
+ contentType: z.ZodOptional<z.ZodString>;
9259
+ servesHtml: z.ZodOptional<z.ZodBoolean>;
9190
9260
  error: z.ZodOptional<z.ZodString>;
9191
9261
  links: z.ZodOptional<z.ZodObject<{
9192
9262
  found: z.ZodNumber;
@@ -9322,6 +9392,12 @@ export declare const crawlerSchemas: {
9322
9392
  }, z.core.$strip>>;
9323
9393
  possiblyTruncated: z.ZodBoolean;
9324
9394
  warnings: z.ZodArray<z.ZodString>;
9395
+ offHost: z.ZodOptional<z.ZodObject<{
9396
+ count: z.ZodNumber;
9397
+ localhost: z.ZodNumber;
9398
+ hosts: z.ZodArray<z.ZodString>;
9399
+ samples: z.ZodArray<z.ZodString>;
9400
+ }, z.core.$strip>>;
9325
9401
  }, z.core.$strip>>;
9326
9402
  }, z.core.$strip>>;
9327
9403
  externalLinkVerification: z.ZodOptional<z.ZodObject<{
@@ -10466,6 +10542,8 @@ export declare const crawlerSchemas: {
10466
10542
  unreachable: "unreachable";
10467
10543
  }>;
10468
10544
  status: z.ZodOptional<z.ZodNumber>;
10545
+ contentType: z.ZodOptional<z.ZodString>;
10546
+ servesHtml: z.ZodOptional<z.ZodBoolean>;
10469
10547
  error: z.ZodOptional<z.ZodString>;
10470
10548
  sitemapUrls: z.ZodArray<z.ZodString>;
10471
10549
  contentSignals: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -10492,6 +10570,8 @@ export declare const crawlerSchemas: {
10492
10570
  unreachable: "unreachable";
10493
10571
  }>>;
10494
10572
  status: z.ZodOptional<z.ZodNumber>;
10573
+ contentType: z.ZodOptional<z.ZodString>;
10574
+ servesHtml: z.ZodOptional<z.ZodBoolean>;
10495
10575
  error: z.ZodOptional<z.ZodString>;
10496
10576
  links: z.ZodOptional<z.ZodObject<{
10497
10577
  found: z.ZodNumber;
@@ -10627,6 +10707,12 @@ export declare const crawlerSchemas: {
10627
10707
  }, z.core.$strip>>;
10628
10708
  possiblyTruncated: z.ZodBoolean;
10629
10709
  warnings: z.ZodArray<z.ZodString>;
10710
+ offHost: z.ZodOptional<z.ZodObject<{
10711
+ count: z.ZodNumber;
10712
+ localhost: z.ZodNumber;
10713
+ hosts: z.ZodArray<z.ZodString>;
10714
+ samples: z.ZodArray<z.ZodString>;
10715
+ }, z.core.$strip>>;
10630
10716
  }, z.core.$strip>>;
10631
10717
  }, z.core.$strip>>;
10632
10718
  externalLinkVerification: z.ZodOptional<z.ZodObject<{
@@ -11771,6 +11857,8 @@ export declare const crawlerSchemas: {
11771
11857
  unreachable: "unreachable";
11772
11858
  }>;
11773
11859
  status: z.ZodOptional<z.ZodNumber>;
11860
+ contentType: z.ZodOptional<z.ZodString>;
11861
+ servesHtml: z.ZodOptional<z.ZodBoolean>;
11774
11862
  error: z.ZodOptional<z.ZodString>;
11775
11863
  sitemapUrls: z.ZodArray<z.ZodString>;
11776
11864
  contentSignals: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -11797,6 +11885,8 @@ export declare const crawlerSchemas: {
11797
11885
  unreachable: "unreachable";
11798
11886
  }>>;
11799
11887
  status: z.ZodOptional<z.ZodNumber>;
11888
+ contentType: z.ZodOptional<z.ZodString>;
11889
+ servesHtml: z.ZodOptional<z.ZodBoolean>;
11800
11890
  error: z.ZodOptional<z.ZodString>;
11801
11891
  links: z.ZodOptional<z.ZodObject<{
11802
11892
  found: z.ZodNumber;
@@ -11932,6 +12022,12 @@ export declare const crawlerSchemas: {
11932
12022
  }, z.core.$strip>>;
11933
12023
  possiblyTruncated: z.ZodBoolean;
11934
12024
  warnings: z.ZodArray<z.ZodString>;
12025
+ offHost: z.ZodOptional<z.ZodObject<{
12026
+ count: z.ZodNumber;
12027
+ localhost: z.ZodNumber;
12028
+ hosts: z.ZodArray<z.ZodString>;
12029
+ samples: z.ZodArray<z.ZodString>;
12030
+ }, z.core.$strip>>;
11935
12031
  }, z.core.$strip>>;
11936
12032
  }, z.core.$strip>>;
11937
12033
  externalLinkVerification: z.ZodOptional<z.ZodObject<{
@@ -14004,6 +14100,8 @@ export declare const crawlerJsonSchemas: {
14004
14100
  unreachable: "unreachable";
14005
14101
  }>;
14006
14102
  status: z.ZodOptional<z.ZodNumber>;
14103
+ contentType: z.ZodOptional<z.ZodString>;
14104
+ servesHtml: z.ZodOptional<z.ZodBoolean>;
14007
14105
  error: z.ZodOptional<z.ZodString>;
14008
14106
  sitemapUrls: z.ZodArray<z.ZodString>;
14009
14107
  contentSignals: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -14030,6 +14128,8 @@ export declare const crawlerJsonSchemas: {
14030
14128
  unreachable: "unreachable";
14031
14129
  }>>;
14032
14130
  status: z.ZodOptional<z.ZodNumber>;
14131
+ contentType: z.ZodOptional<z.ZodString>;
14132
+ servesHtml: z.ZodOptional<z.ZodBoolean>;
14033
14133
  error: z.ZodOptional<z.ZodString>;
14034
14134
  links: z.ZodOptional<z.ZodObject<{
14035
14135
  found: z.ZodNumber;
@@ -14165,6 +14265,12 @@ export declare const crawlerJsonSchemas: {
14165
14265
  }, z.core.$strip>>;
14166
14266
  possiblyTruncated: z.ZodBoolean;
14167
14267
  warnings: z.ZodArray<z.ZodString>;
14268
+ offHost: z.ZodOptional<z.ZodObject<{
14269
+ count: z.ZodNumber;
14270
+ localhost: z.ZodNumber;
14271
+ hosts: z.ZodArray<z.ZodString>;
14272
+ samples: z.ZodArray<z.ZodString>;
14273
+ }, z.core.$strip>>;
14168
14274
  }, z.core.$strip>>;
14169
14275
  }, z.core.$strip>>;
14170
14276
  externalLinkVerification: z.ZodOptional<z.ZodObject<{
@@ -15309,6 +15415,8 @@ export declare const crawlerJsonSchemas: {
15309
15415
  unreachable: "unreachable";
15310
15416
  }>;
15311
15417
  status: z.ZodOptional<z.ZodNumber>;
15418
+ contentType: z.ZodOptional<z.ZodString>;
15419
+ servesHtml: z.ZodOptional<z.ZodBoolean>;
15312
15420
  error: z.ZodOptional<z.ZodString>;
15313
15421
  sitemapUrls: z.ZodArray<z.ZodString>;
15314
15422
  contentSignals: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -15335,6 +15443,8 @@ export declare const crawlerJsonSchemas: {
15335
15443
  unreachable: "unreachable";
15336
15444
  }>>;
15337
15445
  status: z.ZodOptional<z.ZodNumber>;
15446
+ contentType: z.ZodOptional<z.ZodString>;
15447
+ servesHtml: z.ZodOptional<z.ZodBoolean>;
15338
15448
  error: z.ZodOptional<z.ZodString>;
15339
15449
  links: z.ZodOptional<z.ZodObject<{
15340
15450
  found: z.ZodNumber;
@@ -15470,6 +15580,12 @@ export declare const crawlerJsonSchemas: {
15470
15580
  }, z.core.$strip>>;
15471
15581
  possiblyTruncated: z.ZodBoolean;
15472
15582
  warnings: z.ZodArray<z.ZodString>;
15583
+ offHost: z.ZodOptional<z.ZodObject<{
15584
+ count: z.ZodNumber;
15585
+ localhost: z.ZodNumber;
15586
+ hosts: z.ZodArray<z.ZodString>;
15587
+ samples: z.ZodArray<z.ZodString>;
15588
+ }, z.core.$strip>>;
15473
15589
  }, z.core.$strip>>;
15474
15590
  }, z.core.$strip>>;
15475
15591
  externalLinkVerification: z.ZodOptional<z.ZodObject<{
@@ -16614,6 +16730,8 @@ export declare const crawlerJsonSchemas: {
16614
16730
  unreachable: "unreachable";
16615
16731
  }>;
16616
16732
  status: z.ZodOptional<z.ZodNumber>;
16733
+ contentType: z.ZodOptional<z.ZodString>;
16734
+ servesHtml: z.ZodOptional<z.ZodBoolean>;
16617
16735
  error: z.ZodOptional<z.ZodString>;
16618
16736
  sitemapUrls: z.ZodArray<z.ZodString>;
16619
16737
  contentSignals: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -16640,6 +16758,8 @@ export declare const crawlerJsonSchemas: {
16640
16758
  unreachable: "unreachable";
16641
16759
  }>>;
16642
16760
  status: z.ZodOptional<z.ZodNumber>;
16761
+ contentType: z.ZodOptional<z.ZodString>;
16762
+ servesHtml: z.ZodOptional<z.ZodBoolean>;
16643
16763
  error: z.ZodOptional<z.ZodString>;
16644
16764
  links: z.ZodOptional<z.ZodObject<{
16645
16765
  found: z.ZodNumber;
@@ -16775,6 +16895,12 @@ export declare const crawlerJsonSchemas: {
16775
16895
  }, z.core.$strip>>;
16776
16896
  possiblyTruncated: z.ZodBoolean;
16777
16897
  warnings: z.ZodArray<z.ZodString>;
16898
+ offHost: z.ZodOptional<z.ZodObject<{
16899
+ count: z.ZodNumber;
16900
+ localhost: z.ZodNumber;
16901
+ hosts: z.ZodArray<z.ZodString>;
16902
+ samples: z.ZodArray<z.ZodString>;
16903
+ }, z.core.$strip>>;
16778
16904
  }, z.core.$strip>>;
16779
16905
  }, z.core.$strip>>;
16780
16906
  externalLinkVerification: z.ZodOptional<z.ZodObject<{
@@ -19988,6 +20114,13 @@ interface CrawledPage {
19988
20114
  length: number;
19989
20115
  };
19990
20116
  }
20117
+ interface SentenceSource {
20118
+ read(ref: {
20119
+ offset: number;
20120
+ length: number;
20121
+ }): Promise<LinkSentence[]>;
20122
+ close(): Promise<void>;
20123
+ }
19991
20124
  interface SiteCrawl {
19992
20125
  origin: string;
19993
20126
  method: 'sitemap' | 'links';
@@ -19995,7 +20128,7 @@ interface SiteCrawl {
19995
20128
  urls: string[];
19996
20129
  pageOfUrl: Map<number, number>;
19997
20130
  index: SiteIndex;
19998
- sentences: SentenceStore;
20131
+ sentences: SentenceSource;
19999
20132
  genericAnchors: Array<{
20000
20133
  source: number;
20001
20134
  href: string;
@@ -20014,22 +20147,6 @@ interface SiteCrawl {
20014
20147
  };
20015
20148
  warnings: string[];
20016
20149
  }
20017
- declare class SentenceStore {
20018
- private readonly dir;
20019
- private readonly handle;
20020
- private size;
20021
- private constructor();
20022
- static open(): Promise<SentenceStore>;
20023
- write(sentences: LinkSentence[]): Promise<{
20024
- offset: number;
20025
- length: number;
20026
- }>;
20027
- read(ref: {
20028
- offset: number;
20029
- length: number;
20030
- }): Promise<LinkSentence[]>;
20031
- close(): Promise<void>;
20032
- }
20033
20150
  interface CrawlInput {
20034
20151
  startUrl: string;
20035
20152
  maxPages: number;
@@ -20037,7 +20154,6 @@ interface CrawlInput {
20037
20154
  refresh?: boolean;
20038
20155
  progress?: ProgressReporter;
20039
20156
  }
20040
- declare function crawlForLinks(input: CrawlInput): Promise<SiteCrawl>;
20041
20157
  export declare const PAGE_TYPES: {
20042
20158
  readonly pillar_guide: "A long, broad guide that covers a whole topic and would naturally link out to many narrower pages";
20043
20159
  readonly support_article: "A focused article, post, tutorial, or explainer about one narrower subject";
@@ -20209,9 +20325,10 @@ export interface InternalLinksInput {
20209
20325
  refresh?: boolean;
20210
20326
  }
20211
20327
  export interface InternalLinksDependencies {
20212
- crawl: typeof crawlForLinks;
20328
+ crawl: (input: CrawlInput) => Promise<SiteCrawl>;
20213
20329
  searchConsole: {
20214
20330
  property: string;
20331
+ maxRows?: number;
20215
20332
  query: (request: SearchAnalyticsRequest) => Promise<{
20216
20333
  rows: GscRow[];
20217
20334
  rowsFetched: number;
@@ -20229,6 +20346,7 @@ export interface InternalLinksDependencies {
20229
20346
  progress?: ProgressReporter;
20230
20347
  }
20231
20348
  export declare function siteStartUrl(site: string): string;
20349
+ export declare function internalLinksReportWith(input: InternalLinksInput, dependencies: Partial<InternalLinksDependencies> & Pick<InternalLinksDependencies, 'crawl' | 'searchConsole' | 'decisionModel'>): Promise<InternalLinksReport>;
20232
20350
  export declare function internalLinksReport(input: InternalLinksInput, dependencies: Partial<InternalLinksDependencies> & Pick<InternalLinksDependencies, 'searchConsole' | 'decisionModel'>): Promise<InternalLinksReport>;
20233
20351
  type PseoTemplateCluster = {
20234
20352
  id: string;
@@ -21308,26 +21426,6 @@ type AuditAccess = {
21308
21426
  checks: (site: string, offset: number, limit: number) => Promise<AuditChecks | null>;
21309
21427
  add: (site: string) => Promise<'added' | 'exists' | 'full'>;
21310
21428
  };
21311
- declare const ISSUE_MARKS: readonly ["open", "fixed", "ignored"];
21312
- type IssueMark = (typeof ISSUE_MARKS)[number];
21313
- type IssueSeen = 'found' | 'not-found' | 'not-checked';
21314
- type StoredIssue = {
21315
- id: string;
21316
- kind: string;
21317
- subject: string;
21318
- evidence: string;
21319
- mark: IssueMark;
21320
- marked_at: string | null;
21321
- note: string | null;
21322
- first_found: string;
21323
- last_found: string | null;
21324
- seen: IssueSeen;
21325
- checked_at: string | null;
21326
- };
21327
- type IssueStore = {
21328
- read: (site: string) => Promise<StoredIssue[] | null>;
21329
- write: (site: string, issues: StoredIssue[]) => Promise<void>;
21330
- };
21331
21429
  type RedirectKind = 'permanent' | 'temporary';
21332
21430
  type LiveCheck = {
21333
21431
  first: PageFacts;
@@ -21372,6 +21470,10 @@ declare const COMMANDS: {
21372
21470
  readonly where: "local";
21373
21471
  readonly summary: "Pages that could link to a target page.";
21374
21472
  };
21473
+ readonly lint: {
21474
+ readonly where: "anywhere";
21475
+ readonly summary: "Check copy for patterns common in AI-written text, weak copy and title and description length.";
21476
+ };
21375
21477
  };
21376
21478
  type CommandId = keyof typeof COMMANDS;
21377
21479
  type Caller = (command: CommandId, args?: Record<string, string | number | undefined>) => string;
@@ -21446,6 +21548,45 @@ type PageMarkdown = {
21446
21548
  } | {
21447
21549
  error: string;
21448
21550
  };
21551
+ declare const ISSUE_MARKS: readonly ["open", "fixed", "ignored"];
21552
+ type IssueMark = (typeof ISSUE_MARKS)[number];
21553
+ type IssueSeen = 'found' | 'not-found' | 'not-checked';
21554
+ type StoredIssue = {
21555
+ id: string;
21556
+ kind: string;
21557
+ subject: string;
21558
+ evidence: string;
21559
+ mark: IssueMark;
21560
+ marked_at: string | null;
21561
+ note: string | null;
21562
+ first_found: string;
21563
+ last_found: string | null;
21564
+ seen: IssueSeen;
21565
+ checked_at: string | null;
21566
+ measures?: IssueMeasure[];
21567
+ };
21568
+ declare const MEASURE_DAYS: readonly [28, 56];
21569
+ type MeasureDays = (typeof MEASURE_DAYS)[number];
21570
+ type MeasurePeriod = {
21571
+ start: string;
21572
+ end: string;
21573
+ clicks: number;
21574
+ impressions: number;
21575
+ position: number | null;
21576
+ };
21577
+ type IssueMeasure = {
21578
+ days: MeasureDays;
21579
+ fixed_on: string;
21580
+ scope: 'page' | 'query on page';
21581
+ before: MeasurePeriod;
21582
+ after: MeasurePeriod;
21583
+ updates: string[] | null;
21584
+ measured_at: string;
21585
+ };
21586
+ type IssueStore = {
21587
+ read: (site: string) => Promise<StoredIssue[] | null>;
21588
+ write: (site: string, issues: StoredIssue[]) => Promise<void>;
21589
+ };
21449
21590
  type WeekSite = {
21450
21591
  property: string;
21451
21592
  link: string | null;
@@ -21474,6 +21615,37 @@ type WeekSite = {
21474
21615
  clicks: number;
21475
21616
  previous: number;
21476
21617
  } | null;
21618
+ opportunities?: WeekOpportunities | null;
21619
+ measured?: {
21620
+ total: number;
21621
+ items: (IssueMeasure & {
21622
+ subject: string;
21623
+ })[];
21624
+ };
21625
+ };
21626
+ type WeekOpportunities = {
21627
+ checked_at: number | null;
21628
+ competitors: string[];
21629
+ blocked: string | null;
21630
+ partial: boolean;
21631
+ items: WeekOpportunity[];
21632
+ };
21633
+ type WeekOpportunity = {
21634
+ keyword: string;
21635
+ kind: 'page' | 'tool';
21636
+ search_volume: number;
21637
+ cpc: number;
21638
+ intent: string;
21639
+ competitors: {
21640
+ domain: string;
21641
+ position: number;
21642
+ url: string;
21643
+ }[];
21644
+ site_dr: number;
21645
+ low_dr: number;
21646
+ top: number;
21647
+ cluster: number;
21648
+ relevance: number;
21477
21649
  };
21478
21650
  type WeekData = {
21479
21651
  start: string;
@@ -21521,6 +21693,13 @@ export declare function pendingCloudLogin(): Pending | null;
21521
21693
  export declare function finishCloudLogin(): Promise<'linked' | 'pending' | 'expired'>;
21522
21694
  export declare function cloudLogout(): Promise<boolean>;
21523
21695
  export declare function openCloudLink(url: string): Promise<void>;
21696
+ type LintSource = {
21697
+ path: string;
21698
+ text: string;
21699
+ } | {
21700
+ path: string;
21701
+ skipped: string;
21702
+ };
21524
21703
  export type TokenStorageMode = 'keychain' | 'file';
21525
21704
  export type TokenStorageStatus = {
21526
21705
  configured: TokenStorageMode;
@@ -21893,6 +22072,9 @@ export declare function readJson<T = unknown>(response: Response, label: string,
21893
22072
  maxBytes?: number;
21894
22073
  }): Promise<T>;
21895
22074
  export declare function readJsonOrUndefined<T = unknown>(response: Response, label: string): Promise<T | undefined>;
22075
+ export declare const LINT_MAX_FILES = 100;
22076
+ export declare function lintPaths(inputs: string[], cwd?: string): Promise<string[]>;
22077
+ export declare function readLintFiles(inputs: string[], cwd?: string): Promise<LintSource[]>;
21896
22078
  export declare function createLogger(runId: string): pino.Logger;
21897
22079
  export declare function makeRunId(): string;
21898
22080
  export declare function renderPresentationTablesMarkdown(tables: PresentationTable[]): string[];