pagetrace 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/README.md +13 -3
- package/dist/cli.cjs +1 -1
- package/dist/cli.js +1 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,28 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
While the version is below 1.0.0, breaking changes ship in a minor release.
|
|
8
8
|
|
|
9
|
+
## [0.3.0] - 2026-09-06
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
|
|
13
|
+
- **Breaking.** `engines.node` is now `>=20.19.0`, up from `>=18.17`. The old
|
|
14
|
+
value was wrong rather than generous: `cac`, a runtime dependency, declares
|
|
15
|
+
`>=20.19.0`, so the package never actually supported the range it advertised.
|
|
16
|
+
Node 18 reached end of life in April 2025.
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
|
|
20
|
+
- CI runs the test suite against Node 20.19, 22 and 24, so the `engines` floor is
|
|
21
|
+
tested rather than asserted — the mismatch above had gone unnoticed because CI
|
|
22
|
+
only ever ran one version.
|
|
23
|
+
- CI fails if `npm pack` reports that npm would auto-correct `package.json`,
|
|
24
|
+
which is how the `bin` path issue in 0.2.0 reached the registry unnoticed.
|
|
25
|
+
- The release workflow refuses to publish when the tag disagrees with
|
|
26
|
+
`package.json`, or when that version is already on the registry. A published
|
|
27
|
+
version is immutable, so both mistakes are expensive after the fact.
|
|
28
|
+
- Workflow actions moved to `actions/checkout@v5` and `actions/setup-node@v5`,
|
|
29
|
+
clearing the Node 20 runner deprecation warning.
|
|
30
|
+
|
|
9
31
|
## [0.2.0] - 2026-09-06
|
|
10
32
|
|
|
11
33
|
A correctness pass over the whole surface. No finding codes were renamed, so
|
|
@@ -117,5 +139,6 @@ Initial release. `snapshot`, `check` and `audit` commands; filesystem and HTTP
|
|
|
117
139
|
crawling; diff classified by transition; absolute, cross-page and hreflang audit
|
|
118
140
|
rules; pretty, JSON, markdown, GitHub and HTML reporters.
|
|
119
141
|
|
|
142
|
+
[0.3.0]: https://github.com/shyamexe/pagetrace/compare/v0.2.0...v0.3.0
|
|
120
143
|
[0.2.0]: https://github.com/shyamexe/pagetrace/compare/v0.1.0...v0.2.0
|
|
121
144
|
[0.1.0]: https://github.com/shyamexe/pagetrace/releases/tag/v0.1.0
|
package/README.md
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
# pagetrace
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/pagetrace)
|
|
4
|
+
[](https://github.com/shyamexe/pagetrace/actions/workflows/ci.yml)
|
|
5
|
+
[](https://www.npmjs.com/package/pagetrace)
|
|
6
|
+
[](./LICENSE)
|
|
7
|
+
|
|
3
8
|
A lockfile for your SEO and AEO surface. Snapshot it, diff every build, fail CI on regressions.
|
|
4
9
|
|
|
5
10
|
Existing SEO and AEO tools tell you your score **right now**. They don't tell you that this deploy dropped the canonical tag from 400 pages, that a layout refactor added `noindex`, that a CMS migration stripped `Product` schema, or that someone quietly blocked `GPTBot` in `robots.txt`. Those regressions are silent for weeks until traffic moves.
|
|
@@ -12,6 +17,7 @@ Existing SEO and AEO tools tell you your score **right now**. They don't tell yo
|
|
|
12
17
|
npm install -D pagetrace
|
|
13
18
|
```
|
|
14
19
|
|
|
20
|
+
Requires Node 20.19 or newer. No native modules, three small dependencies.
|
|
15
21
|
|
|
16
22
|
## Use
|
|
17
23
|
|
|
@@ -42,7 +48,9 @@ npx pagetrace check --dir ./out
|
|
|
42
48
|
5 error, 9 warning, 2 info
|
|
43
49
|
```
|
|
44
50
|
|
|
45
|
-
Exit code is `1` when anything at or above `--fail-on`
|
|
51
|
+
Exit code is `1` when anything at or above `--fail-on` is found. It takes `error` (the default), `warn` or `info`, and rejects anything else rather than quietly letting the build pass.
|
|
52
|
+
|
|
53
|
+
Note that `check` runs the absolute rules as well as the diff, so it can fail on a problem your build did not introduce. Use `--no-audit` for a pure regression gate.
|
|
46
54
|
|
|
47
55
|
Accept the new state once you've reviewed it:
|
|
48
56
|
|
|
@@ -74,7 +82,7 @@ ERROR Page has no <h1>. (
|
|
|
74
82
|
/tag/widgets
|
|
75
83
|
```
|
|
76
84
|
|
|
77
|
-
Auditing runs cross-page rules the per-page checks cannot see: duplicate titles and descriptions, several pages canonicalising to one URL, canonicals pointing away from their own path, and a full hreflang check.
|
|
85
|
+
Auditing runs cross-page rules the per-page checks cannot see: duplicate titles and descriptions, several pages canonicalising to one URL, canonicals pointing away from their own path or at another host entirely, and a full hreflang check. Paginated archives and AMP variants are left alone, since canonicalising those to their parent is correct.
|
|
78
86
|
|
|
79
87
|
The hreflang rules are the ones hardest to run by hand. Google discards an entire hreflang cluster when the annotations are not reciprocal — if `/en/about` points at `/ml/about` but `/ml/about` does not point back, *every* link in that group is ignored, not just the broken one, and nothing reports it. `pagetrace` checks reciprocity across the whole crawl, plus self-references, `x-default`, malformed language codes, and alternates that point at noindexed pages. Sites with no hreflang anywhere are left alone.
|
|
80
88
|
|
|
@@ -90,7 +98,9 @@ Route discovery follows `robots.txt` sitemap declarations, then falls back throu
|
|
|
90
98
|
npx pagetrace snapshot --url https://example.com --limit 200
|
|
91
99
|
```
|
|
92
100
|
|
|
93
|
-
Routes are discovered from `robots.txt` sitemap declarations, falling back to `/sitemap.xml`. Sitemap indexes are followed one level.
|
|
101
|
+
Routes are discovered from `robots.txt` sitemap declarations, falling back to `/sitemap.xml`. Sitemap indexes are followed one level, up to 50 children, and expansion stops once `--limit` is satisfied. Gzipped children are recognised but not read.
|
|
102
|
+
|
|
103
|
+
URLs pointing at another host are skipped. A page that cannot be fetched stops the run with an error rather than being dropped from the snapshot — a page silently missing from a crawl is indistinguishable from a page you deleted, and reporting a transient outage as a site-wide deletion is worse than failing.
|
|
94
104
|
|
|
95
105
|
## What it records
|
|
96
106
|
|
package/dist/cli.cjs
CHANGED
|
@@ -1527,7 +1527,7 @@ cli.command("audit", "Audit a site as it stands, with explanations and fixes").o
|
|
|
1527
1527
|
}
|
|
1528
1528
|
});
|
|
1529
1529
|
cli.help();
|
|
1530
|
-
cli.version("0.
|
|
1530
|
+
cli.version("0.3.0");
|
|
1531
1531
|
async function main() {
|
|
1532
1532
|
try {
|
|
1533
1533
|
cli.parse(process.argv, { run: false });
|
package/dist/cli.js
CHANGED
|
@@ -1504,7 +1504,7 @@ cli.command("audit", "Audit a site as it stands, with explanations and fixes").o
|
|
|
1504
1504
|
}
|
|
1505
1505
|
});
|
|
1506
1506
|
cli.help();
|
|
1507
|
-
cli.version("0.
|
|
1507
|
+
cli.version("0.3.0");
|
|
1508
1508
|
async function main() {
|
|
1509
1509
|
try {
|
|
1510
1510
|
cli.parse(process.argv, { run: false });
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pagetrace",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Baseline your site's SEO and AEO surface, diff every build against it, and fail CI on regressions.",
|
|
5
5
|
"main": "./dist/index.cjs",
|
|
6
6
|
"scripts": {
|
|
@@ -52,14 +52,14 @@
|
|
|
52
52
|
"./package.json": "./package.json"
|
|
53
53
|
},
|
|
54
54
|
"bin": {
|
|
55
|
-
"pagetrace": "
|
|
55
|
+
"pagetrace": "dist/cli.js"
|
|
56
56
|
},
|
|
57
57
|
"files": [
|
|
58
58
|
"dist",
|
|
59
59
|
"CHANGELOG.md"
|
|
60
60
|
],
|
|
61
61
|
"engines": {
|
|
62
|
-
"node": ">=
|
|
62
|
+
"node": ">=20.19.0"
|
|
63
63
|
},
|
|
64
64
|
"publishConfig": {
|
|
65
65
|
"access": "public",
|