@rivi-software/agentic-seo-check 0.1.0 → 0.1.1

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.
Files changed (119) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +65 -15
  3. package/dist/brand.d.ts +11 -0
  4. package/dist/brand.js +22 -0
  5. package/dist/brand.js.map +1 -0
  6. package/dist/cli.js +125 -80
  7. package/dist/cli.js.map +1 -1
  8. package/dist/core/audit.d.ts +16 -16
  9. package/dist/core/audit.js +363 -248
  10. package/dist/core/audit.js.map +1 -1
  11. package/dist/core/concurrency.d.ts +4 -4
  12. package/dist/core/concurrency.js +33 -23
  13. package/dist/core/concurrency.js.map +1 -1
  14. package/dist/core/crawl.d.ts +5 -5
  15. package/dist/core/crawl.js +250 -121
  16. package/dist/core/crawl.js.map +1 -1
  17. package/dist/core/fetch.d.ts +5 -5
  18. package/dist/core/fetch.js +151 -100
  19. package/dist/core/fetch.js.map +1 -1
  20. package/dist/core/html/dom.d.ts +13 -0
  21. package/dist/core/html/dom.js +17 -0
  22. package/dist/core/html/dom.js.map +1 -0
  23. package/dist/core/html/extract.d.ts +2 -2
  24. package/dist/core/html/extract.js +168 -111
  25. package/dist/core/html/extract.js.map +1 -1
  26. package/dist/core/html/structured-data.d.ts +16 -6
  27. package/dist/core/html/structured-data.js +180 -145
  28. package/dist/core/html/structured-data.js.map +1 -1
  29. package/dist/core/html/text.d.ts +14 -14
  30. package/dist/core/html/text.js +110 -107
  31. package/dist/core/html/text.js.map +1 -1
  32. package/dist/core/lighthouse.d.ts +26 -25
  33. package/dist/core/lighthouse.js +181 -105
  34. package/dist/core/lighthouse.js.map +1 -1
  35. package/dist/core/performance-rules.d.ts +2 -2
  36. package/dist/core/performance-rules.js +105 -33
  37. package/dist/core/performance-rules.js.map +1 -1
  38. package/dist/core/render-rules.d.ts +5 -4
  39. package/dist/core/render-rules.js +129 -62
  40. package/dist/core/render-rules.js.map +1 -1
  41. package/dist/core/render.d.ts +2 -2
  42. package/dist/core/render.js +29 -23
  43. package/dist/core/render.js.map +1 -1
  44. package/dist/core/report/markdown.d.ts +2 -2
  45. package/dist/core/report/markdown.js +110 -131
  46. package/dist/core/report/markdown.js.map +1 -1
  47. package/dist/core/robots.d.ts +5 -5
  48. package/dist/core/robots.js +31 -16
  49. package/dist/core/robots.js.map +1 -1
  50. package/dist/core/rules/canonical.d.ts +1 -1
  51. package/dist/core/rules/canonical.js +93 -57
  52. package/dist/core/rules/canonical.js.map +1 -1
  53. package/dist/core/rules/content.js +40 -26
  54. package/dist/core/rules/content.js.map +1 -1
  55. package/dist/core/rules/document.js +64 -41
  56. package/dist/core/rules/document.js.map +1 -1
  57. package/dist/core/rules/headings.js +58 -38
  58. package/dist/core/rules/headings.js.map +1 -1
  59. package/dist/core/rules/hreflang.js +70 -38
  60. package/dist/core/rules/hreflang.js.map +1 -1
  61. package/dist/core/rules/images.js +44 -26
  62. package/dist/core/rules/images.js.map +1 -1
  63. package/dist/core/rules/index.d.ts +6 -6
  64. package/dist/core/rules/index.js +36 -35
  65. package/dist/core/rules/index.js.map +1 -1
  66. package/dist/core/rules/indexing.d.ts +2 -2
  67. package/dist/core/rules/indexing.js +48 -26
  68. package/dist/core/rules/indexing.js.map +1 -1
  69. package/dist/core/rules/keyword.js +84 -47
  70. package/dist/core/rules/keyword.js.map +1 -1
  71. package/dist/core/rules/links.js +72 -37
  72. package/dist/core/rules/links.js.map +1 -1
  73. package/dist/core/rules/meta.js +55 -34
  74. package/dist/core/rules/meta.js.map +1 -1
  75. package/dist/core/rules/response.js +75 -41
  76. package/dist/core/rules/response.js.map +1 -1
  77. package/dist/core/rules/rule.d.ts +6 -6
  78. package/dist/core/rules/rule.js +36 -36
  79. package/dist/core/rules/rule.js.map +1 -1
  80. package/dist/core/rules/social.js +86 -45
  81. package/dist/core/rules/social.js.map +1 -1
  82. package/dist/core/rules/structured-data.d.ts +6 -4
  83. package/dist/core/rules/structured-data.js +314 -102
  84. package/dist/core/rules/structured-data.js.map +1 -1
  85. package/dist/core/rules/title.js +48 -33
  86. package/dist/core/rules/title.js.map +1 -1
  87. package/dist/core/score.d.ts +3 -3
  88. package/dist/core/score.js +11 -9
  89. package/dist/core/score.js.map +1 -1
  90. package/dist/core/site-rules.d.ts +3 -3
  91. package/dist/core/site-rules.js +409 -198
  92. package/dist/core/site-rules.js.map +1 -1
  93. package/dist/core/sitemap.d.ts +5 -5
  94. package/dist/core/sitemap.js +109 -64
  95. package/dist/core/sitemap.js.map +1 -1
  96. package/dist/core/static.d.ts +2 -2
  97. package/dist/core/static.js +209 -112
  98. package/dist/core/static.js.map +1 -1
  99. package/dist/core/summary.d.ts +2 -2
  100. package/dist/core/summary.js +11 -6
  101. package/dist/core/summary.js.map +1 -1
  102. package/dist/core/types.d.ts +14 -14
  103. package/dist/core/types.js +15 -8
  104. package/dist/core/types.js.map +1 -1
  105. package/dist/core/url.d.ts +11 -11
  106. package/dist/core/url.js +122 -70
  107. package/dist/core/url.js.map +1 -1
  108. package/dist/index.d.ts +11 -11
  109. package/dist/index.js +9 -9
  110. package/dist/index.js.map +1 -1
  111. package/dist/mcp-bin.js +7 -4
  112. package/dist/mcp-bin.js.map +1 -1
  113. package/dist/mcp.d.ts +3 -3
  114. package/dist/mcp.js +312 -122
  115. package/dist/mcp.js.map +1 -1
  116. package/dist/version.d.ts +0 -1
  117. package/dist/version.js +4 -2
  118. package/dist/version.js.map +1 -1
  119. package/package.json +27 -9
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 Rik Visser, Rivi Software
3
+ Copyright (c) 2026 RIVI Software
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -1,8 +1,42 @@
1
- <img src="assets/icon.svg" width="64" height="64" alt="">
2
-
3
- # agentic-seo-check
4
-
5
- SEO analysis built for coding agents. One core, two interfaces:
1
+ <p align="center">
2
+ <a href="https://rivi.software">
3
+ <picture>
4
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/rivi-software/agentic-seo-check/main/assets/rivi-agentic-seo-check-on-dark.svg">
5
+ <img src="https://raw.githubusercontent.com/rivi-software/agentic-seo-check/main/assets/rivi-agentic-seo-check.svg" alt="RIVI agentic-seo-check" width="545">
6
+ </picture>
7
+ </a>
8
+ </p>
9
+
10
+ <p align="center">
11
+ SEO analysis built for coding agents: a CLI and an MCP server that audit URLs,<br>
12
+ static build output or raw HTML, and return findings an agent can act on.<br>
13
+ Open source, from <a href="https://rivi.software">RIVI Software</a>.
14
+ </p>
15
+
16
+ <p align="center">
17
+ <a href="https://github.com/rivi-software/agentic-seo-check/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/rivi-software/agentic-seo-check/ci.yml?branch=main&label=CI" alt="CI status"></a>
18
+ <a href="https://www.npmjs.com/package/@rivi-software/agentic-seo-check"><img src="https://img.shields.io/npm/v/@rivi-software/agentic-seo-check?color=0b6b3a" alt="npm version"></a>
19
+ <a href="https://www.npmjs.com/package/@rivi-software/agentic-seo-check"><img src="https://img.shields.io/npm/dm/@rivi-software/agentic-seo-check?color=0b6b3a" alt="Monthly npm downloads"></a>
20
+ <a href="https://github.com/rivi-software/agentic-seo-check/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-0b6b3a" alt="MIT License"></a>
21
+ </p>
22
+
23
+ <p align="center">
24
+ <a href="#install">Install</a>
25
+ ·
26
+ <a href="#cli">CLI</a>
27
+ ·
28
+ <a href="#mcp-server">MCP server</a>
29
+ ·
30
+ <a href="#agent-skill">Agent skill</a>
31
+ ·
32
+ <a href="https://github.com/rivi-software/agentic-seo-check/blob/main/CONTRIBUTING.md">Contributing</a>
33
+ ·
34
+ <a href="https://rivi.software">rivi.software</a>
35
+ </p>
36
+
37
+ <br>
38
+
39
+ agentic-seo-check is one core with two interfaces:
6
40
 
7
41
  - **CLI** `agentic-seo-check` with JSON (default when piped) or Markdown output and CI-friendly exit codes.
8
42
  - **MCP server** exposing five tools for Claude Code, Cursor, Codex and any other MCP client.
@@ -140,22 +174,38 @@ const site = await auditSite('https://www.example.com/', { maxPages: 100 });
140
174
  console.log(renderMarkdown(site));
141
175
  ```
142
176
 
143
- ## Development
144
-
145
- ```bash
146
- pnpm test # vitest: extractor, rules, crawler against a local fixture server, directory scan, MCP client
147
- pnpm typecheck
148
- pnpm dev audit https://example.com # run from source with tsx
149
- ```
150
-
151
177
  ## Scope of this first version
152
178
 
153
179
  - Crawls are breadth-first, same-site, HTML only, and obey robots.txt by default. `--render`/`--lighthouse` apply to the start page only during a crawl.
154
180
  - Scores are indicative. Thresholds (title 30-60 chars, description 70-160, thin content 300 words, slow response 2 s, deep page depth 3) are configurable through the library `thresholds` option.
155
181
  - Not included yet: gzip sitemaps, rendering every page in a crawl, field (CrUX) data, rank tracking, backlink data, AI-generated copy suggestions.
156
182
 
183
+ ## Contributing
184
+
185
+ Bug reports, wrong findings, new rules and fixes are welcome from anyone. With Node 24 and pnpm 12:
186
+
187
+ ```bash
188
+ pnpm install
189
+ pnpm run verify
190
+ ```
191
+
192
+ `verify` runs what CI runs: format, lint, typecheck, tests, build and a check of the packed package. `pnpm run dev audit https://example.com` runs the CLI from source. [CONTRIBUTING.md](https://github.com/rivi-software/agentic-seo-check/blob/main/CONTRIBUTING.md) covers proposing a change, what a pull request needs and how releases reach npm, and [AGENTS.md](https://github.com/rivi-software/agentic-seo-check/blob/main/AGENTS.md) is the brief for coding agents working on the tool itself. Everyone who takes part follows the [code of conduct](https://github.com/rivi-software/agentic-seo-check/blob/main/CODE_OF_CONDUCT.md). [SECURITY.md](https://github.com/rivi-software/agentic-seo-check/blob/main/SECURITY.md) says how to report a vulnerability privately.
193
+
157
194
  ## License
158
195
 
159
- MIT. See [LICENSE](LICENSE).
196
+ Licensed under the [MIT License](https://github.com/rivi-software/agentic-seo-check/blob/main/LICENSE). Copyright © 2026 RIVI Software.
197
+
198
+ <br>
199
+
200
+ <p align="center">
201
+ <a href="https://rivi.software">
202
+ <picture>
203
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/rivi-software/agentic-seo-check/main/assets/rivi-mark-on-dark.svg">
204
+ <img src="https://raw.githubusercontent.com/rivi-software/agentic-seo-check/main/assets/rivi-mark.svg" alt="RIVI Software" width="36" height="36">
205
+ </picture>
206
+ </a>
207
+ </p>
160
208
 
161
- Created in [T3 Code](https://t3.codes).
209
+ <p align="center">
210
+ <sub>RIVI agentic-seo-check is made by <a href="https://rivi.software">RIVI Software</a>, which builds software for radio stations. Created in <a href="https://t3.codes">T3 Code</a>.</sub>
211
+ </p>
@@ -0,0 +1,11 @@
1
+ /**
2
+ * RIVI Software's name, site and mark as the CLI, the MCP server and the Markdown report show
3
+ * them. The marks are copies of assets/rivi-mark.svg and assets/rivi-mark-on-dark.svg, inlined
4
+ * because npm ships dist/ without assets/.
5
+ */
6
+ import type { Icon } from "@modelcontextprotocol/sdk/types.js";
7
+ export declare const MAKER = "RIVI Software";
8
+ export declare const MAKER_URL = "https://rivi.software";
9
+ export declare const REPOSITORY_URL = "https://github.com/rivi-software/agentic-seo-check";
10
+ /** The mark as MCP icons: the ink tile for light themes, the light tile for dark ones. */
11
+ export declare const MCP_ICONS: Icon[];
package/dist/brand.js ADDED
@@ -0,0 +1,22 @@
1
+ export const MAKER = "RIVI Software";
2
+ export const MAKER_URL = "https://rivi.software";
3
+ export const REPOSITORY_URL = "https://github.com/rivi-software/agentic-seo-check";
4
+ const MARK_SVG = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40 40" role="img" aria-label="RIVI Software"><rect width="40" height="40" rx="9" fill="#15171a"/><g fill="#f5f6f7"><rect x="8" y="16" width="3" height="8" rx="1.5"/><rect x="13.25" y="11" width="3" height="18" rx="1.5"/><rect x="18.5" y="7" width="3" height="26" rx="1.5" fill="#3be08a"/><rect x="23.75" y="12" width="3" height="16" rx="1.5"/><rect x="29" y="16" width="3" height="8" rx="1.5"/></g></svg>';
5
+ const MARK_ON_DARK_SVG = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40 40" role="img" aria-label="RIVI Software"><rect width="40" height="40" rx="9" fill="#f5f6f7"/><g fill="#15171a"><rect x="8" y="16" width="3" height="8" rx="1.5"/><rect x="13.25" y="11" width="3" height="18" rx="1.5"/><rect x="18.5" y="7" width="3" height="26" rx="1.5" fill="#0e9f55"/><rect x="23.75" y="12" width="3" height="16" rx="1.5"/><rect x="29" y="16" width="3" height="8" rx="1.5"/></g></svg>';
6
+ const dataUri = (svg) => `data:image/svg+xml;base64,${Buffer.from(svg, "utf-8").toString("base64")}`;
7
+ /** The mark as MCP icons: the ink tile for light themes, the light tile for dark ones. */
8
+ export const MCP_ICONS = [
9
+ {
10
+ mimeType: "image/svg+xml",
11
+ sizes: ["any"],
12
+ src: dataUri(MARK_SVG),
13
+ theme: "light",
14
+ },
15
+ {
16
+ mimeType: "image/svg+xml",
17
+ sizes: ["any"],
18
+ src: dataUri(MARK_ON_DARK_SVG),
19
+ theme: "dark",
20
+ },
21
+ ];
22
+ //# sourceMappingURL=brand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand.js","sourceRoot":"","sources":["../src/brand.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,KAAK,GAAG,eAAe,CAAC;AACrC,MAAM,CAAC,MAAM,SAAS,GAAG,uBAAuB,CAAC;AAEjD,MAAM,CAAC,MAAM,cAAc,GACzB,oDAAoD,CAAC;AAEvD,MAAM,QAAQ,GACZ,2cAA2c,CAAC;AAE9c,MAAM,gBAAgB,GACpB,2cAA2c,CAAC;AAE9c,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,EAAE,CAC9B,6BAA6B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;AAE9E,0FAA0F;AAC1F,MAAM,CAAC,MAAM,SAAS,GAAW;IAC/B;QACE,QAAQ,EAAE,eAAe;QACzB,KAAK,EAAE,CAAC,KAAK,CAAC;QACd,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC;QACtB,KAAK,EAAE,OAAO;KACf;IACD;QACE,QAAQ,EAAE,eAAe;QACzB,KAAK,EAAE,CAAC,KAAK,CAAC;QACd,GAAG,EAAE,OAAO,CAAC,gBAAgB,CAAC;QAC9B,KAAK,EAAE,MAAM;KACd;CACF,CAAC"}
package/dist/cli.js CHANGED
@@ -1,68 +1,91 @@
1
1
  #!/usr/bin/env node
2
- import { promises as fs } from 'node:fs';
3
- import { Command, InvalidArgumentError, Option } from 'commander';
4
- import { auditTarget, compactAudit } from './core/audit.js';
5
- import { renderMarkdown } from './core/report/markdown.js';
6
- import { ALL_RULES } from './core/rules/index.js';
7
- import { SEVERITY_RANK } from './core/types.js';
8
- import { startMcpServer } from './mcp.js';
9
- import { VERSION } from './version.js';
2
+ import { promises as fs } from "node:fs";
3
+ import { Command, InvalidArgumentError, Option } from "commander";
4
+ import { MAKER, MAKER_URL, REPOSITORY_URL } from "./brand.js";
5
+ import { auditTarget, compactAudit } from "./core/audit.js";
6
+ import { renderMarkdown } from "./core/report/markdown.js";
7
+ import { ALL_RULES } from "./core/rules/index.js";
8
+ import { SEVERITY_RANK } from "./core/types.js";
9
+ import { startMcpServer } from "./mcp.js";
10
+ import { VERSION } from "./version.js";
10
11
  const program = new Command();
11
12
  program
12
- .name('agentic-seo-check')
13
- .description('SEO analysis for coding agents. Audits URLs, static build output or raw HTML and prints machine-readable findings.')
13
+ .name("agentic-seo-check")
14
+ .description("SEO analysis for coding agents. Audits URLs, static build output or raw HTML and prints machine-readable findings.")
14
15
  .version(VERSION)
16
+ .addHelpText("afterAll", `\nMade by ${MAKER} (${MAKER_URL}). Docs and issues: ${REPOSITORY_URL}`)
15
17
  .showHelpAfterError();
16
18
  const intArg = (value) => {
19
+ // oxlint-disable-next-line unicorn/prefer-number-coercion -- parseInt reads the leading digits ("10.5" is 10), where Number would refuse what users have always passed
17
20
  const n = Number.parseInt(value, 10);
18
- if (!Number.isFinite(n) || n < 0)
19
- throw new InvalidArgumentError('Expected a non-negative integer.');
21
+ if (!Number.isFinite(n) || n < 0) {
22
+ throw new InvalidArgumentError("Expected a non-negative integer.");
23
+ }
20
24
  return n;
21
25
  };
22
- function addAuditOptions(cmd, crawlDefault) {
23
- if (!crawlDefault)
24
- cmd.option('--crawl', 'Crawl the whole site starting at the URL instead of auditing one page');
26
+ const addAuditOptions = (cmd, crawlDefault) => {
27
+ if (!crawlDefault) {
28
+ cmd.option("--crawl", "Crawl the whole site starting at the URL instead of auditing one page");
29
+ }
25
30
  return cmd
26
- .option('--max-pages <n>', 'Maximum pages to crawl', intArg, 50)
27
- .option('--max-depth <n>', 'Maximum link depth from the start URL', intArg, 3)
28
- .option('--concurrency <n>', 'Parallel requests while crawling', intArg, 5)
29
- .option('--delay <ms>', 'Delay between requests per worker', intArg, 0)
30
- .option('-k, --keyword <keyword>', 'Target keyword for keyword.* checks')
31
- .option('--render', 'Render with headless Chromium (Playwright) and compare with the server HTML')
32
- .option('--lighthouse', 'Run Lighthouse for Core Web Vitals and Lighthouse SEO audits (slow)')
33
- .addOption(new Option('--form-factor <type>', 'Lighthouse device emulation').choices(['mobile', 'desktop']).default('mobile'))
34
- .option('--base-url <url>', 'Origin used for directories, files and stdin HTML (default http://localhost/)')
35
- .option('--ignore-robots', 'Do not obey robots.txt while crawling')
36
- .option('--include-subdomains', 'Treat subdomains as internal when crawling')
37
- .option('--check-external', 'Probe external links for 4xx/5xx while crawling')
38
- .option('--include <regex...>', 'Only crawl URLs matching these patterns')
39
- .option('--exclude <regex...>', 'Skip URLs matching these patterns')
40
- .addOption(new Option('-f, --format <format>', 'Output format (default: json when piped, md on a terminal)').choices(['json', 'md']))
41
- .option('-o, --out <file>', 'Write the report to a file instead of stdout')
42
- .addOption(new Option('--fail-on <severity>', 'Exit with code 1 when findings at or above this severity exist').choices(['error', 'warning', 'info', 'none']).default('none'))
43
- .option('--no-info', 'Omit info-level findings')
44
- .option('--compact', 'Trim evidence lists and bulky fields (smaller output for LLM consumption)')
45
- .addOption(new Option('--page-detail <level>', 'Per-page detail in site reports').choices(['full', 'summary']).default('full'))
46
- .option('--disable <rule...>', 'Rule ids to skip')
47
- .option('--timeout <ms>', 'Per-request timeout', intArg, 15_000)
48
- .option('--user-agent <ua>', 'Custom User-Agent header')
49
- .option('-H, --header <header...>', 'Extra request header "Name: value" (repeatable)')
50
- .option('-q, --quiet', 'Suppress progress output on stderr');
51
- }
52
- async function runAudit(target, opts, forceCrawl) {
31
+ .option("--max-pages <n>", "Maximum pages to crawl", intArg, 50)
32
+ .option("--max-depth <n>", "Maximum link depth from the start URL", intArg, 3)
33
+ .option("--concurrency <n>", "Parallel requests while crawling", intArg, 5)
34
+ .option("--delay <ms>", "Delay between requests per worker", intArg, 0)
35
+ .option("-k, --keyword <keyword>", "Target keyword for keyword.* checks")
36
+ .option("--render", "Render with headless Chromium (Playwright) and compare with the server HTML")
37
+ .option("--lighthouse", "Run Lighthouse for Core Web Vitals and Lighthouse SEO audits (slow)")
38
+ .addOption(new Option("--form-factor <type>", "Lighthouse device emulation")
39
+ .choices(["mobile", "desktop"])
40
+ .default("mobile"))
41
+ .option("--base-url <url>", "Origin used for directories, files and stdin HTML (default http://localhost/)")
42
+ .option("--ignore-robots", "Do not obey robots.txt while crawling")
43
+ .option("--include-subdomains", "Treat subdomains as internal when crawling")
44
+ .option("--check-external", "Probe external links for 4xx/5xx while crawling")
45
+ .option("--include <regex...>", "Only crawl URLs matching these patterns")
46
+ .option("--exclude <regex...>", "Skip URLs matching these patterns")
47
+ .addOption(new Option("-f, --format <format>", "Output format (default: json when piped, md on a terminal)").choices(["json", "md"]))
48
+ .option("-o, --out <file>", "Write the report to a file instead of stdout")
49
+ .addOption(new Option("--fail-on <severity>", "Exit with code 1 when findings at or above this severity exist")
50
+ .choices(["error", "warning", "info", "none"])
51
+ .default("none"))
52
+ .option("--no-info", "Omit info-level findings")
53
+ .option("--compact", "Trim evidence lists and bulky fields (smaller output for LLM consumption)")
54
+ .addOption(new Option("--page-detail <level>", "Per-page detail in site reports")
55
+ .choices(["full", "summary"])
56
+ .default("full"))
57
+ .option("--disable <rule...>", "Rule ids to skip")
58
+ .option("--timeout <ms>", "Per-request timeout", intArg, 15_000)
59
+ .option("--user-agent <ua>", "Custom User-Agent header")
60
+ .option("-H, --header <header...>", 'Extra request header "Name: value" (repeatable)')
61
+ .option("-q, --quiet", "Suppress progress output on stderr");
62
+ };
63
+ /** The report format: as asked, else by the output file's extension, else Markdown on a terminal. */
64
+ const formatOf = (opts) => {
65
+ if (opts.format !== undefined) {
66
+ return opts.format;
67
+ }
68
+ if (opts.out) {
69
+ return opts.out.endsWith(".md") ? "md" : "json";
70
+ }
71
+ return process.stdout.isTTY ? "md" : "json";
72
+ };
73
+ const runAudit = async (target, opts, forceCrawl) => {
53
74
  const headers = {};
54
75
  for (const h of opts.header ?? []) {
55
- const idx = h.indexOf(':');
56
- if (idx === -1)
76
+ const idx = h.indexOf(":");
77
+ if (idx === -1) {
57
78
  throw new InvalidArgumentError(`Header "${h}" must be "Name: value".`);
79
+ }
58
80
  headers[h.slice(0, idx).trim()] = h.slice(idx + 1).trim();
59
81
  }
60
82
  const showProgress = !opts.quiet && process.stderr.isTTY;
61
83
  const onProgress = (e) => {
62
- if (!showProgress)
84
+ if (!showProgress) {
63
85
  return;
64
- const counter = e.crawled !== undefined ? ` [${e.crawled}/${e.discovered}]` : '';
65
- process.stderr.write(`\x1b[2m${e.phase}${counter}: ${e.message}\x1b[0m\n`);
86
+ }
87
+ const counter = e.crawled === undefined ? "" : ` [${e.crawled}/${e.discovered}]`;
88
+ process.stderr.write(`\u001B[2m${e.phase}${counter}: ${e.message}\u001B[0m\n`);
66
89
  };
67
90
  const options = {
68
91
  crawl: forceCrawl || Boolean(opts.crawl),
@@ -83,67 +106,89 @@ async function runAudit(target, opts, forceCrawl) {
83
106
  includeInfo: opts.info,
84
107
  disableRules: opts.disable,
85
108
  pageDetail: opts.pageDetail,
86
- fetch: { timeoutMs: opts.timeout, userAgent: opts.userAgent, headers: Object.keys(headers).length ? headers : undefined },
109
+ fetch: {
110
+ timeoutMs: opts.timeout,
111
+ userAgent: opts.userAgent,
112
+ headers: Object.keys(headers).length ? headers : undefined,
113
+ },
87
114
  onProgress,
88
115
  };
89
116
  let audit = await auditTarget(target, options);
90
- if (opts.compact)
117
+ if (opts.compact) {
91
118
  audit = compactAudit(audit);
92
- const format = opts.format ?? (opts.out ? (opts.out.endsWith('.md') ? 'md' : 'json') : process.stdout.isTTY ? 'md' : 'json');
93
- const output = format === 'md' ? renderMarkdown(audit) : JSON.stringify(audit, null, 2);
119
+ }
120
+ const format = formatOf(opts);
121
+ const output = format === "md" ? renderMarkdown(audit) : JSON.stringify(audit, null, 2);
94
122
  if (opts.out) {
95
- await fs.writeFile(opts.out, output + '\n', 'utf8');
96
- if (!opts.quiet)
123
+ await fs.writeFile(opts.out, `${output}\n`, "utf-8");
124
+ if (!opts.quiet) {
97
125
  process.stderr.write(`Report written to ${opts.out}\n`);
126
+ }
98
127
  }
99
128
  else {
100
- process.stdout.write(output + '\n');
129
+ process.stdout.write(`${output}\n`);
101
130
  }
102
- if (opts.failOn !== 'none') {
131
+ if (opts.failOn !== "none") {
103
132
  const threshold = SEVERITY_RANK[opts.failOn];
104
- const counts = audit.counts;
105
- const hits = ['error', 'warning', 'info'].filter((s) => SEVERITY_RANK[s] >= threshold).reduce((n, s) => n + counts[s], 0);
133
+ const { counts } = audit;
134
+ const hits = ["error", "warning", "info"]
135
+ .filter((s) => SEVERITY_RANK[s] >= threshold)
136
+ .reduce((n, s) => n + counts[s], 0);
106
137
  if (hits > 0) {
107
- if (!opts.quiet)
138
+ if (!opts.quiet) {
108
139
  process.stderr.write(`${hits} finding(s) at or above "${opts.failOn}" severity.\n`);
140
+ }
109
141
  process.exitCode = 1;
110
142
  }
111
143
  }
112
- }
144
+ };
113
145
  addAuditOptions(program
114
- .command('audit')
115
- .argument('<target>', 'URL, directory of HTML files, .html file, or "-" for HTML on stdin')
116
- .description('Audit a page, a site (--crawl), a build directory or raw HTML'), false).action(async (target, opts) => {
146
+ .command("audit")
147
+ .argument("<target>", 'URL, directory of HTML files, .html file, or "-" for HTML on stdin')
148
+ .description("Audit a page, a site (--crawl), a build directory or raw HTML"), false).action(async (target, opts) => {
117
149
  await runAudit(target, opts, false);
118
150
  });
119
- addAuditOptions(program.command('crawl').argument('<url>', 'Start URL').description('Crawl a site and audit every page (same as "audit --crawl")'), true).action(async (url, opts) => {
151
+ addAuditOptions(program
152
+ .command("crawl")
153
+ .argument("<url>", "Start URL")
154
+ .description('Crawl a site and audit every page (same as "audit --crawl")'), true).action(async (url, opts) => {
120
155
  await runAudit(url, opts, true);
121
156
  });
122
157
  program
123
- .command('rules')
124
- .description('List the rules this tool can report')
125
- .option('--category <category>', 'Filter by category')
126
- .option('--rule <id>', 'Show one rule')
127
- .addOption(new Option('-f, --format <format>', 'Output format').choices(['json', 'md']).default(process.stdout.isTTY ? 'md' : 'json'))
158
+ .command("rules")
159
+ .description("List the rules this tool can report")
160
+ .option("--category <category>", "Filter by category")
161
+ .option("--rule <id>", "Show one rule")
162
+ .addOption(new Option("-f, --format <format>", "Output format")
163
+ .choices(["json", "md"])
164
+ .default(process.stdout.isTTY ? "md" : "json"))
128
165
  .action((opts) => {
129
- const rules = ALL_RULES.filter((r) => (!opts.category || r.category === opts.category) && (!opts.rule || r.id === opts.rule));
130
- if (opts.format === 'json') {
131
- process.stdout.write(JSON.stringify({ count: rules.length, rules }, null, 2) + '\n');
166
+ const rules = ALL_RULES.filter((r) => (!opts.category || r.category === opts.category) &&
167
+ (!opts.rule || r.id === opts.rule));
168
+ if (opts.format === "json") {
169
+ process.stdout.write(`${JSON.stringify({ count: rules.length, rules }, null, 2)}\n`);
132
170
  return;
133
171
  }
134
- const lines = ['| Rule | Severity | Category | Checks |', '| --- | --- | --- | --- |'];
135
- for (const r of rules)
136
- lines.push(`| \`${r.id}\` | ${r.severity} | ${r.category} | ${r.description.replace(/\|/g, '\\|')}${r.requires ? ` _(requires ${r.requires})_` : ''} |`);
137
- process.stdout.write(lines.join('\n') + '\n');
172
+ const lines = [
173
+ "| Rule | Severity | Category | Checks |",
174
+ "| --- | --- | --- | --- |",
175
+ ];
176
+ for (const r of rules) {
177
+ lines.push(`| \`${r.id}\` | ${r.severity} | ${r.category} | ${r.description.replaceAll("|", "\\|")}${r.requires ? ` _(requires ${r.requires})_` : ""} |`);
178
+ }
179
+ process.stdout.write(`${lines.join("\n")}\n`);
138
180
  });
139
181
  program
140
- .command('mcp')
141
- .description('Start the MCP server on stdio (for Claude Code, Cursor, Codex, etc.)')
182
+ .command("mcp")
183
+ .description("Start the MCP server on stdio (for Claude Code, Cursor, Codex, etc.)")
142
184
  .action(async () => {
143
185
  await startMcpServer();
144
186
  });
145
- program.parseAsync(process.argv).catch((err) => {
146
- process.stderr.write(`agentic-seo-check: ${err instanceof Error ? err.message : String(err)}\n`);
187
+ try {
188
+ await program.parseAsync(process.argv);
189
+ }
190
+ catch (error) {
191
+ process.stderr.write(`agentic-seo-check: ${error instanceof Error ? error.message : String(error)}\n`);
147
192
  process.exit(2);
148
- });
193
+ }
149
194
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAyC,MAAM,iBAAiB,CAAC;AACnG,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,aAAa,EAA6B,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAC9B,OAAO;KACJ,IAAI,CAAC,mBAAmB,CAAC;KACzB,WAAW,CAAC,oHAAoH,CAAC;KACjI,OAAO,CAAC,OAAO,CAAC;KAChB,kBAAkB,EAAE,CAAC;AAExB,MAAM,MAAM,GAAG,CAAC,KAAa,EAAU,EAAE;IACvC,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACrC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,oBAAoB,CAAC,kCAAkC,CAAC,CAAC;IACrG,OAAO,CAAC,CAAC;AACX,CAAC,CAAC;AAEF,SAAS,eAAe,CAAC,GAAY,EAAE,YAAqB;IAC1D,IAAI,CAAC,YAAY;QAAE,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,uEAAuE,CAAC,CAAC;IAClH,OAAO,GAAG;SACP,MAAM,CAAC,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,EAAE,EAAE,CAAC;SAC/D,MAAM,CAAC,iBAAiB,EAAE,uCAAuC,EAAE,MAAM,EAAE,CAAC,CAAC;SAC7E,MAAM,CAAC,mBAAmB,EAAE,kCAAkC,EAAE,MAAM,EAAE,CAAC,CAAC;SAC1E,MAAM,CAAC,cAAc,EAAE,mCAAmC,EAAE,MAAM,EAAE,CAAC,CAAC;SACtE,MAAM,CAAC,yBAAyB,EAAE,qCAAqC,CAAC;SACxE,MAAM,CAAC,UAAU,EAAE,6EAA6E,CAAC;SACjG,MAAM,CAAC,cAAc,EAAE,qEAAqE,CAAC;SAC7F,SAAS,CAAC,IAAI,MAAM,CAAC,sBAAsB,EAAE,6BAA6B,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;SAC7H,MAAM,CAAC,kBAAkB,EAAE,+EAA+E,CAAC;SAC3G,MAAM,CAAC,iBAAiB,EAAE,uCAAuC,CAAC;SAClE,MAAM,CAAC,sBAAsB,EAAE,4CAA4C,CAAC;SAC5E,MAAM,CAAC,kBAAkB,EAAE,iDAAiD,CAAC;SAC7E,MAAM,CAAC,sBAAsB,EAAE,yCAAyC,CAAC;SACzE,MAAM,CAAC,sBAAsB,EAAE,mCAAmC,CAAC;SACnE,SAAS,CAAC,IAAI,MAAM,CAAC,uBAAuB,EAAE,4DAA4D,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;SACpI,MAAM,CAAC,kBAAkB,EAAE,8CAA8C,CAAC;SAC1E,SAAS,CAAC,IAAI,MAAM,CAAC,sBAAsB,EAAE,gEAAgE,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;SAC7K,MAAM,CAAC,WAAW,EAAE,0BAA0B,CAAC;SAC/C,MAAM,CAAC,WAAW,EAAE,2EAA2E,CAAC;SAChG,SAAS,CAAC,IAAI,MAAM,CAAC,uBAAuB,EAAE,iCAAiC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;SAC9H,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;SACjD,MAAM,CAAC,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM,CAAC;SAC/D,MAAM,CAAC,mBAAmB,EAAE,0BAA0B,CAAC;SACvD,MAAM,CAAC,0BAA0B,EAAE,iDAAiD,CAAC;SACrF,MAAM,CAAC,aAAa,EAAE,oCAAoC,CAAC,CAAC;AACjE,CAAC;AA+BD,KAAK,UAAU,QAAQ,CAAC,MAAc,EAAE,IAAgB,EAAE,UAAmB;IAC3E,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,MAAM,IAAI,oBAAoB,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAC;QACvF,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5D,CAAC;IACD,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;IACzD,MAAM,UAAU,GAAG,CAAC,CAAgB,EAAQ,EAAE;QAC5C,IAAI,CAAC,YAAY;YAAE,OAAO;QAC1B,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACjF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,KAAK,GAAG,OAAO,KAAK,CAAC,CAAC,OAAO,WAAW,CAAC,CAAC;IAC7E,CAAC,CAAC;IACF,MAAM,OAAO,GAAuC;QAClD,KAAK,EAAE,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;QACxC,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,OAAO,EAAE,IAAI,CAAC,KAAK;QACnB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,aAAa,EAAE,CAAC,IAAI,CAAC,YAAY;QACjC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;QACzC,kBAAkB,EAAE,IAAI,CAAC,aAAa;QACtC,eAAe,EAAE,IAAI,CAAC,OAAO;QAC7B,eAAe,EAAE,IAAI,CAAC,OAAO;QAC7B,WAAW,EAAE,IAAI,CAAC,IAAI;QACtB,YAAY,EAAE,IAAI,CAAC,OAAO;QAC1B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE;QACzH,UAAU;KACX,CAAC;IAEF,IAAI,KAAK,GAAU,MAAM,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtD,IAAI,IAAI,CAAC,OAAO;QAAE,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAE9C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC7H,MAAM,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACxF,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IAC3E,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC5B,MAAM,IAAI,GAAI,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrI,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;YACb,IAAI,CAAC,IAAI,CAAC,KAAK;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,4BAA4B,IAAI,CAAC,MAAM,eAAe,CAAC,CAAC;YACrG,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;AACH,CAAC;AAED,eAAe,CACb,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,QAAQ,CAAC,UAAU,EAAE,oEAAoE,CAAC;KAC1F,WAAW,CAAC,+DAA+D,CAAC,EAC/E,KAAK,CACN,CAAC,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAAgB,EAAE,EAAE;IAClD,MAAM,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AACtC,CAAC,CAAC,CAAC;AAEH,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,WAAW,CAAC,6DAA6D,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,IAAgB,EAAE,EAAE;IACvM,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEH,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,uBAAuB,EAAE,oBAAoB,CAAC;KACrD,MAAM,CAAC,aAAa,EAAE,eAAe,CAAC;KACtC,SAAS,CAAC,IAAI,MAAM,CAAC,uBAAuB,EAAE,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;KACrI,MAAM,CAAC,CAAC,IAAiE,EAAE,EAAE;IAC5E,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9H,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACrF,OAAO;IACT,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,yCAAyC,EAAE,2BAA2B,CAAC,CAAC;IACvF,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAChL,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AAChD,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,sEAAsE,CAAC;KACnF,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,cAAc,EAAE,CAAC;AACzB,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IACtD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { type ProgressEvent } from './crawl.js';
2
- import { type FetchOptions } from './fetch.js';
3
- import { type Audit, type IssueRollup, type PageAudit, type PageSource, type ResponseInfo, type SiteAudit, type Thresholds } from './types.js';
4
- export type { ProgressEvent } from './crawl.js';
1
+ import type { ProgressEvent } from "./crawl.js";
2
+ import type { FetchOptions } from "./fetch.js";
3
+ import type { Audit, IssueRollup, PageAudit, PageSource, ResponseInfo, SiteAudit, Thresholds } from "./types.js";
4
+ export type { ProgressEvent } from "./crawl.js";
5
5
  export interface AuditOptions {
6
6
  /** Target keyword/phrase for the keyword.* rules. */
7
7
  keyword?: string;
@@ -9,7 +9,7 @@ export interface AuditOptions {
9
9
  render?: boolean;
10
10
  /** Run Lighthouse (performance + SEO + agentic-browsing categories). */
11
11
  lighthouse?: boolean;
12
- formFactor?: 'mobile' | 'desktop';
12
+ formFactor?: "mobile" | "desktop";
13
13
  /** Include info-level findings (default true). */
14
14
  includeInfo?: boolean;
15
15
  /** Rule ids to skip. */
@@ -32,7 +32,7 @@ export interface CrawlOptions extends AuditOptions {
32
32
  includePatterns?: string[];
33
33
  excludePatterns?: string[];
34
34
  /** How much per-page detail to keep in the site result. */
35
- pageDetail?: 'full' | 'summary';
35
+ pageDetail?: "full" | "summary";
36
36
  }
37
37
  export interface HtmlAuditInput {
38
38
  url?: string;
@@ -48,25 +48,25 @@ export declare const DEFAULT_CRAWL: {
48
48
  readonly delayMs: 0;
49
49
  readonly maxLinkChecks: 200;
50
50
  };
51
+ export declare const rollupIssues: (pages: PageAudit[]) => IssueRollup[];
52
+ export declare const recomputeSite: (site: SiteAudit) => void;
51
53
  /** Audit an HTML string. `url` is used to resolve links and for display. */
52
- export declare function auditHtml(html: string, input?: HtmlAuditInput, options?: AuditOptions): Promise<PageAudit>;
54
+ export declare const auditHtml: (html: string, input?: HtmlAuditInput, options?: AuditOptions) => Promise<PageAudit>;
53
55
  /** Fetch and audit one URL. Optionally render and/or run Lighthouse. */
54
- export declare function auditUrl(url: string, options?: AuditOptions): Promise<PageAudit>;
56
+ export declare const auditUrl: (url: string, options?: AuditOptions) => Promise<PageAudit>;
55
57
  /** Audit a single .html file from disk. */
56
- export declare function auditFile(filePath: string, options?: AuditOptions): Promise<PageAudit>;
58
+ export declare const auditFile: (filePath: string, options?: AuditOptions) => Promise<PageAudit>;
57
59
  /** Crawl a site and audit every page plus site-level checks. */
58
- export declare function auditSite(startUrl: string, options?: CrawlOptions): Promise<SiteAudit>;
60
+ export declare const auditSite: (startUrl: string, options?: CrawlOptions) => Promise<SiteAudit>;
59
61
  /** Audit a directory of built HTML files (dist/, out/, build/). */
60
- export declare function auditDirectory(dir: string, options?: CrawlOptions): Promise<SiteAudit>;
62
+ export declare const auditDirectory: (dir: string, options?: CrawlOptions) => Promise<SiteAudit>;
61
63
  /**
62
64
  * Auto-detect the target type: http(s) URL, directory, .html file, or "-" for stdin.
63
65
  * `crawl` forces a site crawl for URLs.
64
66
  */
65
- export declare function auditTarget(target: string, options?: CrawlOptions & {
67
+ export declare const auditTarget: (target: string, options?: CrawlOptions & {
66
68
  crawl?: boolean;
67
69
  stdinHtml?: string;
68
- }): Promise<Audit>;
69
- export declare function recomputeSite(site: SiteAudit): void;
70
- export declare function rollupIssues(pages: PageAudit[]): IssueRollup[];
70
+ }) => Promise<Audit>;
71
71
  /** Drop bulky, low-value fields to save tokens when the result is consumed by an LLM. */
72
- export declare function compactAudit<T extends Audit>(audit: T): T;
72
+ export declare const compactAudit: <T extends Audit>(audit: T) => T;