@aeptus/aexeo-emdash 0.8.19 → 0.9.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.
Files changed (52) hide show
  1. package/CHANGELOG.md +96 -2
  2. package/INSTALL.md +113 -4
  3. package/README.md +12 -5
  4. package/dist/adapter.d.ts +30 -2
  5. package/dist/adapter.d.ts.map +1 -1
  6. package/dist/admin.d.ts.map +1 -1
  7. package/dist/admin.js +2 -2
  8. package/dist/configured.d.ts +6 -0
  9. package/dist/configured.d.ts.map +1 -1
  10. package/dist/configured.js +505 -70
  11. package/dist/content-evaluator.d.ts +14 -0
  12. package/dist/content-evaluator.d.ts.map +1 -0
  13. package/dist/content.d.ts +51 -0
  14. package/dist/content.d.ts.map +1 -0
  15. package/dist/content.js +365 -0
  16. package/dist/data-route.d.ts +3 -0
  17. package/dist/data-route.d.ts.map +1 -1
  18. package/dist/evaluator-sandbox.d.ts +1 -1
  19. package/dist/evaluator-sandbox.d.ts.map +1 -1
  20. package/dist/evaluator.d.ts +1 -1
  21. package/dist/evaluator.d.ts.map +1 -1
  22. package/dist/findings-view.d.ts +7 -2
  23. package/dist/findings-view.d.ts.map +1 -1
  24. package/dist/index.d.ts +15 -1
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +99 -4
  27. package/dist/inventory.d.ts +51 -0
  28. package/dist/inventory.d.ts.map +1 -0
  29. package/dist/plugin.d.ts +30 -3
  30. package/dist/plugin.d.ts.map +1 -1
  31. package/dist/presence-check.d.ts +1 -0
  32. package/dist/presence-check.d.ts.map +1 -1
  33. package/dist/sandbox-entry.d.ts +2 -1
  34. package/dist/sandbox-entry.d.ts.map +1 -1
  35. package/dist/sandbox-entry.js +366 -81
  36. package/dist/sandbox.d.ts +2 -2
  37. package/dist/sidecar-url.d.ts.map +1 -1
  38. package/dist/sidecar.d.ts +7 -1
  39. package/dist/sidecar.d.ts.map +1 -1
  40. package/dist/types.d.ts +11 -4
  41. package/dist/types.d.ts.map +1 -1
  42. package/dist/version.d.ts +1 -1
  43. package/dist/version.d.ts.map +1 -1
  44. package/dist/wasm-init.d.ts +4 -0
  45. package/dist/wasm-init.d.ts.map +1 -1
  46. package/package.json +18 -7
  47. package/wasm/aexeo_emdash_bridge.d.ts +11 -0
  48. package/wasm/aexeo_emdash_bridge.js +1 -1
  49. package/wasm/aexeo_emdash_bridge_bg.d.ts +11 -0
  50. package/wasm/aexeo_emdash_bridge_bg.js +68 -0
  51. package/wasm/aexeo_emdash_bridge_bg.wasm +0 -0
  52. package/wasm/aexeo_emdash_bridge_bg.wasm.d.ts +2 -0
package/CHANGELOG.md CHANGED
@@ -4,6 +4,102 @@ All notable changes to `@aeptus/aexeo-emdash` are listed here.
4
4
  The format follows [Keep a Changelog](https://keepachangelog.com/),
5
5
  and the project follows [Semantic Versioning](https://semver.org/).
6
6
 
7
+ ## [Unreleased]
8
+
9
+ ## [0.9.0] - 2026-11-10
10
+
11
+ ### Added
12
+
13
+ - Portable content presets with per-collection selection, typed body capabilities and explicit incomplete results.
14
+ - Ordered mappings for multiple content fields and custom blocks, including nested repeats and heading levels, in configured and sandboxed modes.
15
+ - Conservative CMS link inventory export, source locations and aggregate content coverage telemetry.
16
+ - The configured dashboard reports evaluator failures without breaking the editor and tolerates older findings without secondary layers.
17
+
18
+ ### Compatibility
19
+
20
+ - Supports EmDash `^1.2.0`. Deploy the matching sidecar when using sandboxed mode.
21
+ - The intelligence widget reports facts and blockers instead of the removed composite score.
22
+ - Existing site and CLI checks remain separate from optional content presets.
23
+
24
+ ### Changed
25
+
26
+ - **The dashboard widget no longer shows a composite score.** The "Overall"
27
+ stat and the "Site score is N — below the 60 quality threshold" banner are
28
+ gone; blockers remain the call to action. `SiteIntelligenceScore` loses
29
+ `overall_score`, `answer_pack_score` and `elapsed_us` and gains
30
+ `answer_pack`, and `citation_readiness_score` and `truth_consistency_score`
31
+ may now be `null`, shown as "unknown", when nothing was measured.
32
+ - **Entity presence resolves the newest Common Crawl index at runtime** from
33
+ `collinfo.json` instead of a pinned crawl, so a site first crawled after a
34
+ plugin release is no longer reported `not_found`. Failing to resolve the
35
+ index reports `unreachable`.
36
+ - Support EmDash `^1.2.0` and run the plugin-host integration coverage against
37
+ EmDash `1.2.0`.
38
+
39
+ ### Added
40
+
41
+ - **The sandboxed plugin warns when its sidecar is on another version.** The
42
+ Worker reports its version in the `x-aexeo-version` response header, and the
43
+ plugin logs a warning when it differs, since a Worker left behind on an upgrade
44
+ keeps evaluating with older rules.
45
+
46
+ ### Security
47
+
48
+ - **EVAL_TOKEN never falls back to plaintext.** When the host cannot encrypt
49
+ the token (usually `EMDASH_ENCRYPTION_KEY` is unset), the Setup page now shows
50
+ an error and changes nothing, where it used to store the token in plaintext KV
51
+ with only a log line. **Behaviour change:** on such a host, saving the Setup
52
+ form fails until the key is set, even for a URL-only change. A token already
53
+ in KV keeps working, and the Setup page says it is unencrypted.
54
+ - **A rotated token is no longer ignored.** Reads preferred settings, so a token
55
+ that fell back to KV during a rotation lost to the older one in settings. A KV
56
+ token is always the newer of the two, and is now read first.
57
+ - **The Setup form rejects trailing-dot hosts** such as `https://localhost./`,
58
+ which passed the loopback check.
59
+
60
+ ### Changed
61
+
62
+ - **`aexeo-crawl-worker` upgrade notes.** The Worker refuses every request when
63
+ `EVAL_TOKEN` is shorter than 32 characters, so rotate a shorter token before
64
+ redeploying. It answers `413` above 8 MiB, the limit of emdash's sandbox
65
+ bridge. Malformed bodies and initialization failures now return JSON errors, and
66
+ token comparison is constant-time. It is built with Wrangler 4 and a newer
67
+ compatibility date.
68
+ - **Editors can read findings.** The configured plugin's `admin` and `data`
69
+ routes declare `plugins:read`; emdash otherwise requires `plugins:manage`.
70
+ Refresh, facts and presence stay admin-only, and the `admin` route refuses
71
+ `refresh_findings` for non-admins. The sandboxed entry stays admin-only because
72
+ its `admin` route also saves the Setup form.
73
+ - **The configured plugin declares its network use**: `network:request` and the
74
+ presence sources' hosts, which it was using while declaring only `content:read`.
75
+
76
+ ### Fixed
77
+
78
+ - **Concurrent writes no longer lose newer data.** A save older than the stored
79
+ revision is ignored, a slow evaluation does not overwrite the findings of a
80
+ later save or delete, and a Refresh does not overwrite a save that landed during
81
+ the sweep or remove a document created during it.
82
+ - **Deleted content leaves the findings immediately**, through a
83
+ `content:afterDelete` hook, including when it is only trashed. Restoring an
84
+ entry brings it back at its next save or Refresh.
85
+ - **Legacy `document:` entries are removed** by a Refresh that does not see their
86
+ route. They record no collection, so they were previously never removed.
87
+ - **The sandboxed score widget reports the score as unavailable** instead of a
88
+ score of 0, which read as a measured result.
89
+ - **Entity presence no longer reports false results.** Common Crawl searches the
90
+ whole domain, where an exact-URL match reported a site absent when the crawl
91
+ skipped only its home page. Wikipedia and Wikidata records must name the entity
92
+ or a declared alias, ignoring legal forms; a substring used to count, so
93
+ "Pineapple" matched "Apple".
94
+ - **Saving a document no longer reports false site-graph findings or erases
95
+ real ones.** A save evaluates one document as a one-page site, so every
96
+ internal link was reported as broken (`LNK001`) and the page as an orphan
97
+ (`LNK002`), and those results replaced the route's stored findings until the
98
+ next Refresh. Rules that depend on other documents (`LNK001`-`LNK004`,
99
+ `SEO009`, `SEO012`, `SEO016`, `SEO017`, `CNT005`) are now computed by Refresh
100
+ only: a save keeps the route's stored findings for them, so a link fixed or
101
+ added in that save is reflected at the next Refresh.
102
+
7
103
  ## [0.8.19] - 2026-09-29
8
104
 
9
105
  Updates the EmDash integration to the current plugin and content APIs, and
@@ -126,8 +222,6 @@ version, since 0.8.19 had never been published.
126
222
  `deploy`, and only the two declaration files remain tracked. The package
127
223
  also gains a README, which it did not have.
128
224
 
129
- ## [Unreleased]
130
-
131
225
  ## [0.8.18] - 2026-09-28
132
226
 
133
227
  ### Added
package/INSTALL.md CHANGED
@@ -5,6 +5,84 @@ site. Findings show up as a Block Kit admin page; a sidebar widget
5
5
  shows the site's current intelligence score; saves auto-evaluate the
6
6
  changed document.
7
7
 
8
+ ## Restricting content presets to specific collections
9
+
10
+ Content presets apply to all evaluated collections by default. Set
11
+ `contentPreset.collections` to select only the collections that use the preset;
12
+ existing site checks continue to run on all configured collections. Use
13
+ `byCollection` to choose an alternate preset for a selected collection.
14
+ For example:
15
+
16
+ ```js
17
+ aexeoPlugin({
18
+ contentPreset: {
19
+ name: "article",
20
+ collections: ["blog_posts", "glossary_terms"],
21
+ byCollection: { glossary_terms: "glossary" },
22
+ },
23
+ })
24
+ ```
25
+
26
+ ## Content coverage
27
+
28
+ Portable Text bodies provide text, headings, paragraphs and links to content
29
+ presets. A plain text body provides text only. EmDash custom blocks are
30
+ project-specific; their flattened text is available to the legacy site audit,
31
+ but content-preset gates that require body capabilities are reported as
32
+ `not_checked` until a faithful mapping is provided. The configured plugin
33
+ returns `content_preset_incomplete` for such a report, preserving its existing
34
+ fail-closed behavior. This avoids treating unobserved headings, paragraphs or
35
+ links as absent. An explicitly empty body
36
+ is distinct from an unavailable body. When an entry has several candidate
37
+ content fields, the default first-field projection remains unverified because
38
+ it cannot establish which fields appear in the rendered page.
39
+
40
+ For custom blocks in configured mode, declare the ordered rendered content
41
+ fields for each block type in the plugin configuration:
42
+
43
+ ```js
44
+ aexeoPlugin({
45
+ contentFieldsByCollection: { pages: ["introduction", "sections"] },
46
+ blockMappings: {
47
+ hero: [
48
+ { kind: "heading", field: "headline" },
49
+ { kind: "paragraph", field: "description", optional: true },
50
+ { kind: "link", field: "linkLabel", hrefField: "linkUrl", optional: true },
51
+ { kind: "richText", field: "body" },
52
+ ],
53
+ faq: [
54
+ { kind: "heading", field: "heading" },
55
+ { kind: "repeat", field: "faqs", fields: [
56
+ { kind: "heading", field: "question", level: 3 },
57
+ { kind: "paragraph", field: "answer" },
58
+ ] },
59
+ ],
60
+ },
61
+ })
62
+ ```
63
+
64
+ `contentFieldsByCollection` declares the body fields rendered by each selected
65
+ collection, in order. It is an explicit assertion of completeness, so include
66
+ all rendered fields; entries without any selected field remain unavailable.
67
+ In sandboxed mode, enter this object in `Content fields by collection (JSON)`.
68
+
69
+ A block mapping is the site's assertion that those fields cover the rendered content,
70
+ in order. `richText` accepts Portable Text arrays and preserves their headings
71
+ and links; `heading` defaults to h2 and accepts levels 1 through 6. `repeat`
72
+ maps each item in an array;
73
+ `optional: true` permits an absent field without inventing content. Every
74
+ encountered block type must be
75
+ mapped and every mapped field must have the expected type. If not, capabilities
76
+ remain unverified. These options apply to configured-mode saves and both
77
+ refresh routes. In sandboxed mode, enter the same JSON object in the plugin
78
+ settings field `Custom block mappings (JSON)`; it applies to save and Refresh.
79
+ Invalid or unavailable settings leave custom blocks unverified.
80
+
81
+ Adapters supplying an `EmdashDocument` can set `body_capabilities` to a subset
82
+ of `text`, `headings`, `paragraphs` and `links`. Omit it only when all four
83
+ are faithfully represented. These capability declarations describe input
84
+ coverage; they do not validate the content itself.
85
+
8
86
  ## Two install paths
9
87
 
10
88
  The package exports two factories:
@@ -31,8 +109,8 @@ when it's actually needed.
31
109
  (`@astrojs/cloudflare` + `@emdash-cms/cloudflare`'s `sandbox()`
32
110
  runner is fine — sandboxed plugins use Worker Loader, configured
33
111
  plugins don't, but both adapters import cleanly).
34
- - EmDash `>=0.41.0 <0.42.0` as a peer dependency. The integration
35
- coverage targets `0.41.0` with EmDash's official plugin test host.
112
+ - EmDash `^1.2.0` as a peer dependency. The integration coverage targets
113
+ `1.2.0` with EmDash's official plugin test host.
36
114
 
37
115
  ### Install
38
116
 
@@ -371,8 +449,10 @@ Node adapter.
371
449
  evaluated document under `document:<route>`.
372
450
  - **Auto-evaluate on save**: emdash's `content:afterSave` hook fires
373
451
  for each save, re-evaluates that one document, and updates its
374
- KV findings entry. The dashboard widget reflects the new score on
375
- the next page load.
452
+ KV findings entry. Findings that depend on other documents, such as
453
+ broken internal links, keep their last Refresh result until the next
454
+ Refresh. The dashboard widget reflects the new score on the next page
455
+ load.
376
456
 
377
457
  ## Architecture in one paragraph
378
458
 
@@ -386,3 +466,32 @@ itself is the same `aexeo-emdash-bridge` Rust crate that powers the
386
466
  Aexeo CLI; it's compiled to WebAssembly via wasm-pack and imported
387
467
  by the host's bundler (Vite + `vite-plugin-wasm`). No separate
388
468
  service, no sidecar, no auth token.
469
+
470
+ ### Exporting a conservative link inventory
471
+
472
+ For host code with access to EmDash's content API, the package exports
473
+ `exportLinkInventory(content, options)`. Select the collections belonging to
474
+ one publication explicitly and supply the observed site identity:
475
+
476
+ ```ts
477
+ import { exportLinkInventory } from "@aeptus/aexeo-emdash";
478
+
479
+ const result = await exportLinkInventory(ctx.content, {
480
+ collections: ["blog_posts", "pages"],
481
+ identity: { origin: "https://example.org", release: "release-id", surface: "public", snapshot: "snapshot-id" },
482
+ });
483
+ // result.inventory matches the link-graph input's inventory shape.
484
+ // Inspect result.issues and result.omitted before using it.
485
+ ```
486
+
487
+ The export resolves public URLs through EmDash and paginates each selected
488
+ collection. Entries without public URLs are reported as omitted, and entries
489
+ with URLs default to `unknown` disposition. A host may supply `classify` when
490
+ it has authoritative indexability and alias information. Repeated or missing
491
+ cursors, failures, and page limits are reported. The inventory is always marked
492
+ incomplete because pagination alone cannot establish a transactional snapshot or
493
+ include routes outside the chosen collections. No HTTP endpoint is installed by
494
+ this API. It cannot by itself establish that a crawl and CMS view describe the
495
+ same publication, release and point in time.
496
+
497
+ An optional `onTelemetry` callback receives only elapsed milliseconds and aggregate counts. It is disabled by default and does not receive URLs or content.
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  Aexeo SEO/GEO content evaluator as an emdash plugin.
4
4
 
5
5
  Adds a Findings admin page, per-document panel, and dashboard
6
- intelligence-score widget to an emdash site. Saves auto-evaluate the
6
+ intelligence facts widget to an emdash site. Saves auto-evaluate the
7
7
  changed document; the Refresh button re-evaluates the whole site.
8
8
 
9
9
  ## Install
@@ -43,18 +43,25 @@ troubleshooting list, see [INSTALL.md](./INSTALL.md).
43
43
  - **Findings page** at `/_emdash/admin/plugins/aexeo-emdash/findings`:
44
44
  rule violations across the site, filterable by severity.
45
45
  - **Document panel** at `/document`: findings scoped to one document.
46
- - **Dashboard widget**: top-line intelligence score (citation, truth,
47
- answer-pack, external-trust dimensions). Banner appears below 60.
46
+ - **Dashboard widget**: citation readiness, truth consistency and answer
47
+ structure side by side, with the top blockers. There is no composite score
48
+ or quality threshold, and a dimension with nothing to measure reads
49
+ `unknown`.
50
+ - **Entity presence**: Wikipedia is searched on `en.wikipedia.org` only, so
51
+ `not_found` says nothing about other language editions.
48
52
  - **Refresh button**: re-evaluate every document in the configured
49
53
  collections (`posts`, `pages` by default).
50
54
  - **Auto-evaluate on save**: EmDash's `content:afterSave` hook evaluates
51
55
  the saved document and updates its findings. Sandboxed installs need a
52
56
  configured evaluator sidecar; configured installs run evaluation in-process.
57
+ Findings that depend on other documents (broken and weak internal links,
58
+ inbound links, hreflang targets, shared canonicals, duplicate metadata and
59
+ text) stay as the last Refresh stored them until the next Refresh.
53
60
 
54
61
  ## Compatibility
55
62
 
56
- - EmDash `>= 0.41.0 < 0.42.0` (peer dependency; current supported range)
57
- - Runtime integration coverage targets EmDash `0.41.0` via the official
63
+ - EmDash `^1.2.0` (peer dependency; current supported range)
64
+ - Runtime integration coverage targets EmDash `1.2.0` via the official
58
65
  `@emdash-cms/plugin-test` host.
59
66
  - Cloudflare Workers via `@astrojs/cloudflare`. The plugin uses
60
67
  Cloudflare-specific APIs and silently no-ops on the Node adapter.
package/dist/adapter.d.ts CHANGED
@@ -1,10 +1,34 @@
1
1
  import type { EmdashDocument } from "./types.js";
2
+ /** Ordered fields that the host declares constitute a custom block's content. */
3
+ export type CustomBlockField = {
4
+ kind: "paragraph" | "richText";
5
+ field: string;
6
+ optional?: boolean;
7
+ } | {
8
+ kind: "heading";
9
+ field: string;
10
+ level?: 1 | 2 | 3 | 4 | 5 | 6;
11
+ optional?: boolean;
12
+ } | {
13
+ kind: "link";
14
+ field: string;
15
+ hrefField: string;
16
+ optional?: boolean;
17
+ } | {
18
+ kind: "repeat";
19
+ field: string;
20
+ fields: readonly CustomBlockField[];
21
+ optional?: boolean;
22
+ };
23
+ export type CustomBlockMappings = Record<string, readonly CustomBlockField[]>;
2
24
  export interface EmdashContentItem {
3
25
  id: string;
4
26
  type: string;
5
27
  slug: string | null;
6
28
  status: string;
7
29
  locale: string | null;
30
+ /** Host write timestamp. Orders concurrent saves and Refresh sweeps. */
31
+ updatedAt?: string;
8
32
  translationGroup?: string | null;
9
33
  data: Record<string, unknown>;
10
34
  seo?: {
@@ -21,6 +45,8 @@ export interface EmdashContentMeta {
21
45
  title: string;
22
46
  /** Exact URL returned by EmDash, or null when this entry has no public route. */
23
47
  publicUrl: string | null;
48
+ /** The host's `updatedAt` for the row this entry was adapted from. */
49
+ updatedAt?: string;
24
50
  }
25
51
  export interface ContentUrlApi {
26
52
  getPublicUrl(collection: string, id: string): Promise<string | null>;
@@ -44,16 +70,18 @@ export interface AdaptedContent {
44
70
  * accounts for collection URL patterns, locale prefixes, and slash policy;
45
71
  * slug-derived paths are not equivalent to the site's actual public URLs.
46
72
  */
47
- export declare function adaptContentItemWithContext(content: EmdashContentItem, contentApi: ContentUrlApi, defaultLocale?: string): Promise<AdaptedContent>;
73
+ export declare function adaptContentItemWithContext(content: EmdashContentItem, contentApi: ContentUrlApi, defaultLocale?: string, blockMappings?: CustomBlockMappings, contentFields?: readonly string[]): Promise<AdaptedContent>;
48
74
  /**
49
75
  * Synchronous adapter for callers that do not have a host content API.
50
76
  * It deliberately uses a stable identity route; callers should use
51
77
  * adaptContentItemWithContext whenever EmDash can resolve the public URL.
52
78
  */
53
- export declare function contentItemToEmdashDocument(content: EmdashContentItem): EmdashDocument;
79
+ export declare function contentItemToEmdashDocument(content: EmdashContentItem, blockMappings?: CustomBlockMappings): EmdashDocument;
54
80
  export declare function adaptContentItem(content: EmdashContentItem, options?: {
55
81
  route?: string;
56
82
  publicUrl?: string | null;
57
83
  defaultLocale?: string;
84
+ blockMappings?: CustomBlockMappings | undefined;
85
+ contentFields?: readonly string[];
58
86
  }): AdaptedContent;
59
87
  //# sourceMappingURL=adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAqB,MAAM,YAAY,CAAC;AAEpE,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,GAAG,CAAC,EAAE;QACJ,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAC3B,CAAC;CACH;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACrE,eAAe,CACb,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC;QACT,gBAAgB,EAAE,MAAM,CAAC;QACzB,YAAY,EAAE,KAAK,CAAC;YAClB,EAAE,EAAE,MAAM,CAAC;YACX,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;YACtB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;YACpB,MAAM,EAAE,MAAM,CAAC;YACf,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC,CAAC;KACJ,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,cAAc,CAAC;IACzB,IAAI,EAAE,iBAAiB,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,iBAAiB,EAC1B,UAAU,EAAE,aAAa,EACzB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,cAAc,CAAC,CA2CzB;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,iBAAiB,GACzB,cAAc,CAEhB;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,iBAAiB,EAC1B,OAAO,GAAE;IACP,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACnB,GACL,cAAc,CAgChB"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../src/admin.tsx"],"names":[],"mappings":"AAkBA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,eAAO,MAAM,KAAK;;;;;;;;CAcjB,CAAC"}
1
+ {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../src/admin.tsx"],"names":[],"mappings":"AAkBA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,eAAO,MAAM,KAAK;IAEhB,iBAAiB;IACjB,aAAa;IACb,gBAAgB;IAChB,oBAAoB;IACpB,gBAAgB;IAIhB,WAAW;IAGX,QAAQ;CACT,CAAC"}
package/dist/admin.js CHANGED
@@ -163,7 +163,7 @@ function PillarView({
163
163
  /* @__PURE__ */ jsx(SeverityBadge, { severity: finding.severity }),
164
164
  /* @__PURE__ */ jsx("code", { className: "font-mono text-xs", children: finding.rule_id }),
165
165
  /* @__PURE__ */ jsx("span", { className: "flex-1", children: finding.message }),
166
- finding.layers?.secondaries.length ? /* @__PURE__ */ jsx(SecondariesChips, { layers: finding.layers.secondaries }) : null
166
+ finding.layers?.secondaries?.length ? /* @__PURE__ */ jsx(SecondariesChips, { layers: finding.layers.secondaries }) : null
167
167
  ] }, i)) })
168
168
  ] }),
169
169
  findings.length === 0 ? sitewide.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-sm text-kumo-subtle", children: "All clean on this layer." }) : null : /* @__PURE__ */ jsx("div", { className: "overflow-x-auto rounded border border-kumo-line", children: /* @__PURE__ */ jsxs("table", { className: "w-full text-left text-sm", children: [
@@ -181,7 +181,7 @@ function PillarView({
181
181
  /* @__PURE__ */ jsx("td", { className: "px-3 py-2 align-top", children: /* @__PURE__ */ jsx("code", { className: "rounded bg-kumo-tint px-1.5 py-0.5 font-mono text-xs", children: finding.rule_id }) }),
182
182
  /* @__PURE__ */ jsx("td", { className: "px-3 py-2 align-top", children: /* @__PURE__ */ jsx(SeverityBadge, { severity: finding.severity }) }),
183
183
  /* @__PURE__ */ jsx("td", { className: "px-3 py-2 align-top", children: finding.message }),
184
- /* @__PURE__ */ jsx("td", { className: "px-3 py-2 align-top", children: finding.layers?.secondaries.length ? /* @__PURE__ */ jsx(SecondariesChips, { layers: finding.layers.secondaries }) : /* @__PURE__ */ jsx("span", { className: "text-xs text-kumo-subtle", children: "\u2014" }) })
184
+ /* @__PURE__ */ jsx("td", { className: "px-3 py-2 align-top", children: finding.layers?.secondaries?.length ? /* @__PURE__ */ jsx(SecondariesChips, { layers: finding.layers.secondaries }) : /* @__PURE__ */ jsx("span", { className: "text-xs text-kumo-subtle", children: "\u2014" }) })
185
185
  ] }, i);
186
186
  }) })
187
187
  ] }) })
@@ -1,5 +1,11 @@
1
1
  import type { Suppression } from "./suppressions.js";
2
+ import type { ContentPresetOptions } from "./content-evaluator.js";
3
+ import type { CustomBlockMappings } from "./adapter.js";
2
4
  export interface ConfiguredPluginOptions {
5
+ blockMappings?: CustomBlockMappings;
6
+ contentFieldsByCollection?: Record<string, readonly string[]>;
7
+ /** Optional portable preset evaluated in addition to the existing site checks. */
8
+ contentPreset?: ContentPresetOptions;
3
9
  /**
4
10
  * Full override of the swept collections. See `aexeoPlugin` in
5
11
  * src/index.ts for the full precedence story.
@@ -1 +1 @@
1
- {"version":3,"file":"configured.d.ts","sourceRoot":"","sources":["../src/configured.ts"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EAAE,WAAW,EAAqB,MAAM,mBAAmB,CAAC;AA0HxE,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":"AAwCA,OAAO,KAAK,EAAE,WAAW,EAAqB,MAAM,mBAAmB,CAAC;AAKxE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,KAAK,EAAE,mBAAmB,EAAqB,MAAM,cAAc,CAAC;AAuH3E,MAAM,WAAW,uBAAuB;IACtC,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,yBAAyB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC;IAC9D,kFAAkF;IAClF,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC;;;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,CAmJ3E;eAIc,YAAY"}