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.
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +58 -0
- package/README.md +56 -144
- package/dist/analyze/audit.d.ts +23 -1
- package/dist/analyze/audit.js +77 -15
- package/dist/analyze/audit.js.map +1 -1
- package/dist/analyze/pre-launch.d.ts +24 -0
- package/dist/analyze/pre-launch.js +57 -0
- package/dist/analyze/pre-launch.js.map +1 -0
- package/dist/analyze/structured-data.d.ts +12 -1
- package/dist/analyze/structured-data.js +38 -3
- package/dist/analyze/structured-data.js.map +1 -1
- package/dist/analyze/technical.js +17 -6
- package/dist/analyze/technical.js.map +1 -1
- package/dist/cli.d.ts +165 -0
- package/dist/cli.js +166 -59
- package/dist/cli.js.map +1 -1
- package/dist/commands/ecosystem.js +2 -1
- package/dist/commands/ecosystem.js.map +1 -1
- package/dist/commands/monitor.d.ts +2 -0
- package/dist/commands/monitor.js +25 -7
- package/dist/commands/monitor.js.map +1 -1
- package/dist/commands/research.js +2 -1
- package/dist/commands/research.js.map +1 -1
- package/dist/commands/run.js +45 -28
- package/dist/commands/run.js.map +1 -1
- package/dist/core/types.d.ts +6 -0
- package/dist/core/url.d.ts +15 -0
- package/dist/core/url.js +30 -0
- package/dist/core/url.js.map +1 -1
- package/dist/crawl/crawler.d.ts +18 -0
- package/dist/crawl/crawler.js +47 -4
- package/dist/crawl/crawler.js.map +1 -1
- package/dist/crawl/sitemap.d.ts +1 -0
- package/dist/crawl/sitemap.js +4 -3
- package/dist/crawl/sitemap.js.map +1 -1
- package/dist/extract/html.d.ts +11 -2
- package/dist/extract/html.js +60 -3
- package/dist/extract/html.js.map +1 -1
- package/dist/net/fetcher.d.ts +2 -2
- package/dist/net/fetcher.js +1 -1
- package/dist/optimize/fixes.js +1 -1
- package/dist/optimize/fixes.js.map +1 -1
- package/dist/repo/ast.d.ts +2 -0
- package/dist/repo/ast.js +2 -1
- package/dist/repo/ast.js.map +1 -1
- package/dist/repo/scan.js +18 -3
- package/dist/repo/scan.js.map +1 -1
- package/dist/report/client.js +14 -10
- package/dist/report/client.js.map +1 -1
- package/dist/report/html.js +9 -8
- package/dist/report/html.js.map +1 -1
- package/dist/report/i18n.js +11 -10
- package/dist/report/i18n.js.map +1 -1
- package/dist/report/markdown.js +27 -3
- package/dist/report/markdown.js.map +1 -1
- package/dist/report/sarif.js +3 -2
- package/dist/report/sarif.js.map +1 -1
- package/dist/rules/engine.d.ts +6 -0
- package/dist/rules/engine.js +2 -0
- package/dist/rules/engine.js.map +1 -1
- package/dist/rules/implemented.js +1 -1
- package/dist/rules/implemented.js.map +1 -1
- package/dist/searvex.mjs +578 -161
- package/knowledge/rules/canonicalization.json +6 -4
- package/knowledge/rules/crawlability.json +39 -2
- package/knowledge/rules/indexability.json +6 -4
- package/knowledge/rules/performance.json +4 -3
- package/knowledge/rules/security.json +4 -3
- package/knowledge/rules/structured-data.json +11 -5
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "searvex",
|
|
3
|
-
"version": "1.
|
|
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
|
|
12
|
-
|
|
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
|
|
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>
|
|
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
|
-
##
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
-
##
|
|
85
|
+
## What it checks
|
|
87
86
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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.
|
|
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
|
-
|
|
115
|
-
|
|
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
|
-
|
|
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
|
-
|
|
123
|
-
searvex audit ./my-site --site-url https://example.com
|
|
124
|
-
```
|
|
105
|
+
## Documentation
|
|
125
106
|
|
|
126
|
-
|
|
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
|
-
|
|
111
|
+
Independent open-source tools by the same author:
|
|
195
112
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
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
|
|
117
|
+
## Contributing & license
|
|
203
118
|
|
|
204
|
-
Rules, framework adapters and fixtures are the most valuable contributions
|
|
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)
|
|
121
|
+
[Apache-2.0](LICENSE)
|
package/dist/analyze/audit.d.ts
CHANGED
|
@@ -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
|
|
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>;
|
package/dist/analyze/audit.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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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"}
|