@adia-ai/a2ui-mcp 0.7.18 → 0.7.20
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 +10 -0
- package/package.json +1 -1
- package/scripts/test-chunks.mjs +18 -12
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# Changelog — @adia-ai/a2ui-mcp
|
|
2
2
|
|
|
3
|
+
## [0.7.20] — 2026-06-10
|
|
4
|
+
|
|
5
|
+
### Maintenance
|
|
6
|
+
- **Lockstep version bump only.** No source changes in this package; bumped to maintain the 9-package version coherence enforced by `scripts/release/check-lockstep.mjs`. Substantive v0.7.20 work shipped in gen-UI form-quality arc (anti-pattern rules + field-ui hardening + validation fold-in) + static-site corpus retrieval (tri-mode loaders) + corpus 308->356. See `packages/web-components/CHANGELOG.md#0720--2026-06-10` for details.
|
|
7
|
+
|
|
8
|
+
## [0.7.19] — 2026-06-10
|
|
9
|
+
|
|
10
|
+
### Maintenance
|
|
11
|
+
- **Lockstep version bump only.** No source changes in this package; bumped to maintain the 9-package version coherence enforced by `scripts/release/check-lockstep.mjs`. Substantive v0.7.19 work shipped in icon-ui standalone-import paint fix + late-connect retry (web-components); full 308-chunk embedding vectors (a2ui-corpus). See `packages/web-components/CHANGELOG.md#0719--2026-06-10` for details.
|
|
12
|
+
|
|
3
13
|
## [0.7.18] — 2026-06-09
|
|
4
14
|
|
|
5
15
|
### Maintenance
|
package/package.json
CHANGED
package/scripts/test-chunks.mjs
CHANGED
|
@@ -30,8 +30,11 @@ console.log('── chunk-library smoke ──');
|
|
|
30
30
|
|
|
31
31
|
const idx = getChunkIndex();
|
|
32
32
|
assert('index loaded', idx && idx.unique_names > 0, idx ? `got ${idx.unique_names}` : 'no index');
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
// Preserve-not-regress floor (re-based 2026-06-10: corpus = 339 unique / 488
|
|
34
|
+
// instances after regrowth batches 1-3; the old >=700/800 was the retired
|
|
35
|
+
// pre-§72 composition-era count and never matched the chunks-only corpus).
|
|
36
|
+
assert('expected counts', idx && idx.unique_names >= 330 && idx.total_instances >= 470,
|
|
37
|
+
idx ? `${idx.unique_names} unique / ${idx.total_instances} instances (need ≥330/470)` : 'no index');
|
|
35
38
|
assert('by_kind covers block + panel + page', idx && idx.by_kind.block && idx.by_kind.panel && idx.by_kind.page,
|
|
36
39
|
idx ? JSON.stringify(idx.by_kind) : 'no index');
|
|
37
40
|
|
|
@@ -43,8 +46,8 @@ assert('record has primary=card-ui', signin && signin.primary === 'card-ui',
|
|
|
43
46
|
signin ? `got primary=${signin.primary}` : '');
|
|
44
47
|
assert('record HTML is non-empty', signin && typeof signin.html === 'string' && signin.html.length > 100);
|
|
45
48
|
|
|
46
|
-
const kpi = getChunk('dashboard-
|
|
47
|
-
assert('get_chunk(dashboard-
|
|
49
|
+
const kpi = getChunk('dashboard-audience-kpis');
|
|
50
|
+
assert('get_chunk(dashboard-audience-kpis) returns record', kpi && kpi.name === 'dashboard-audience-kpis');
|
|
48
51
|
assert('kpi primary=grid-ui', kpi && kpi.primary === 'grid-ui',
|
|
49
52
|
kpi ? `got primary=${kpi.primary}` : '');
|
|
50
53
|
|
|
@@ -78,7 +81,7 @@ assert('search_chunks(auth signin) finds auth-signin-card-email',
|
|
|
78
81
|
auth.some((r) => r.name === 'auth-signin-card-email'));
|
|
79
82
|
|
|
80
83
|
const code = searchChunks('code language');
|
|
81
|
-
assert('search_chunks(code language) finds code-
|
|
84
|
+
assert('search_chunks(code language) finds code-snippet', code.some((r) => r.name === 'code-snippet'));
|
|
82
85
|
|
|
83
86
|
console.log('\n── lookup_chunk ──');
|
|
84
87
|
|
|
@@ -89,9 +92,9 @@ assert('all card-ui chunks have primary=card-ui', cardChunks.every((c) => c.prim
|
|
|
89
92
|
const drawerChunks = lookupChunksByPrimary('drawer-ui');
|
|
90
93
|
assert('lookup_chunk(drawer-ui) returns ≥10', drawerChunks.length >= 10, `got ${drawerChunks.length}`);
|
|
91
94
|
|
|
92
|
-
const
|
|
93
|
-
assert('lookup_chunk(
|
|
94
|
-
|
|
95
|
+
const adminPageChunks = lookupChunksByPrimary('admin-page');
|
|
96
|
+
assert('lookup_chunk(admin-page) finds dashboard-admin-page',
|
|
97
|
+
adminPageChunks.some((c) => c.name === 'dashboard-admin-page'));
|
|
95
98
|
|
|
96
99
|
// ── chunk-composer + chunk-synthesizer ──
|
|
97
100
|
import { composeFromPlan, validatePlan } from '../../compose/strategies/zettel/chunk-composer.js';
|
|
@@ -132,7 +135,7 @@ console.log('\n── composeFromPlan ──');
|
|
|
132
135
|
const composed = composeFromPlan(goodPlan);
|
|
133
136
|
assert('composeFromPlan returns html', composed.html && composed.html.length > 1000,
|
|
134
137
|
composed.html ? `len=${composed.html.length}` : 'null');
|
|
135
|
-
assert('composed html includes admin-page wrapper', composed.html && composed.html.includes('
|
|
138
|
+
assert('composed html includes admin-page wrapper', composed.html && composed.html.includes('<admin-page'));
|
|
136
139
|
assert('composed html injects funnel content',
|
|
137
140
|
composed.html && composed.html.includes('Conversion funnel'),
|
|
138
141
|
composed.html ? 'no funnel text found' : 'no html');
|
|
@@ -142,15 +145,18 @@ console.log('\n── composeFromIntent (retrieval-first, no LLM) ──');
|
|
|
142
145
|
// Use a stub adapter — synthesis path shouldn't be hit when retrieval matches
|
|
143
146
|
const stubLLM = { complete: async () => ({ content: '{"page":"dashboard-admin-page","slot_bindings":{"page-content":["dashboard-funnel"]}}' }) };
|
|
144
147
|
|
|
145
|
-
const direct = await composeFromIntent({ intent: 'dashboard-
|
|
148
|
+
const direct = await composeFromIntent({ intent: 'dashboard-audience-kpis', llmAdapter: stubLLM });
|
|
146
149
|
assert('retrieval direct hit returns html', direct.html && direct.html.length > 50,
|
|
147
150
|
direct.warnings?.join('; '));
|
|
148
151
|
assert('retrieval source labeled correctly', direct.source === 'retrieval',
|
|
149
152
|
`got ${direct.source}`);
|
|
150
153
|
|
|
151
154
|
const synthesized = await composeFromIntent({ intent: 'admin dashboard with KPIs', llmAdapter: stubLLM });
|
|
152
|
-
|
|
153
|
-
|
|
155
|
+
// Corpus regrowth means this intent often RETRIEVES directly now (the original
|
|
156
|
+
// 'retrieval is weak' premise no longer holds) — both paths are valid; assert
|
|
157
|
+
// usable html either way.
|
|
158
|
+
assert('composeFromIntent produces html (retrieval or synthesis)',
|
|
159
|
+
synthesized.html && synthesized.html.length > 300,
|
|
154
160
|
synthesized.warnings?.join('; ') || 'no html');
|
|
155
161
|
// Source could be either retrieval or synthesis depending on score — both are
|
|
156
162
|
// acceptable as long as we got HTML out.
|