@aeptus/aexeo-emdash 0.8.12 → 0.8.14

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 CHANGED
@@ -6,6 +6,133 @@ and the project follows [Semantic Versioning](https://semver.org/).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.8.14] - 2026-05-06
10
+
11
+ Two regressions Aeptus surfaced after running the v0.0.18 CLI
12
+ release against their preview deployment, plus a new opt-in
13
+ agent-discovery audit axis.
14
+
15
+ ### Added
16
+
17
+ - **New `agent_discovery` rule group** with two opt-in checks
18
+ for the well-known machine-readable artifacts that signal a
19
+ site's agent-facing capabilities. Off by default since the
20
+ underlying specs (RFC 9727 api-catalog, SEP-1649 MCP server-
21
+ card) have nascent adoption and would otherwise generate
22
+ false positives across the long tail of sites that don't
23
+ publish them yet. Adopters opt in via:
24
+ ```toml
25
+ [agent_discovery]
26
+ enabled = true
27
+ ```
28
+ - `AGT001` (warning, policy/medium): missing
29
+ `/.well-known/api-catalog` (RFC 9727, finalized April
30
+ 2025). The JSON Linkset format that lets agents enumerate
31
+ public APIs without crawling documentation.
32
+ - `AGT002` (warning, policy/medium): missing
33
+ `/.well-known/mcp/server-card.json` (SEP-1649, draft).
34
+ Lets MCP clients discover the site's MCP server endpoint
35
+ and capabilities without prior configuration.
36
+ - **AGT layer mapping**: Retrievability primary (these files
37
+ exist so agents can *find* the site's surfaces), Absorbability
38
+ secondary (the surfaces they point at feed agent absorption
39
+ of the site's content).
40
+ - **Post-crawl artifact probe extended** to HEAD-check the AGT
41
+ paths during live `aexeo-cli crawl` so AGT findings respect
42
+ the same presence signals as facts.json / llms-full.txt.
43
+ Probe runs unconditionally — the cost is two extra HEAD
44
+ requests, and sites that don't enable AGT just see the paths
45
+ recorded on `CrawlMeta` without any rule-side effect.
46
+
47
+ ### Fixed
48
+
49
+ - **A11Y findings now use `severity: "warning"` (not `"warn"`).**
50
+ `Finding::is_error()` is implemented as `severity != "warning"`,
51
+ so the four-letter form was bucketed as an error in audit
52
+ summaries and made `success: false` even when the only
53
+ findings were warning-grade A11Y heuristics (heading-jump,
54
+ alt-equals-filename, missing-main-landmark). The three A11Y
55
+ rules emitted `"warn"` (A11Y004, A11Y005, A11Y006);
56
+ switched all three to `"warning"` to match the rest of the
57
+ rule corpus. No new `is_error` semantics — just severity-
58
+ string normalization.
59
+ - **SRF030 now actually finds the homepage's markdown-mirror
60
+ alternates.** The 0.8.13 fix introduced
61
+ `homepage_advertises_markdown_mirror_discovery(site)` which
62
+ looked up `site.page("/")` — but the home page's route is
63
+ the empty string `""` in this codebase (per
64
+ `capture_route_for_relative_path`'s mapping for
65
+ `index.html`), not `"/"`. The lookup always returned None,
66
+ the helper always returned false, and SRF030 fired anyway
67
+ on Aeptus's preview despite the homepage carrying
68
+ `<link rel="alternate" type="text/markdown" href="/index.md.txt">`.
69
+ Switched to `site.route_pages().find(|p| p.route.is_empty())`
70
+ to match the rest of the crate's home-page convention.
71
+ Locked in by two new unit tests
72
+ (srf030_recognizes_markdown_mirror_discovery_on_home,
73
+ srf030_skips_unrelated_alternate_types).
74
+
75
+ ## [0.8.13] - 2026-05-06
76
+
77
+ Closes four false-positive paths Aeptus surfaced while running
78
+ the 0.8.12 plugin against their Cloudflare Pages preview
79
+ deployment. 0.8.12 was already on npm before these landed; this
80
+ release bundles the fixes into one consumer-visible bump.
81
+
82
+ ### Fixed
83
+
84
+ - **Surface discovery for facts.json / llms-full.txt /
85
+ manifest-listed mirrors.** Aeptus reported false-negative
86
+ `facts_present: false` and `llms_full_present: false` on a
87
+ live Cloudflare Pages crawl where curl returned 200 for
88
+ both URLs. Root cause: the page-crawler skips non-HTML
89
+ responses, so JSON / plain-text artifacts not reachable
90
+ via the HTML link graph were never recorded as visited
91
+ and `local_artifact_exists` returned false even though the
92
+ files existed.
93
+ Fix: a new `artifact_probe` module HEAD-probes well-known
94
+ artifact paths after the main page-crawl, manifest-first.
95
+ If `manifest.json` is reachable, every `path` it lists
96
+ under `artifacts` is added to the candidate set. Each
97
+ candidate is independently HEAD-probed with the existing
98
+ crawl auth (basic auth + custom headers, including the
99
+ `--cf-access-*` Cloudflare Access headers). 2xx paths are
100
+ recorded on `CrawlMeta.probed_artifact_paths` and folded
101
+ into `Site::indexed_paths` so surface discovery and rules
102
+ see them as present.
103
+ Probes are time-boxed (3s per request) and bounded (max 64
104
+ paths per crawl) so a manifest with thousands of entries
105
+ can't blow up the audit budget. The probed list round-trips
106
+ through the audit artifact, so `intelligence surfaces
107
+ discover --from-crawl-artifact` sees the same presence
108
+ signal a fresh live crawl would.
109
+ - **SEO009 no longer flags `<link rel="alternate"
110
+ type="text/markdown">` discovery links** as "hreflang
111
+ alternates pointing to missing internal paths." The rule
112
+ now consults the `type` attribute on the alternate and
113
+ skips the missing-target check for non-HTML media types
114
+ (text/markdown, text/plain, application/json,
115
+ application/ld+json, atom/rss/feed+json). Genuine hreflang
116
+ alternates that happen to declare `type="text/html"` still
117
+ fire SEO009.
118
+ - **SRF030 now recognizes the `.md.txt` mirror discovery
119
+ pattern.** When the homepage advertises one or more
120
+ `<link rel="alternate" type="text/markdown">` discovery
121
+ links (the per-route mirror pattern Aeptus and similar
122
+ sites use), the probe stays silent. This is a valid
123
+ Markdown-for-Agents alternative to HTTP content
124
+ negotiation; the rule's role is to flag *absence* of any
125
+ markdown discovery contract, not the choice of which one.
126
+ - **ROB008 skips deliberate sitewide-noindex deployments.**
127
+ Cloudflare Pages preview sets `X-Robots-Tag: noindex`
128
+ sitewide while the build still emits sitemap.xml for
129
+ parity with production; the prior rule fired on every
130
+ sitemap-listed route. The rule now detects when every
131
+ crawled page carries `X-Robots-Tag: noindex` and skips —
132
+ the inconsistency narrative no longer applies. A single
133
+ page lacking the header breaks uniformity (it would
134
+ actually be indexed), and ROB008 fires normally.
135
+
9
136
  ## [0.8.12] - 2026-05-06
10
137
 
11
138
  Adds **Accessibility (A11Y)** as a fifth audit pillar alongside
@@ -1215,7 +1215,7 @@ function globToMatcher(pattern) {
1215
1215
  }
1216
1216
 
1217
1217
  // src/version.ts
1218
- var PACKAGE_VERSION = "0.8.12";
1218
+ var PACKAGE_VERSION = "0.8.14";
1219
1219
 
1220
1220
  // src/configured.ts
1221
1221
  import { definePlugin } from "emdash";
package/dist/index.js CHANGED
@@ -23,7 +23,7 @@ function buildAllowedHosts(evaluatorHost) {
23
23
  }
24
24
 
25
25
  // src/version.ts
26
- var PACKAGE_VERSION = "0.8.12";
26
+ var PACKAGE_VERSION = "0.8.14";
27
27
 
28
28
  // src/sandbox.ts
29
29
  function aexeoPluginSandboxed(options = {}) {
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const PACKAGE_VERSION = "0.8.12";
1
+ export declare const PACKAGE_VERSION = "0.8.14";
2
2
  //# sourceMappingURL=version.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aeptus/aexeo-emdash",
3
- "version": "0.8.12",
3
+ "version": "0.8.14",
4
4
  "description": "Aexeo SEO/GEO content evaluator as an emdash plugin",
5
5
  "license": "MIT",
6
6
  "author": "Aeptus",
Binary file