@aeptus/aexeo-emdash 0.8.9 → 0.8.10

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,112 @@ and the project follows [Semantic Versioning](https://semver.org/).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.8.10] - 2026-05-04
10
+
11
+ Two follow-up quality fixes from Aeptus's 0.8.9 retest, plus
12
+ four new product-level capabilities from the post-retest
13
+ roadmap discussion.
14
+
15
+ ### Added (engine via bridge)
16
+
17
+ - **`SOC006` enabled by default.** Missing `og:image` now
18
+ surfaces on every audit. The rule existed but was gated
19
+ behind `require_social_images = false`; flipped to true.
20
+ - **`SOC009` (heuristic).** Recommends `summary_large_image`
21
+ when `twitter:card` is plain `summary`. Editors can keep
22
+ `summary` if they want; this is a nudge, not a blocker.
23
+ - **`CNT006` (heuristic, low-confidence).** Generic-beneficiary
24
+ detector — flags abstract audience-needs copy
25
+ ("Needs speed and clarity to make decisions") that has no
26
+ concrete anchoring (numbers, named tools, quotes). Skips
27
+ when concrete-anchor tokens (`study`, `research`, etc.)
28
+ appear nearby. Editors can suppress via the new
29
+ `[route_kinds]` config block.
30
+ - **`[route_kinds]` config block.** Named per-pattern rule
31
+ masking that compiles to virtual suppressions:
32
+ ```toml
33
+ [route_kinds.manifesto]
34
+ match = ["/foundations/"]
35
+ skip_rules = ["GEO007", "GEO008", "GEO010"]
36
+ noindex = false
37
+ ```
38
+ Bundles a path-pattern set with a stance (which rules
39
+ to skip, whether routes are intentionally noindex). Lighter
40
+ than scattering one suppression per rule × pattern.
41
+
42
+ ### Fixed
43
+
44
+ - **Findings now attribute to document routes, not synthesized
45
+ HTML filenames.** v0.8.9's bridge set `page.path` to
46
+ `emdash/<route>.html`, which the plugin's
47
+ `evaluateAndPersistAll` then used as the bucket key when
48
+ distributing findings to document routes. The synthesized
49
+ filename never matched the documentRoutes set, so every
50
+ finding landed in a shadow bucket keyed by the filename and
51
+ the document's row in the admin showed zero findings. Bridge
52
+ now sets `page.path` to the document route directly
53
+ (`/about` rather than `emdash/about.html`); `Finding.path`
54
+ matches the bucket the plugin pre-populates.
55
+
56
+ ### Changed
57
+
58
+ - **CMS evaluation suppresses site-wide infrastructure rule
59
+ groups.** The plugin's configured-mode evaluator now passes
60
+ a Config to `evaluateDocuments` that disables `robots`,
61
+ `sitemap`, `llm`, `surfaces`, `well_known`, `headers`, and
62
+ `deployment` rule groups. The CMS document set has no
63
+ robots.txt or sitemap.xml or llms.txt — those are the
64
+ host's deployed-site artifacts, audited by the CLI's
65
+ static-site mode against a real filesystem. Running them
66
+ against the bridge's synthetic CMS site produced
67
+ `missing robots.txt` / `missing sitemap.xml` / `missing
68
+ llms.txt` / `missing markdown mirrors` noise on every
69
+ refresh, none of which the editor could act on from inside
70
+ the CMS.
71
+
72
+ Per-page rule groups stay on: `html`, `social`, `schema`,
73
+ `content`, `structure`, `links`. Those audit per-document
74
+ content editors can actually fix.
75
+
76
+ CLI static-site audits are unaffected — they use
77
+ `Config::default()` with all groups on, against a
78
+ filesystem-rooted Site.
79
+
80
+ ### Notes for hosts upgrading from 0.8.9
81
+
82
+ - No code changes required for any of the fixes or additions.
83
+ - After bumping, the admin's findings page will show:
84
+ - Fewer findings overall (infrastructure noise is gone) and
85
+ every finding correctly attributed to its document route.
86
+ - **New** SOC006 findings on every document missing og:image.
87
+ - **New** SOC009 nudges on documents declaring
88
+ `twitter:card = summary`.
89
+ - **New** CNT006 nudges on documents whose visible text has
90
+ generic-beneficiary copy without concrete anchors.
91
+ - If the new SOC/CNT findings are too noisy on a specific
92
+ route family, declare a `[route_kinds.X]` block in
93
+ `aexeo.toml` with `match` patterns and a `skip_rules` list.
94
+ Example:
95
+ ```toml
96
+ [route_kinds.manifesto]
97
+ match = ["/foundations/"]
98
+ skip_rules = ["CNT006", "GEO007"]
99
+ noindex = false
100
+ ```
101
+ - For the infrastructure-level audit (robots/sitemap/llms/
102
+ well-known/etc.), run `aexeo-cli check` against your static
103
+ dist; that's where those rules belong.
104
+
105
+ ### CLI side (aexeo-cli, same release)
106
+
107
+ - **`aexeo-cli crawl --cf-access-id … --cf-access-secret …`**
108
+ injects Cloudflare Access service-token headers
109
+ (`CF-Access-Client-Id` + `CF-Access-Client-Secret`) on every
110
+ fetch. Falls back to env vars `CF_ACCESS_CLIENT_ID` /
111
+ `CF_ACCESS_CLIENT_SECRET` when flags are absent. Closes the
112
+ loop for hosts whose preview deploys are behind Cloudflare
113
+ Access (Aeptus's CI was blocked on this).
114
+
9
115
  ## [0.8.9] - 2026-05-04
10
116
 
11
117
  ### Fixed
@@ -908,7 +1014,8 @@ First public release.
908
1014
  `astro.config.mjs` for the WASM import to resolve to a
909
1015
  precompiled `WebAssembly.Module`. Not optional.
910
1016
 
911
- [Unreleased]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.8.9...HEAD
1017
+ [Unreleased]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.8.10...HEAD
1018
+ [0.8.10]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.8.9...aexeo-emdash-v0.8.10
912
1019
  [0.8.9]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.8.8...aexeo-emdash-v0.8.9
913
1020
  [0.8.8]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.8.7...aexeo-emdash-v0.8.8
914
1021
  [0.8.7]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.8.6...aexeo-emdash-v0.8.7
@@ -1 +1 @@
1
- {"version":3,"file":"configured.d.ts","sourceRoot":"","sources":["../src/configured.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAmFrD,MAAM,WAAW,uBAAuB;IACtC;;;OAGG;IACH,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAEhC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAEvC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAEvC;;;;;OAKG;IACH,YAAY,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;CACvC;AAED,wBAAgB,YAAY,CAAC,OAAO,GAAE,uBAA4B,GAAG,OAAO,CA2H3E;AAID,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"configured.d.ts","sourceRoot":"","sources":["../src/configured.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA0HrD,MAAM,WAAW,uBAAuB;IACtC;;;OAGG;IACH,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAEhC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAEvC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAEvC;;;;;OAKG;IACH,YAAY,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;CACvC;AAED,wBAAgB,YAAY,CAAC,OAAO,GAAE,uBAA4B,GAAG,OAAO,CA2H3E;AAID,eAAe,YAAY,CAAC"}
@@ -1215,7 +1215,7 @@ function globToMatcher(pattern) {
1215
1215
  }
1216
1216
 
1217
1217
  // src/version.ts
1218
- var PACKAGE_VERSION = "0.8.9";
1218
+ var PACKAGE_VERSION = "0.8.10";
1219
1219
 
1220
1220
  // src/configured.ts
1221
1221
  import { definePlugin } from "emdash";
@@ -1238,9 +1238,28 @@ function resolveCollections(explicit, include, exclude) {
1238
1238
  }
1239
1239
  return result;
1240
1240
  }
1241
+ var CMS_DISABLED_GROUPS = [
1242
+ "robots",
1243
+ "sitemap",
1244
+ "llm",
1245
+ "surfaces",
1246
+ "well_known",
1247
+ "headers",
1248
+ "deployment"
1249
+ ];
1250
+ function buildCmsContextConfig() {
1251
+ const checks = {};
1252
+ for (const group of CMS_DISABLED_GROUPS) {
1253
+ checks[group] = false;
1254
+ }
1255
+ return JSON.stringify({ checks });
1256
+ }
1241
1257
  var inProcessEvaluator = async (documents) => {
1242
1258
  try {
1243
- const raw = await evaluateDocuments2(JSON.stringify(documents));
1259
+ const raw = await evaluateDocuments2(
1260
+ JSON.stringify(documents),
1261
+ buildCmsContextConfig()
1262
+ );
1244
1263
  const findings = JSON.parse(raw);
1245
1264
  if (!Array.isArray(findings)) {
1246
1265
  return {
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.9";
26
+ var PACKAGE_VERSION = "0.8.10";
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.9";
1
+ export declare const PACKAGE_VERSION = "0.8.10";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,WAAW,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aeptus/aexeo-emdash",
3
- "version": "0.8.9",
3
+ "version": "0.8.10",
4
4
  "description": "Aexeo SEO/GEO content evaluator as an emdash plugin",
5
5
  "license": "MIT",
6
6
  "author": "Aeptus",
Binary file