searvex-seo 1.1.0 → 1.2.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.
Files changed (71) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/CHANGELOG.md +58 -0
  3. package/README.md +56 -144
  4. package/dist/analyze/audit.d.ts +23 -1
  5. package/dist/analyze/audit.js +77 -15
  6. package/dist/analyze/audit.js.map +1 -1
  7. package/dist/analyze/pre-launch.d.ts +24 -0
  8. package/dist/analyze/pre-launch.js +57 -0
  9. package/dist/analyze/pre-launch.js.map +1 -0
  10. package/dist/analyze/structured-data.d.ts +12 -1
  11. package/dist/analyze/structured-data.js +38 -3
  12. package/dist/analyze/structured-data.js.map +1 -1
  13. package/dist/analyze/technical.js +17 -6
  14. package/dist/analyze/technical.js.map +1 -1
  15. package/dist/cli.d.ts +165 -0
  16. package/dist/cli.js +166 -59
  17. package/dist/cli.js.map +1 -1
  18. package/dist/commands/ecosystem.js +2 -1
  19. package/dist/commands/ecosystem.js.map +1 -1
  20. package/dist/commands/monitor.d.ts +2 -0
  21. package/dist/commands/monitor.js +25 -7
  22. package/dist/commands/monitor.js.map +1 -1
  23. package/dist/commands/research.js +2 -1
  24. package/dist/commands/research.js.map +1 -1
  25. package/dist/commands/run.js +45 -28
  26. package/dist/commands/run.js.map +1 -1
  27. package/dist/core/types.d.ts +6 -0
  28. package/dist/core/url.d.ts +15 -0
  29. package/dist/core/url.js +30 -0
  30. package/dist/core/url.js.map +1 -1
  31. package/dist/crawl/crawler.d.ts +18 -0
  32. package/dist/crawl/crawler.js +47 -4
  33. package/dist/crawl/crawler.js.map +1 -1
  34. package/dist/crawl/sitemap.d.ts +1 -0
  35. package/dist/crawl/sitemap.js +4 -3
  36. package/dist/crawl/sitemap.js.map +1 -1
  37. package/dist/extract/html.d.ts +11 -2
  38. package/dist/extract/html.js +60 -3
  39. package/dist/extract/html.js.map +1 -1
  40. package/dist/net/fetcher.d.ts +2 -2
  41. package/dist/net/fetcher.js +1 -1
  42. package/dist/optimize/fixes.js +1 -1
  43. package/dist/optimize/fixes.js.map +1 -1
  44. package/dist/repo/ast.d.ts +2 -0
  45. package/dist/repo/ast.js +2 -1
  46. package/dist/repo/ast.js.map +1 -1
  47. package/dist/repo/scan.js +18 -3
  48. package/dist/repo/scan.js.map +1 -1
  49. package/dist/report/client.js +14 -10
  50. package/dist/report/client.js.map +1 -1
  51. package/dist/report/html.js +9 -8
  52. package/dist/report/html.js.map +1 -1
  53. package/dist/report/i18n.js +11 -10
  54. package/dist/report/i18n.js.map +1 -1
  55. package/dist/report/markdown.js +27 -3
  56. package/dist/report/markdown.js.map +1 -1
  57. package/dist/report/sarif.js +3 -2
  58. package/dist/report/sarif.js.map +1 -1
  59. package/dist/rules/engine.d.ts +6 -0
  60. package/dist/rules/engine.js +2 -0
  61. package/dist/rules/engine.js.map +1 -1
  62. package/dist/rules/implemented.js +1 -1
  63. package/dist/rules/implemented.js.map +1 -1
  64. package/dist/searvex.mjs +578 -161
  65. package/knowledge/rules/canonicalization.json +6 -4
  66. package/knowledge/rules/crawlability.json +39 -2
  67. package/knowledge/rules/indexability.json +6 -4
  68. package/knowledge/rules/performance.json +4 -3
  69. package/knowledge/rules/security.json +4 -3
  70. package/knowledge/rules/structured-data.json +11 -5
  71. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "searvex",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "Understand search, fix what matters: deterministic technical SEO + GEO audits with a sourced rule base, a bilingual (EN/TR) action-center report with root-cause groups and repair prompts, competitor research, and safe, verified code fixes with rollback.",
5
5
  "author": { "name": "Cihan Topaç", "url": "https://github.com/cihantopac" },
6
6
  "license": "Apache-2.0",
package/CHANGELOG.md CHANGED
@@ -5,6 +5,64 @@ All notable changes to this project are documented here. The format follows
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [1.2.0] - 2026-11-03
9
+
10
+ Trustworthy in pre-launch and embedded use. Release notes: [docs/release-notes-1.2.0.md](docs/release-notes-1.2.0.md).
11
+
12
+ ### Added
13
+ - Exit code `4`: the start URL failed at the network level (DNS, TCP, TLS). `audit`, `geo`, `monitor` and `run`
14
+ write their reports with `crawl.status: "unreachable"`, no site findings and `scores.notApplicable`, instead of
15
+ reporting `robots.unreachable` with a score. An unreachable run is never used as a monitor baseline.
16
+ - A target blocked by the network policy (for example a local server without `--allow-private`) is now a usage
17
+ error (exit `2`) with a hint.
18
+ - `--help` and `docs/cli.md` list the exit codes; `5` is reserved for interrupted runs (planned, not returned yet).
19
+ - `--site-url <url>` in URL mode (`audit`, `geo`, `monitor`, `run`): audit a local or staging build as its public
20
+ site. Canonical, hreflang, sitemap and link URLs on the public origin are mapped to the crawled origin, so a
21
+ public self-canonical no longer shows up as `canonical.cross-domain` / `canonical.noindex-conflict`, and the
22
+ declared sitemap is read from the build. The report records `crawl.siteUrl` and says "Audited … as …".
23
+ - Rule `robots.sitemap-unreachable` (low): a sitemap declared in robots.txt cannot be fetched (DNS, connection,
24
+ TLS or non-200). Each failing declared sitemap is reported, also when another one works; with `--site-url` the
25
+ evidence names where it was fetched.
26
+ - `--pre-launch` profile for local and staging builds. Noindex pages are evaluated as they will be once live, and
27
+ their noindex is listed in a **Launch checklist**. Findings of rules tagged `environment: server | launch` (HTTPS
28
+ and compression on the test server; noindex, disallow-all, an unreachable public sitemap) get
29
+ `context: "environment" | "launch-checklist"` and are excluded from the score, `--fail-on`, priorities, SARIF
30
+ error levels and monitor regressions. The Markdown and HTML reports have a Launch checklist section and an
31
+ Environment-dependent note (EN/TR). On a local or private target the CLI suggests the flag.
32
+
33
+ ### Changed
34
+ - **Exit code for runtime errors is now `3`** (was `2`). `2` stays for usage errors. Scripts that checked
35
+ `== 2` for crashes must check `3`.
36
+ - `robots.no-sitemap` now only means no `Sitemap:` directive and no `/sitemap.xml`. A declared but failing sitemap
37
+ was reported as `robots.no-sitemap` before; `monitor` shows that change once as one resolved and one new finding.
38
+ - `geo.organization-missing` suggests Organization (company or brand) **or** ProfilePage with a Person mainEntity
39
+ (personal site). A heuristic personal-site signal (a name-like homepage title, no product, pricing or shop
40
+ pages) makes Person the primary suggestion and says so. New source: Google ProfilePage structured data.
41
+ - `img.dimensions-missing` no longer reports images sized in CSS: fixed width and height (or `aspect-ratio`) in the
42
+ inline `style`, in a simple class or id rule of the page's own `<style>`, or fixed-size utility classes
43
+ (`size-10`, `w-10 h-10`, `w-[40px] h-[40px]`). External stylesheets are still not fetched.
44
+ - Repository mode (Next.js App Router): a route inherits `robots` noindex from its layouts unless the page sets
45
+ its own `robots`, so `canonical.missing` and `description.missing` no longer fire on routes that are noindex
46
+ through a layout. The summary and Markdown report say "0 indexable: all noindex" when that is the reason.
47
+ Pages router: a noindex in `_app` applies to every page.
48
+ - `--help` lists every option, including `--timeout <ms>` (default 15000, 1000–120000) and the command options;
49
+ a test keeps it complete.
50
+
51
+ ## [1.1.1] - 2026-11-01
52
+
53
+ Visual polish; the analysis engine, rules, evidence and CLI are unchanged. Release notes:
54
+ [docs/release-notes-1.1.1.md](docs/release-notes-1.1.1.md).
55
+
56
+ ### Changed
57
+ - HTML report themes follow the Searvex brand palette (warm paper / ink / teal; coral only in the logo caret),
58
+ with light and dark variants checked for WCAG AA contrast. Severity colours are unchanged in meaning.
59
+ - Overview: "Fix these first" moved directly below the key numbers; the limits of a run are a one-line summary
60
+ with expandable details instead of a large notice.
61
+ - Turkish: the limits summary is fully translated; clearer wording for shared layouts, automatic fixes and
62
+ informational findings.
63
+ - Mobile: two-column KPI grid with a full-width score card and a smaller gauge.
64
+ - README shortened and refocused; workflow diagrams and screenshots refreshed from the final report.
65
+
8
66
  ## [1.1.0] - 2026-11-01
9
67
 
10
68
  A product-experience release: the analysis engine and its evidence are unchanged; how results are presented,
package/README.md CHANGED
@@ -8,9 +8,8 @@
8
8
  <p align="center"><strong>Understand Search. Fix What Matters.</strong></p>
9
9
 
10
10
  <p align="center">
11
- Open-source SEO and AI-search auditor for websites and code repositories. It finds what is actually wrong,
12
- groups it by root cause, explains it with official sources and fixes the safe parts in your code — with
13
- verification and one-command rollback. CLI and Claude Code plugin.
11
+ Open-source SEO and AI-search auditor for websites and code repositories.<br>
12
+ Finds what is wrong, groups it by root cause and fixes the safe parts in your code — with rollback.
14
13
  </p>
15
14
 
16
15
  <p align="center">
@@ -23,187 +22,100 @@ verification and one-command rollback. CLI and Claude Code plugin.
23
22
  <p align="center">
24
23
  <picture>
25
24
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/cihantopac/searvex/main/docs/assets/dashboard-dark.webp">
26
- <img alt="Searvex HTML report: health score, issue groups, affected URLs, condition by area and the three issues to fix first" src="https://raw.githubusercontent.com/cihantopac/searvex/main/docs/assets/dashboard-light.webp" width="900">
25
+ <img alt="Searvex report overview: health score, issue groups, what was not covered, and the three issues to fix first" src="https://raw.githubusercontent.com/cihantopac/searvex/main/docs/assets/dashboard-light.webp" width="900">
27
26
  </picture>
28
- <br><sub>Real report of a live site (ovokodo.com, 52 pages, 2026-11-01). English / Türkçe · light / dark / system.</sub>
27
+ <br><sub>Unedited capture of a real report (ovokodo.com, 52 pages). English / Türkçe · light / dark / system.</sub>
29
28
  </p>
30
29
 
31
- ## What Searvex does
30
+ ## Quick start
31
+
32
+ ```bash
33
+ npm install -g searvex-seo
34
+ ```
35
+
36
+ ```bash
37
+ searvex audit https://example.com --open
38
+ ```
39
+
40
+ Or as a **Claude Code plugin**, no npm install needed:
41
+
42
+ ```
43
+ /plugin marketplace add cihantopac/searvex
44
+ /plugin install searvex@searvex
45
+ ```
46
+
47
+ Then run `/searvex <url> [path]`. Requires Node.js ≥ 20.10. Full reference: [docs/cli.md](docs/cli.md).
48
+
49
+ ## How it works
32
50
 
33
51
  <picture>
34
52
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/cihantopac/searvex/main/docs/assets/workflow-dark.svg">
35
53
  <img alt="Workflow: Audit, Understand, Prioritize, Fix, Verify, Monitor" src="https://raw.githubusercontent.com/cihantopac/searvex/main/docs/assets/workflow-light.svg" width="900">
36
54
  </picture>
37
55
 
38
- - **Audit** a live site (robots.txt-compliant crawl) or a repository (Next.js, Astro, Nuxt, Laravel, WordPress, static HTML).
39
- - **Understand** every finding: evidence, the official source it is based on and the date that source was checked.
40
- - **Prioritize** by root cause: one broken layout on 50 pages is one task, not 50.
41
- - **Fix** what can be fixed safely, in your code, after you approve a diff — or hand the rest to your coding agent with a ready-made repair prompt.
42
- - **Verify** by re-auditing; failed verification rolls back automatically.
43
- - **Monitor** what improved or regressed since the last run.
56
+ | | |
57
+ |---|---|
58
+ | **Audit** | A live site (robots.txt-compliant crawl) or a repository: Next.js, Astro, Nuxt, Laravel, WordPress, static HTML. |
59
+ | **Understand** | Every finding comes with evidence, an official source and the date that source was checked. |
60
+ | **Prioritize** | One broken layout on 50 pages is one task, not 50. |
61
+ | **Fix** | Approve a diff for safe fixes, or hand the rest to your coding agent with a ready-made repair prompt. |
62
+ | **Verify & monitor** | Re-audit after a change; failed verification rolls back. Regressions show up in the next run and in CI. |
44
63
 
45
64
  ## From findings to fixes
46
65
 
47
66
  <table>
48
67
  <tr>
49
68
  <td width="50%" valign="top">
50
-
51
- **Select what to fix.** Issues are grouped by root cause — a URL template, a source file or a shared layout — and labelled by how they get fixed:
52
-
53
- - **Automatic** — a deterministic Searvex optimizer produced a verified patch.
54
- - **Agent-assisted** — needs source or content judgement.
55
- - **Manual** — deployment, server, Search Console or business decisions.
56
-
57
- </td>
58
- <td width="50%" valign="top">
59
-
60
69
  <picture>
61
70
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/cihantopac/searvex/main/docs/assets/issues-dark.webp">
62
- <img alt="Issues grouped by root cause with selection checkboxes" src="https://raw.githubusercontent.com/cihantopac/searvex/main/docs/assets/issues-light.webp">
71
+ <img alt="Issues grouped by root cause, with selection checkboxes" src="https://raw.githubusercontent.com/cihantopac/searvex/main/docs/assets/issues-light.webp">
63
72
  </picture>
64
-
73
+ <p><b>Select what to fix.</b> Issues are grouped by root cause and labelled <i>automatic</i>, <i>agent-assisted</i> or <i>manual</i>.</p>
65
74
  </td>
66
- </tr>
67
- <tr>
68
75
  <td width="50%" valign="top">
69
-
70
76
  <picture>
71
77
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/cihantopac/searvex/main/docs/assets/prompt-dark.webp">
72
78
  <img alt="Editable repair prompt with copy and Markdown download" src="https://raw.githubusercontent.com/cihantopac/searvex/main/docs/assets/prompt-light.webp">
73
79
  </picture>
74
-
75
- </td>
76
- <td width="50%" valign="top">
77
-
78
- **Generate a repair prompt** for Claude Code, Codex or any coding agent: target and run id, stable finding references, exact URLs or `file:line`, root-cause groups, evidence, the fix and how to verify it. The receiving agent is told to re-check the source, reject false positives, fix root causes once, get approval and re-audit.
79
-
80
- Secrets are redacted and crawled text is fenced as untrusted data. Without a repository the prompt becomes a remediation brief — the report never pretends it can edit your site.
81
-
80
+ <p><b>Generate a repair prompt</b> for Claude Code, Codex or any agent: exact URLs or <code>file:line</code>, evidence, fix and verification. Secrets redacted.</p>
82
81
  </td>
83
82
  </tr>
84
83
  </table>
85
84
 
86
- ## Capabilities
85
+ ## What it checks
87
86
 
88
- | | |
89
- |---|---|
90
- | **Technical SEO** | Crawlability, indexability, canonicals, redirects, hreflang, metadata, structured data (Google rich-result requirements), links, performance signals, security. |
91
- | **GEO / AI search** | AI crawler access by purpose (search vs. training vs. user fetch), snippet controls, entity consistency, content clarity. AI citations are reported as *not measured*. |
92
- | **Repository checks** | Findings with `file:line` for framework source code, not only rendered HTML. |
93
- | **Search Console & CrUX** | Optional, read-only: Search Console API (your own OAuth client) or CSV export, Chrome UX Report field data. Measured data is kept apart from inference. |
94
- | **Competitor research** | Topic and page-type coverage gaps against competitors you name — labelled as hypotheses, not demand. |
95
- | **Optimization** | 12 rule types fixed automatically (e.g. missing `lang`/viewport, canonicals, sitemap + robots.txt, identical duplicate `<title>`/description, hreflang codes and relative URLs): dry run → approval → apply → verify → rollback. |
96
- | **Monitoring** | Changes since the previous run in every report; `monitor` and `--fail-on high` for CI. |
87
+ - **Technical SEO** — crawlability, indexability, canonicals, redirects, hreflang, metadata, structured data, links, performance and security signals.
88
+ - **Local and staging builds** — audit a build as its public site (`--site-url`) with a pre-launch profile (`--pre-launch`): test-server findings and deliberate pre-launch states go to a launch checklist instead of the score.
89
+ - **GEO / AI search** — AI crawler access by purpose, snippet controls, entity consistency, content clarity.
90
+ - **Repositories** — findings with `file:line` in framework source, plus 12 rule types fixed automatically (dry run → approval → apply → verify → rollback).
91
+ - **Search data, optional and read-only** — Search Console (API or CSV export) and Chrome UX Report. Without them, clicks and Core Web Vitals are shown as *not measured*, never estimated.
92
+ - **Competitors** — topic and page-type coverage gaps, labelled as hypotheses.
97
93
 
98
94
  ## Evidence, not claims
99
95
 
100
- Status: **v1.1.0** ([release notes](docs/release-notes-1.1.0.md), [changelog](CHANGELOG.md)).
101
-
102
- - **90 rules**, each with an official source and check date: **71 verified**, **17 heuristic**, **2 unmeasurable** (reported, never scored). `searvex rules show <id>`.
103
- - **Automated tests** across unit, integration, Playwright and end-to-end runs of the bundled CLI; CI on Linux, macOS and Windows with Node 20, 22 and 24 ([quality report](docs/quality.md)).
104
- - **Real-world validation** on 13 public sites and 9 repositories; **live** Search Console and CrUX checks returned values identical to the official exports and raw API.
105
- - **Real issues it found**, confirmed against live HTML: a 404 page listed in MDN's sitemap; two `<title>` elements on every page of an Inertia.js site; Turkish URLs that switch to English (and to "page not found") for an en-US browser.
106
- - **Safety:** read-only by default, SSRF protection, robots.txt always honoured, secret files never read, changes journaled with byte-for-byte rollback, reports rendered without `innerHTML` under a strict CSP.
107
-
108
- Searvex never promises rankings, indexing, traffic or AI citations. The health score is Searvex's own summary of its findings, not a search-engine metric.
109
-
110
- ## Quick start
111
-
112
- Requires **Node.js ≥ 20.10**. The npm package is `searvex-seo`; the command is `searvex`.
96
+ Status: **v1.2.0** ([release notes](docs/release-notes-1.2.0.md), [changelog](CHANGELOG.md)).
113
97
 
114
- ```bash
115
- npm install -g searvex-seo
116
- ```
98
+ - **91 rules**, each tied to an official source: 72 verified, 17 heuristic, 2 reported as unmeasurable. `searvex rules show <id>`
99
+ - **Tested** with unit, integration, browser and end-to-end runs; CI on Linux, macOS and Windows with Node 20, 22 and 24 ([quality report](docs/quality.md)).
100
+ - **Validated** on 13 public sites and 9 repositories; live Search Console and CrUX values matched the official exports.
101
+ - **Safe by default** — read-only, SSRF protection, robots.txt honoured, secret files never read, every change journaled with byte-for-byte rollback.
117
102
 
118
- ```bash
119
- searvex audit https://example.com --open
120
- ```
103
+ Searvex never promises rankings, traffic or AI citations. The health score is Searvex's own summary, not a search-engine metric. See [limitations](docs/limitations.md).
121
104
 
122
- ```bash
123
- searvex audit ./my-site --site-url https://example.com
124
- ```
105
+ ## Documentation
125
106
 
126
- ```bash
127
- searvex optimize ./my-site --site-url https://example.com --lang en
128
- ```
129
-
130
- Reports land in `.searvex/runs/<runId>/` (`report.html`, `.md`, `.json`, optional `.sarif`). `searvex open latest`
131
- opens the newest one. Full reference: [docs/cli.md](docs/cli.md).
132
-
133
- **Claude Code plugin** — no npm install needed:
134
-
135
- ```
136
- /plugin marketplace add cihantopac/searvex
137
- /plugin install searvex@searvex
138
- ```
139
-
140
- Then `/searvex <url> [path]` runs the whole workflow with approval checkpoints and answers with a short
141
- summary plus the report link. Single steps: `/searvex:audit`, `/searvex:geo`, `/searvex:research`,
142
- `/searvex:optimize`, `/searvex:monitor`.
143
-
144
- **Optional search data** (read-only, asked once per site):
145
-
146
- ```bash
147
- searvex connect https://example.com
148
- ```
149
-
150
- ```bash
151
- searvex gsc import performance-export.zip --audit latest
152
- ```
153
-
154
- ```bash
155
- searvex crux auth
156
- ```
157
-
158
- Without them, clicks, impressions, positions and Core Web Vitals are shown as **not measured** — never estimated.
159
-
160
- <details>
161
- <summary><b>More commands</b></summary>
162
-
163
- ```bash
164
- searvex run https://example.com ./my-site --competitor https://rival.example # whole workflow, one crawl
165
- searvex geo https://example.com # AI crawler access
166
- searvex research https://example.com --competitor https://rival.example # coverage gaps
167
- searvex monitor https://example.com --fail-on high # regressions in CI
168
- searvex ecosystem https://company.example https://product.example # related sites
169
- searvex review latest <ref> rejected --note "behind login" # record a verdict
170
- searvex rollback <changeId> ./my-site
171
- searvex gsc auth --client client_secret.json && searvex gsc report --audit latest
172
- searvex bing auth && searvex bing report https://example.com/ # experimental
173
- ```
174
-
175
- | Integration | Status |
176
- |---|---|
177
- | Search Console CSV/ZIP import | supported (verified with real TR + EN exports) |
178
- | Search Console API (`gsc auth`) | supported (verified live) |
179
- | CrUX API (`crux auth`) | supported (verified live) |
180
- | JavaScript rendering (`--render`, Playwright) | supported |
181
- | Bing Webmaster API (`bing auth`) | experimental |
182
-
183
- </details>
184
-
185
- ## Limitations
186
-
187
- Website mode sees public pages only. Market data (search volumes, backlinks, SERP features) and AI citations are
188
- not fetched or estimated. Repository mode is static analysis: runtime-computed metadata is resolved
189
- conservatively. In repositories with several apps, sitemaps are left to a reviewed task because one site URL
190
- cannot tell which host serves which app. Full list: [docs/limitations.md](docs/limitations.md).
107
+ [CLI reference](docs/cli.md) · [Architecture](docs/architecture.md) · [Knowledge base](docs/knowledge-base.md) · [Security](docs/security.md) · [Privacy](docs/privacy.md)
191
108
 
192
109
  ## Related tools
193
110
 
194
- Complementary open-source tools by the same author — independent, not required:
111
+ Independent open-source tools by the same author:
195
112
 
196
- | | |
197
- |---|---|
198
- | [**Relivaro**](https://github.com/cihantopac/relivaro) | Software reliability, security and release readiness. |
199
- | [**Jourilo**](https://github.com/cihantopac/jourilo) | UX and conversion engineering in real browser journeys. |
200
- | [**Markilo**](https://github.com/cihantopac/markilo) | Brand identity and vector design for Claude Code. |
113
+ - [**Relivaro**](https://github.com/cihantopac/relivaro) — software reliability, security and release readiness.
114
+ - [**Jourilo**](https://github.com/cihantopac/jourilo) — UX and conversion engineering in real browser journeys.
115
+ - [**Markilo**](https://github.com/cihantopac/markilo) — brand identity and vector design for Claude Code (made the Searvex identity).
201
116
 
202
- ## Contributing, security, license
117
+ ## Contributing & license
203
118
 
204
- Rules, framework adapters and fixtures are the most valuable contributions — every rule needs an official source
205
- and a test fixture ([CONTRIBUTING.md](CONTRIBUTING.md)). Security: [SECURITY.md](SECURITY.md),
206
- [docs/security.md](docs/security.md), [docs/privacy.md](docs/privacy.md). Architecture:
207
- [docs/architecture.md](docs/architecture.md).
119
+ Rules, framework adapters and fixtures are the most valuable contributions; every rule needs an official source and a test fixture ([CONTRIBUTING.md](CONTRIBUTING.md)). Report vulnerabilities via [SECURITY.md](SECURITY.md).
208
120
 
209
- [Apache-2.0](LICENSE). Name availability notes: [docs/research/name-availability-2026-10.md](docs/research/name-availability-2026-10.md) (not legal trademark clearance).
121
+ [Apache-2.0](LICENSE)
@@ -18,6 +18,12 @@ export interface AuditReport {
18
18
  runId: string;
19
19
  generatedAt: string;
20
20
  crawl: CrawlResult['stats'] & {
21
+ /** Website mode: `unreachable` when the start URL failed at the network level and nothing was audited. */
22
+ status?: 'complete' | 'unreachable';
23
+ /** Network error for an unreachable target. */
24
+ error?: string;
25
+ /** Public origin the crawled origin stands for (--site-url); URLs on it were mapped to the crawled origin. */
26
+ siteUrl?: string;
21
27
  truncated: boolean;
22
28
  startUrl: string;
23
29
  robots: {
@@ -54,10 +60,20 @@ export interface AuditReport {
54
60
  /** Whether JavaScript was executed for at least one page (`--render`). */
55
61
  rendered?: boolean;
56
62
  }
63
+ /**
64
+ * Whether a finding counts toward the score, --fail-on, affected counts and regressions: unmeasurable
65
+ * findings and pre-launch context findings (environment, launch checklist) never do.
66
+ */
67
+ export declare function countsTowardScore(f: Pick<Finding, 'confidence' | 'context'>): boolean;
57
68
  /** Distinct affected URLs/files across all non-informational findings. */
58
69
  export declare function countAffected(findings: Array<Finding & {
59
70
  count: number;
60
71
  }>, affected: (ruleId: string) => string[]): number;
72
+ /**
73
+ * Indexable pages as the rules decide indexability (inventory), e.g. "2 indexable" or "0 indexable: all
74
+ * noindex".
75
+ */
76
+ export declare function indexableSummary(r: Pick<AuditReport, 'inventory' | 'findings'>): string;
61
77
  export interface Scores {
62
78
  /** 0–100. Searvex health score: a summary of Searvex findings, NOT a search engine metric. */
63
79
  overall: number;
@@ -65,13 +81,16 @@ export interface Scores {
65
81
  method: string;
66
82
  /** Set when there was nothing to audit (e.g. a repository without any website); `overall` is then meaningless. */
67
83
  notApplicable?: string;
84
+ /** `pre-launch`: environment and launch-checklist findings were excluded (--pre-launch). */
85
+ profile?: 'pre-launch';
68
86
  }
69
87
  /** "87/100", or "n/a" when nothing could be audited. */
70
88
  export declare function scoreLabel(s: Scores): string;
71
89
  /**
72
90
  * Score = 100 − Σ(weight × affected-share), where affected-share = affected pages / indexable pages
73
91
  * (capped at 1). Site-level findings count as share 1. Heuristic findings count half.
74
- * Unmeasurable findings never change the score.
92
+ * Unmeasurable findings, and environment/launch-checklist findings of the pre-launch profile, never change
93
+ * the score.
75
94
  */
76
95
  export declare function computeScores(findings: Array<Finding & {
77
96
  count: number;
@@ -89,6 +108,8 @@ export interface AuditOptions {
89
108
  probes?: boolean;
90
109
  checkExternal?: boolean;
91
110
  cruxApiKey?: string;
111
+ /** Pre-launch profile (--pre-launch): see `applyPreLaunch`. */
112
+ preLaunch?: boolean;
92
113
  }
93
114
  export declare function auditWebsite(url: string, options?: AuditOptions): Promise<{
94
115
  report: AuditReport;
@@ -98,4 +119,5 @@ export declare function analyzeCrawl(result: CrawlResult, kb: KnowledgeBase, opt
98
119
  probes?: boolean;
99
120
  checkExternal?: boolean;
100
121
  cruxApiKey?: string;
122
+ preLaunch?: boolean;
101
123
  }): Promise<AuditReport>;
@@ -5,6 +5,7 @@ import { DEFAULT_POLICY } from '../net/ssrf.js';
5
5
  import { extractPage } from '../extract/html.js';
6
6
  import { FindingSink, loadKnowledge } from '../rules/engine.js';
7
7
  import { buildContext } from './context.js';
8
+ import { applyPreLaunch, asLaunched, emitLaunchNoindex } from './pre-launch.js';
8
9
  import { runContentChecks } from './content.js';
9
10
  import { runGeoChecks } from './geo.js';
10
11
  import { buildInventory } from './inventory.js';
@@ -12,29 +13,47 @@ import { runTechnicalChecks } from './technical.js';
12
13
  import { prioritise } from './priority.js';
13
14
  import { checkExternalLinks } from './external-links.js';
14
15
  import { failingMetrics, queryCrux } from '../integrations/crux.js';
16
+ /**
17
+ * Whether a finding counts toward the score, --fail-on, affected counts and regressions: unmeasurable
18
+ * findings and pre-launch context findings (environment, launch checklist) never do.
19
+ */
20
+ export function countsTowardScore(f) {
21
+ return f.confidence !== 'unmeasurable' && !f.context;
22
+ }
15
23
  /** Distinct affected URLs/files across all non-informational findings. */
16
24
  export function countAffected(findings, affected) {
17
25
  const all = new Set();
18
26
  for (const f of findings)
19
- if (f.severity !== 'info' && f.confidence !== 'unmeasurable')
27
+ if (f.severity !== 'info' && countsTowardScore(f))
20
28
  for (const u of affected(f.ruleId))
21
29
  if (!/\/robots\.txt$/.test(u))
22
30
  all.add(u);
23
31
  return all.size;
24
32
  }
33
+ /**
34
+ * Indexable pages as the rules decide indexability (inventory), e.g. "2 indexable" or "0 indexable: all
35
+ * noindex".
36
+ */
37
+ export function indexableSummary(r) {
38
+ const total = r.inventory.pages.length;
39
+ const indexable = r.inventory.pages.filter((p) => p.indexable).length;
40
+ const noindex = r.findings.find((f) => f.ruleId === 'index.noindex')?.count ?? 0;
41
+ return `${indexable} indexable${indexable === 0 && total > 0 && noindex >= total ? ': all noindex' : ''}`;
42
+ }
25
43
  /** "87/100", or "n/a" when nothing could be audited. */
26
44
  export function scoreLabel(s) {
27
- return s.notApplicable ? 'n/a (nothing to audit)' : `${s.overall}/100`;
45
+ return s.notApplicable ? 'n/a (nothing to audit)' : `${s.overall}/100${s.profile === 'pre-launch' ? ' (pre-launch profile)' : ''}`;
28
46
  }
29
47
  const WEIGHT = { critical: 25, high: 10, medium: 4, low: 1.5, info: 0 };
30
48
  /**
31
49
  * Score = 100 − Σ(weight × affected-share), where affected-share = affected pages / indexable pages
32
50
  * (capped at 1). Site-level findings count as share 1. Heuristic findings count half.
33
- * Unmeasurable findings never change the score.
51
+ * Unmeasurable findings, and environment/launch-checklist findings of the pre-launch profile, never change
52
+ * the score.
34
53
  */
35
54
  export function computeScores(findings, pageCount) {
36
55
  const penalty = (fs) => fs.reduce((sum, f) => {
37
- if (f.confidence === 'unmeasurable')
56
+ if (!countsTowardScore(f))
38
57
  return sum;
39
58
  const share = pageCount > 0 ? Math.min(1, f.count / pageCount) : 1;
40
59
  return sum + WEIGHT[f.severity] * Math.max(share, f.severity === 'critical' ? 1 : share) * (f.confidence === 'heuristic' ? 0.5 : 1);
@@ -92,25 +111,70 @@ async function probeHostVariants(startUrl, opts, sink) {
92
111
  if (!res.error && res.status === 200)
93
112
  sink.emit('canonical.www-duplicate', { url: alt.toString(), observed: `${alt.host} and ${u.host} both return 200` });
94
113
  }
114
+ function crawlSummary(result) {
115
+ return {
116
+ ...result.stats,
117
+ status: result.unreachable ? 'unreachable' : 'complete',
118
+ ...(result.unreachable ? { error: result.unreachable.error } : {}),
119
+ ...(result.siteUrl ? { siteUrl: result.siteUrl } : {}),
120
+ truncated: result.truncated,
121
+ startUrl: result.startUrl,
122
+ robots: { url: result.robots.url, state: result.robots.state, status: result.robots.status, sitemaps: result.robots.sitemaps },
123
+ sitemaps: result.sitemap.sitemaps,
124
+ sitemapUrls: result.sitemap.urls.length,
125
+ sitemapIssues: result.sitemap.issues.slice(0, 100),
126
+ };
127
+ }
95
128
  export async function auditWebsite(url, options = {}) {
96
129
  const kb = options.kb ?? loadKnowledge();
97
130
  const store = new RunStore(options.workspace ?? process.cwd(), options.resumeRunId ?? RunStore.newRunId('audit'));
98
131
  const result = await crawl(url, options.crawl, store);
99
- const report = await analyzeCrawl(result, kb, { ...options.crawl, probes: options.probes ?? true, checkExternal: options.checkExternal, cruxApiKey: options.cruxApiKey });
132
+ const report = await analyzeCrawl(result, kb, { ...options.crawl, probes: options.probes ?? true, checkExternal: options.checkExternal, cruxApiKey: options.cruxApiKey, preLaunch: options.preLaunch });
100
133
  store.writeJson('report.json', report);
101
134
  return { report, store };
102
135
  }
103
136
  export async function analyzeCrawl(result, kb, opts = {}) {
104
137
  const sink = new FindingSink(kb);
138
+ const launch = opts.preLaunch ? asLaunched(result) : undefined;
139
+ if (launch)
140
+ result = launch.result;
105
141
  const ctx = buildContext(result);
106
142
  const netOpts = { policy: opts.policy ?? DEFAULT_POLICY, timeoutMs: opts.timeoutMs ?? 15000, userAgent: opts.userAgent ?? DEFAULT_USER_AGENT };
143
+ const unreachable = result.unreachable;
107
144
  let llms;
145
+ if (unreachable) {
146
+ // Nothing was fetched, so no check can say anything about the site. Run them on a throwaway sink
147
+ // only to build the (empty) report sections.
148
+ const none = new FindingSink(kb);
149
+ // robots.txt was never read, so no crawler access can be stated.
150
+ const geo = { ...runGeoChecks(ctx, none), bots: [] };
151
+ const content = runContentChecks(ctx, none);
152
+ return {
153
+ tool: { name: 'searvex', version: SEARVEX_VERSION, rulesVersion: kb.version },
154
+ mode: 'website',
155
+ target: result.startUrl,
156
+ runId: result.runId,
157
+ generatedAt: new Date().toISOString(),
158
+ crawl: crawlSummary(result),
159
+ inventory: buildInventory(ctx),
160
+ findings: [],
161
+ geo,
162
+ content,
163
+ scores: { ...computeScores([], 1), notApplicable: `target unreachable (${unreachable.error})` },
164
+ measurement: { verified: 0, heuristic: 0, unmeasurable: 0 },
165
+ limitations: [`The start URL could not be reached (${unreachable.error}); no page was fetched, so this report contains no findings about the site. Check the URL, DNS, the network or the server, then run the audit again.`],
166
+ affectedUrls: 0,
167
+ rendered: false,
168
+ };
169
+ }
108
170
  if (opts.probes !== false) {
109
171
  await probeHostVariants(result.startUrl, netOpts, sink);
110
172
  await probeLocaleAdaptive(result.startUrl, netOpts, sink);
111
173
  llms = await probeLlmsTxt(result.origin, netOpts);
112
174
  }
113
175
  runTechnicalChecks(ctx, sink);
176
+ if (launch)
177
+ emitLaunchNoindex(ctx, launch.noindex, sink);
114
178
  const geo = runGeoChecks(ctx, sink, llms);
115
179
  const content = runContentChecks(ctx, sink);
116
180
  let externalLinks;
@@ -134,12 +198,18 @@ export async function analyzeCrawl(result, kb, opts = {}) {
134
198
  const inventory = buildInventory(ctx);
135
199
  const findings = sink.findings();
136
200
  prioritise(findings, (id) => sink.affected(id), ctx);
201
+ if (opts.preLaunch)
202
+ applyPreLaunch(findings, kb);
137
203
  const limitations = [
138
204
  'Website mode sees only publicly reachable pages; it has no access to real traffic, rankings, Search Console or analytics data unless an integration is configured.',
139
205
  'Response times are single-location lab samples, not Core Web Vitals field data.',
140
206
  ];
141
207
  if (result.truncated)
142
208
  limitations.unshift(`Crawl stopped at the page limit with ${result.stats.queuedRemaining} URLs still queued; site-level findings (duplicates, hreflang return links) are based on the crawled subset, and orphan pages are not reported (pages that were not crawled may link to them). Raise --max-pages for a complete picture.`);
209
+ if (launch)
210
+ limitations.push(`Pre-launch profile (--pre-launch): the site is audited as it will be once live. ${launch.noindex.size ? `${launch.noindex.size} noindex page(s) were evaluated as indexable; their noindex is in the launch checklist. ` : ''}Findings that depend on the test server (environment) or on a deliberate pre-launch state (launch checklist) are listed separately and excluded from the score and --fail-on.`);
211
+ if (result.siteUrl)
212
+ limitations.push(`Audited ${result.origin} as ${result.siteUrl} (--site-url): canonical, hreflang, sitemap and link URLs on ${result.siteUrl} were checked against the crawled pages at ${result.origin}; the public site itself was not fetched.`);
143
213
  if (!opts.checkExternal)
144
214
  limitations.push('Outbound links were not checked (use --check-external).');
145
215
  if (!result.pages.some((p) => p.rendered))
@@ -150,20 +220,12 @@ export async function analyzeCrawl(result, kb, opts = {}) {
150
220
  target: result.startUrl,
151
221
  runId: result.runId,
152
222
  generatedAt: new Date().toISOString(),
153
- crawl: {
154
- ...result.stats,
155
- truncated: result.truncated,
156
- startUrl: result.startUrl,
157
- robots: { url: result.robots.url, state: result.robots.state, status: result.robots.status, sitemaps: result.robots.sitemaps },
158
- sitemaps: result.sitemap.sitemaps,
159
- sitemapUrls: result.sitemap.urls.length,
160
- sitemapIssues: result.sitemap.issues.slice(0, 100),
161
- },
223
+ crawl: crawlSummary(result),
162
224
  inventory,
163
225
  findings,
164
226
  geo,
165
227
  content,
166
- scores: computeScores(findings, Math.max(1, ctx.indexable.length)),
228
+ scores: { ...computeScores(findings, Math.max(1, ctx.indexable.length)), ...(opts.preLaunch ? { profile: 'pre-launch' } : {}) },
167
229
  measurement: {
168
230
  verified: findings.filter((f) => f.confidence === 'verified').length,
169
231
  heuristic: findings.filter((f) => f.confidence === 'heuristic').length,
@@ -1 +1 @@
1
- {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/analyze/audit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/analyze/audit.ts"],"names":[],"mappings":"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"}