@aeptus/aexeo-emdash 0.8.9 → 0.8.11

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,150 @@ and the project follows [Semantic Versioning](https://semver.org/).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.8.11] - 2026-05-05
10
+
11
+ Picks up the post-0.8.10 product additions and the FACTS003
12
+ quality fixes Aeptus reported after running 0.8.10 in
13
+ preview. 0.8.10 was already on npm before these landed; this
14
+ release bundles them into one consumer-visible bump.
15
+
16
+ ### Added (engine via bridge)
17
+
18
+ - **`SOC006` enabled by default.** Missing `og:image` now
19
+ surfaces on every audit. The rule existed but was gated
20
+ behind `require_social_images = false`; flipped to true.
21
+ - **`SOC009` (heuristic).** Recommends `summary_large_image`
22
+ when `twitter:card` is plain `summary`. Editors can keep
23
+ `summary` if they want; this is a nudge, not a blocker.
24
+ - **`CNT006` (heuristic, low-confidence).** Generic-beneficiary
25
+ detector — flags abstract audience-needs copy
26
+ ("Needs speed and clarity to make decisions") that has no
27
+ concrete anchoring (numbers, named tools, quotes). Skips
28
+ when concrete-anchor tokens (`study`, `research`, etc.)
29
+ appear nearby. Editors can suppress via the new
30
+ `[route_kinds]` config block.
31
+ - **`[route_kinds]` config block.** Named per-pattern rule
32
+ masking that compiles to virtual suppressions:
33
+ ```toml
34
+ [route_kinds.manifesto]
35
+ match = ["/foundations/"]
36
+ skip_rules = ["GEO007", "GEO008", "GEO010"]
37
+ noindex = false
38
+ ```
39
+ Bundles a path-pattern set with a stance (which rules
40
+ to skip, whether routes are intentionally noindex). Lighter
41
+ than scattering one suppression per rule × pattern.
42
+
43
+ ### Fixed
44
+
45
+ - **FACTS003 schema half no longer fires on no-schema input.**
46
+ Configured-mode CMS document sets don't carry rendered JSON-LD,
47
+ so `pages_with_schema = 0`. The previous logic emitted
48
+ `organization_schema.name` (Error) and `organization_schema.url`
49
+ (Warning) with empty `observed` — `iter().any()` is trivially
50
+ false on an empty set, so the negation always fired. Aeptus
51
+ reported this as the first half of FACTS003 noise after
52
+ installing 0.8.10. Schema block is now gated on
53
+ `pages_with_schema > 0`; the `structured_truth_source` enum
54
+ (`Manifest` vs `SchemaAndManifest`) still records whether
55
+ schema participated, so downstream consumers can tell the
56
+ difference between "schema agreed" and "schema wasn't part
57
+ of the assessment".
58
+ - **FACTS003 title check no longer fires on legal/utility
59
+ pages or on pages whose JSON-LD declares the brand.** Aeptus
60
+ reported title warnings on `/privacy`, `/terms`, `/principles`,
61
+ `/references`, `/signup` simply because their titles weren't
62
+ "Aeptus". The check now (a) skips pages classified as
63
+ `PageKind::{Search, Admin, Feed, Utility, NotFound, Legal}`,
64
+ and (b) treats per-page identity-bearing schema with a name
65
+ matching the brand as another `identity_present_elsewhere`
66
+ signal. Content pages that genuinely never mention the brand
67
+ in any identity-bearing surface still fire — the user can
68
+ silence those via the `[route_kinds]` block from this same
69
+ release.
70
+
71
+ ### Notes for hosts upgrading from 0.8.10
72
+
73
+ - No code changes required.
74
+ - After bumping, the admin's findings page will show:
75
+ - **New** SOC006 findings on every document missing og:image.
76
+ - **New** SOC009 nudges on documents declaring
77
+ `twitter:card = summary`.
78
+ - **New** CNT006 nudges on documents whose visible text has
79
+ generic-beneficiary copy without concrete anchors.
80
+ - **Fewer** FACTS003 findings: schema-half mismatches gone
81
+ when the CMS doc set lacks JSON-LD; title warnings gone
82
+ on legal/utility pages.
83
+ - If the new SOC/CNT findings are too noisy on a specific
84
+ route family, declare a `[route_kinds.X]` block in
85
+ `aexeo.toml` with `match` patterns and a `skip_rules` list.
86
+ - For the infrastructure-level audit (robots/sitemap/llms/
87
+ well-known/etc.), run `aexeo-cli check` against your static
88
+ dist; that's where those rules belong.
89
+
90
+ ### CLI side (aexeo-cli v0.0.16, same release window)
91
+
92
+ - **`aexeo-cli crawl --cf-access-id … --cf-access-secret …`**
93
+ injects Cloudflare Access service-token headers
94
+ (`CF-Access-Client-Id` + `CF-Access-Client-Secret`) on every
95
+ fetch. Falls back to env vars `CF_ACCESS_CLIENT_ID` /
96
+ `CF_ACCESS_CLIENT_SECRET` when flags are absent. Closes the
97
+ loop for hosts whose preview deploys are behind Cloudflare
98
+ Access (Aeptus's CI was blocked on this).
99
+
100
+ ## [0.8.10] - 2026-05-04
101
+
102
+ Two follow-up quality fixes from Aeptus's 0.8.9 retest. The
103
+ local refresh path is now end-to-end correct.
104
+
105
+ ### Fixed
106
+
107
+ - **Findings now attribute to document routes, not synthesized
108
+ HTML filenames.** v0.8.9's bridge set `page.path` to
109
+ `emdash/<route>.html`, which the plugin's
110
+ `evaluateAndPersistAll` then used as the bucket key when
111
+ distributing findings to document routes. The synthesized
112
+ filename never matched the documentRoutes set, so every
113
+ finding landed in a shadow bucket keyed by the filename and
114
+ the document's row in the admin showed zero findings. Bridge
115
+ now sets `page.path` to the document route directly
116
+ (`/about` rather than `emdash/about.html`); `Finding.path`
117
+ matches the bucket the plugin pre-populates.
118
+
119
+ ### Changed
120
+
121
+ - **CMS evaluation suppresses site-wide infrastructure rule
122
+ groups.** The plugin's configured-mode evaluator now passes
123
+ a Config to `evaluateDocuments` that disables `robots`,
124
+ `sitemap`, `llm`, `surfaces`, `well_known`, `headers`, and
125
+ `deployment` rule groups. The CMS document set has no
126
+ robots.txt or sitemap.xml or llms.txt — those are the
127
+ host's deployed-site artifacts, audited by the CLI's
128
+ static-site mode against a real filesystem. Running them
129
+ against the bridge's synthetic CMS site produced
130
+ `missing robots.txt` / `missing sitemap.xml` / `missing
131
+ llms.txt` / `missing markdown mirrors` noise on every
132
+ refresh, none of which the editor could act on from inside
133
+ the CMS.
134
+
135
+ Per-page rule groups stay on: `html`, `social`, `schema`,
136
+ `content`, `structure`, `links`. Those audit per-document
137
+ content editors can actually fix.
138
+
139
+ CLI static-site audits are unaffected — they use
140
+ `Config::default()` with all groups on, against a
141
+ filesystem-rooted Site.
142
+
143
+ ### Notes for hosts upgrading from 0.8.9
144
+
145
+ - No code changes required.
146
+ - After bumping, the admin's findings page will show fewer
147
+ findings (infrastructure noise gone) and every finding
148
+ correctly attributed to its document route.
149
+ - For the infrastructure-level audit (robots/sitemap/llms/
150
+ well-known/etc.), run `aexeo-cli check` against your static
151
+ dist; that's where those rules belong.
152
+
9
153
  ## [0.8.9] - 2026-05-04
10
154
 
11
155
  ### Fixed
@@ -908,7 +1052,9 @@ First public release.
908
1052
  `astro.config.mjs` for the WASM import to resolve to a
909
1053
  precompiled `WebAssembly.Module`. Not optional.
910
1054
 
911
- [Unreleased]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.8.9...HEAD
1055
+ [Unreleased]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.8.11...HEAD
1056
+ [0.8.11]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.8.10...aexeo-emdash-v0.8.11
1057
+ [0.8.10]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.8.9...aexeo-emdash-v0.8.10
912
1058
  [0.8.9]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.8.8...aexeo-emdash-v0.8.9
913
1059
  [0.8.8]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.8.7...aexeo-emdash-v0.8.8
914
1060
  [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.11";
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.11";
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.11";
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.11",
4
4
  "description": "Aexeo SEO/GEO content evaluator as an emdash plugin",
5
5
  "license": "MIT",
6
6
  "author": "Aeptus",
Binary file