@aeptus/aexeo-emdash 0.1.2 → 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 CHANGED
@@ -6,6 +6,124 @@ and the project follows [Semantic Versioning](https://semver.org/).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.3.0] - 2026-05-01
10
+
11
+ Adds an LLM-assisted authoring flow for the truth manifest
12
+ (`facts.json`) — a structured assertion of who the organization is,
13
+ what the products are, and the terminology to use/avoid. AI
14
+ assistants and search crawlers read it for citation grounding;
15
+ authoring it well is a content task, not engineering, but the
16
+ manifest's failure mode (a published manifest with hallucinated
17
+ content) is high-impact.
18
+
19
+ The plugin frames the question, validates the answer, and persists
20
+ the result. The editor's LLM generates. The split is enforced by
21
+ the prompt template, which mandates an interview phase before
22
+ producing JSON: the LLM must ask up to 4 prioritized questions
23
+ (terminology > identity > product/org split > descriptors) so the
24
+ failure mode shifts from confident hallucination to honest gaps.
25
+
26
+ **Compatibility:** verified against emdash `0.7.0` and `0.8.0`.
27
+
28
+ ### Added
29
+
30
+ - **`/facts` admin page.** New entry in the plugin's adminPages.
31
+ Three-section UI: status of stored manifest, generate-prompt
32
+ (copy to clipboard for pasting into the editor's LLM), and
33
+ paste-and-validate (textarea with Validate + Save buttons; Save
34
+ is gated on a clean validation).
35
+ - **Manifest-aware truth scoring.** `scoreIntelligence` now accepts
36
+ an optional manifest argument; the plugin reads it from KV
37
+ (`facts:current`) before scoring and badges the dashboard widget's
38
+ truth stat with the actual signal source — `Truth (manifest+schema)`,
39
+ `Truth (schema only)`, etc. Closes the prior UX-honesty gap where
40
+ the truth score was computed in schema-only mode without telling
41
+ the editor.
42
+ - **`FACTS001` / `FACTS003` findings** on /findings. Surface
43
+ "no manifest authored yet" and "manifest disagrees with on-page
44
+ schema.org" so editors discover the authoring flow through their
45
+ existing surface. Cached under `meta:facts-findings` and
46
+ refreshed on Refresh + on Save, so the data path reads at zero
47
+ WASM cost.
48
+ - **Bridge surface:** `generateFactsPrompt(documents)` and
49
+ `validateFactsManifest(manifest, documents)` WASM exports.
50
+ `scoreIntelligence` gained an optional `manifest_json` parameter.
51
+
52
+ ### Changed
53
+
54
+ - `wasm/aexeo_emdash_bridge_bg.d.ts` is now tracked in git
55
+ (gitignored everything else in `wasm/`). wasm-bindgen 0.2.118
56
+ doesn't emit a `_bg.d.ts` for the bundler target, so this file
57
+ is hand-maintained. The build script snapshots its contents
58
+ before each wasm-bindgen run and restores it (saving the new
59
+ emit under `.wasm-bindgen` for inspection) if a future toolchain
60
+ version begins emitting one — loud warning rather than silent
61
+ regression.
62
+
63
+ ### Notes for hosts upgrading from 0.2.x
64
+
65
+ - A new sidebar entry "Truth manifest" appears under the plugin's
66
+ admin pages. No action required to enable.
67
+ - The dashboard widget's truth-score label now reads
68
+ `Truth (schema only)` until a manifest is authored. Same number,
69
+ more honest framing — no behavioral change.
70
+ - A new sitewide finding (`FACTS001`) appears on /findings until a
71
+ manifest is saved. Severity: warning. Authoring via the new
72
+ /facts page dismisses it.
73
+
74
+ ## [0.2.0] - 2026-04-28
75
+
76
+ Adds the long-asked clickable routes on the findings page. Block
77
+ Kit can't render external links in any element type, so /findings
78
+ now ships as a React component registered via the plugin's
79
+ `adminEntry`. /document and the dashboard widget continue to use
80
+ Block Kit (no link needs there).
81
+
82
+ **Compatibility:** verified against emdash `0.7.0` and `0.8.0`.
83
+
84
+ ### Added
85
+
86
+ - **Clickable routes on /findings.** Each row's route links to the
87
+ emdash edit URL for that document
88
+ (`/_emdash/admin/content/<collection>/<id>`). Published documents
89
+ also get a "live ↗" link to the public URL
90
+ (`<emdash:site_url><route>`). Drafts surface their status
91
+ (`draft`, `scheduled`, etc.) inline so editorial state is visible
92
+ at a glance.
93
+ - **`adminEntry` field** on the configured-mode plugin descriptor.
94
+ Points at `@aeptus/aexeo-emdash/admin`, which exports `pages`
95
+ registering the `<Findings/>` React component for `/findings`.
96
+ emdash's `usePluginPage` hook picks this up and renders the
97
+ React component in place of the Block Kit fallback.
98
+ - **Two new HTTP routes** the React component consumes:
99
+ - `POST /_emdash/api/plugins/aexeo-seogeo/data` — read current
100
+ findings + per-route metadata + computed URLs (no
101
+ re-evaluation).
102
+ - `POST /_emdash/api/plugins/aexeo-seogeo/refresh` — sweep the
103
+ configured collections, write findings to KV, return the same
104
+ payload as `/data` plus a refresh summary.
105
+ Both routes return JSON in the shape exported as `FindingsPayload`
106
+ from `dist/data-route.d.ts`. The shape is the wire contract
107
+ between plugin and admin component and is intentionally
108
+ additive — fields will be appended in future versions, never
109
+ renamed or removed.
110
+ - `react` declared as an optional peer dependency
111
+ (`^18.0.0 || ^19.0.0`). Optional because plugins that don't use
112
+ the React findings page (e.g. ones that override `adminEntry`)
113
+ don't need it; emdash hosts that DO render adminEntry components
114
+ always have React installed already.
115
+
116
+ ### Changed
117
+
118
+ - `documentKey(route)` KV entries now store
119
+ `{ document, meta: { id, collection, status, slug, title } }`
120
+ instead of the bare `EmdashDocument`. The new metadata is what
121
+ the React component reads to construct edit / public URLs without
122
+ an extra DB round-trip per row. Pre-0.2.0 entries are
123
+ backwards-compatible — `readAllStoredDocuments` synthesizes a
124
+ minimal meta blob for legacy entries so a single corrupted-shape
125
+ row doesn't break the page.
126
+
9
127
  ## [0.1.2] - 2026-04-28
10
128
 
11
129
  Functional patch. Three bugs flagged by the aeptus web team after
@@ -100,7 +218,9 @@ First public release.
100
218
  `astro.config.mjs` for the WASM import to resolve to a
101
219
  precompiled `WebAssembly.Module`. Not optional.
102
220
 
103
- [Unreleased]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.1.2...HEAD
221
+ [Unreleased]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.3.0...HEAD
222
+ [0.3.0]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.2.0...aexeo-emdash-v0.3.0
223
+ [0.2.0]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.1.2...aexeo-emdash-v0.2.0
104
224
  [0.1.2]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.1.1...aexeo-emdash-v0.1.2
105
225
  [0.1.1]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.1.0...aexeo-emdash-v0.1.1
106
226
  [0.1.0]: https://github.com/schiste/Aexeo/releases/tag/aexeo-emdash-v0.1.0
package/dist/adapter.d.ts CHANGED
@@ -12,5 +12,17 @@ export interface EmdashContentItem {
12
12
  canonical?: string | null;
13
13
  };
14
14
  }
15
+ export interface EmdashContentMeta {
16
+ id: string;
17
+ collection: string;
18
+ slug: string | null;
19
+ status: string;
20
+ title: string;
21
+ }
22
+ export interface AdaptedContent {
23
+ document: EmdashDocument;
24
+ meta: EmdashContentMeta;
25
+ }
15
26
  export declare function contentItemToEmdashDocument(content: EmdashContentItem): EmdashDocument;
27
+ export declare function adaptContentItem(content: EmdashContentItem): AdaptedContent;
16
28
  //# 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;AAmBpE,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,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,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,iBAAiB,GACzB,cAAc,CAyBhB"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAqB,MAAM,YAAY,CAAC;AAmBpE,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,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;AAOD,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;IAIf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,cAAc,CAAC;IACzB,IAAI,EAAE,iBAAiB,CAAC;CACzB;AAED,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,iBAAiB,GACzB,cAAc,CAEhB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,cAAc,CAkC3E"}
@@ -0,0 +1,3 @@
1
+ import * as React from "react";
2
+ export declare function Facts(): React.JSX.Element;
3
+ //# sourceMappingURL=Facts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Facts.d.ts","sourceRoot":"","sources":["../../src/admin/Facts.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAsC/B,wBAAgB,KAAK,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAyLzC"}
@@ -0,0 +1,3 @@
1
+ import * as React from "react";
2
+ export declare function Findings(): React.JSX.Element;
3
+ //# sourceMappingURL=Findings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Findings.d.ts","sourceRoot":"","sources":["../../src/admin/Findings.tsx"],"names":[],"mappings":"AA2BA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAa/B,wBAAgB,QAAQ,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CA2L5C"}
@@ -0,0 +1,7 @@
1
+ import { Facts } from "./admin/Facts.js";
2
+ import { Findings } from "./admin/Findings.js";
3
+ export declare const pages: {
4
+ "/findings": typeof Findings;
5
+ "/facts": typeof Facts;
6
+ };
7
+ //# sourceMappingURL=admin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../src/admin.tsx"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,eAAO,MAAM,KAAK;;;CAMjB,CAAC"}