@adia-ai/adia-ui-forge 0.8.63 → 0.8.65

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "adia-ui-kit-forge",
3
- "version": "0.8.63",
3
+ "version": "0.8.65",
4
4
  "description": "Maintain the adia-ui (@adia-ai) framework itself, author primitives and shells, run the A2UI generation pipeline and its corpus, review gen-UI quality, sweep QA, cut releases, deploy. The maintainer counterpart to adia-ui-kit-factory (the consumer/app-author plugin).",
5
5
  "author": {
6
6
  "name": "Kim",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "adia-ui-kit-forge",
3
- "version": "0.8.63",
3
+ "version": "0.8.65",
4
4
  "description": "Maintain the adia-ui (@adia-ai) framework itself, author primitives and shells, run the A2UI generation pipeline and its corpus, review gen-UI quality, sweep QA, cut releases, deploy. The maintainer counterpart to adia-ui-kit-factory (the consumer/app-author plugin).",
5
5
  "author": {
6
6
  "name": "Kim",
package/CHANGELOG.md CHANGED
@@ -1,5 +1,33 @@
1
1
  # Changelog, adia-ui-kit-forge
2
2
 
3
+ ## [0.8.65] — 2026-09-14
4
+
5
+ ### Docs
6
+
7
+ - docs: ssr-compatibility skill marks PR #1756 (gh#1678, table-ui adopt-or-diff render path) as merged 2026-08-20 instead of pending, across SKILL.md, status-ledger.md, and failure-shapes.md (#4503)
8
+
9
+ ### Maintenance
10
+ - **`.claude-plugin/plugin.json` version bump**: moves in lockstep with package.json (the `/plugin update` cache key).
11
+ - **`.codex-plugin/` touched in this release window** (1 file(s), e.g. `.codex-plugin/plugin.json`): carried by the entries above.
12
+ - **`skills/` touched in this release window** (3 file(s), e.g. `ssr-compatibility/SKILL.md`): carried by the entries above.
13
+
14
+ ## [0.8.64] — 2026-09-13
15
+
16
+ ### Changed
17
+
18
+ - chore: allowlist 6 verified real script/prose G8 names, per-plugin `.release-gate-g8-allow.json` (ticket 10036) (#4405)
19
+ - chore: de-reference the phantom `component-token-audit` citation in component-md-authoring's description (ticket 10036) (#4409)
20
+
21
+ ### Docs
22
+
23
+ - docs: clarify tools/delegate_tool.py is a path inside the external Hermes Agent install, not this repo (#4411)
24
+ - docs: file ticket 10042 and rename the retired /gen-review name to /gen-ui-review in 3 routing surfaces; close ticket 10036 with its full disposition table (#4417)
25
+
26
+ ### Maintenance
27
+ - **`.claude-plugin/plugin.json` version bump**: moves in lockstep with package.json (the `/plugin update` cache key).
28
+ - **`.codex-plugin/` touched in this release window** (1 file(s), e.g. `.codex-plugin/plugin.json`): carried by the entries above.
29
+ - **`skills/` touched in this release window** (4 file(s), e.g. `component-md-authoring/SKILL.md`): carried by the entries above.
30
+
3
31
  ## [0.8.63] — 2026-09-12
4
32
 
5
33
  ### Changed
package/__init__.py CHANGED
@@ -14,7 +14,7 @@ def register(ctx):
14
14
  ctx.register_skill(
15
15
  name="component-md-authoring",
16
16
  path=Path(os.path.join(_HERE, "skills", "component-md-authoring", "SKILL.md")),
17
- description="Author the two judgment sections of a component's `component.md`, Screen-reader spec and Behavioral spec, and keep it PR-fresh. Use when a component's states, composed children, aria behavior, or error/empty/ loading handling changes and it already has (or should grow) a `component.md`, or when asked to \"add component.md for X\" / \"write the screen-reader spec for X\" / \"why is check:component-md-fresh warning\". NOT the yaml prop/slot/event/token contract itself (primitive-authoring owns that, this skill only owns the two authored yaml fields, `screenReader`/`behavioral`, plus the optional `intent` field); NOT gen-ui corpus/retrieval wiring (a2ui-maintenance); NOT a component's CSS token audit (component-token-audit).",
17
+ description="Author the two judgment sections of a component's `component.md`, Screen-reader spec and Behavioral spec, and keep it PR-fresh. Use when a component's states, composed children, aria behavior, or error/empty/ loading handling changes and it already has (or should grow) a `component.md`, or when asked to \"add component.md for X\" / \"write the screen-reader spec for X\" / \"why is check:component-md-fresh warning\". NOT the yaml prop/slot/event/token contract itself (primitive-authoring owns that, this skill only owns the two authored yaml fields, `screenReader`/`behavioral`, plus the optional `intent` field); NOT gen-ui corpus/retrieval wiring (a2ui-maintenance); NOT a component's CSS token audit (a capability referenced from adia-ui-factory's theme-audit skill, not yet a shipped skill here, ticket 10036).",
18
18
  )
19
19
  ctx.register_skill(
20
20
  name="cross-harness-authoring-standards",
@@ -34,7 +34,7 @@ def register(ctx):
34
34
  ctx.register_skill(
35
35
  name="gen-ui-review",
36
36
  path=Path(os.path.join(_HERE, "skills", "gen-ui-review", "SKILL.md")),
37
- description="Closed-loop Gen UI gallery quality review, per cycle: derive ideal specs, decompose the rendered canvas, score the gap, root-cause, emit fix plans until every prompt clears the exit gate. Use for /gen-review, \"score the gallery\", \"review gen-ui outputs\". NOT for corpus fixes (a2ui-maintenance), primitive authoring (primitive-authoring), or a hand-authored demo/app-shell QA sweep (demo-audit).",
37
+ description="Closed-loop Gen UI gallery quality review, per cycle: derive ideal specs, decompose the rendered canvas, score the gap, root-cause, emit fix plans until every prompt clears the exit gate. Use for /gen-ui-review, \"score the gallery\", \"review gen-ui outputs\". NOT for corpus fixes (a2ui-maintenance), primitive authoring (primitive-authoring), or a hand-authored demo/app-shell QA sweep (demo-audit).",
38
38
  )
39
39
  ctx.register_skill(
40
40
  name="llm-client-maintenance",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adia-ai/adia-ui-forge",
3
- "version": "0.8.63",
3
+ "version": "0.8.65",
4
4
  "description": "Maintain the adia-ui (@adia-ai) framework itself — author primitives and shells, run the A2UI generation pipeline and its corpus, review gen-UI quality, sweep QA, cut releases, deploy. The maintainer counterpart to adia-factory (the consumer/app-author plugin).",
5
5
  "keywords": [
6
6
  "adia-ui",
package/plugin.yaml CHANGED
@@ -1,4 +1,4 @@
1
1
  name: "adia-ui-kit-forge"
2
- version: "0.8.63"
2
+ version: "0.8.65"
3
3
  description: "Maintain the adia-ui (@adia-ai) framework itself, author primitives and shells, run the A2UI generation pipeline and its corpus, review gen-UI quality, sweep QA, cut releases, deploy. The maintainer counterpart to adia-ui-kit-factory (the consumer/app-author plugin)."
4
4
  manifest_version: 1
@@ -10,7 +10,8 @@ description: >-
10
10
  that, this skill only owns the two authored yaml fields,
11
11
  `screenReader`/`behavioral`, plus the optional `intent` field); NOT gen-ui
12
12
  corpus/retrieval wiring (a2ui-maintenance); NOT a component's CSS token
13
- audit (component-token-audit).
13
+ audit (a capability referenced from adia-ui-factory's theme-audit skill,
14
+ not yet a shipped skill here, ticket 10036).
14
15
  disable-model-invocation: false
15
16
  user-invocable: true
16
17
  ---
@@ -97,7 +97,9 @@ how `ui-architect`'s Pi and Hermes adapters were actually built (PR #2000):
97
97
  file, took a real screenshot, and returned a clean `VerifyProof`.
98
98
  - **Hermes** was verified sufficient by reading the installed Hermes
99
99
  Agent's own source, `PluginContext.register_command` + `dispatch_tool`,
100
- and `tools/delegate_tool.py`'s `delegate_task(goal, context, role, ...)`, confirmed as real, current APIs before the generator surgery (Rule 3)
100
+ and, inside that same external Hermes Agent install (not a path in this
101
+ repo), `tools/delegate_tool.py`'s `delegate_task(goal, context, role, ...)`,
102
+ confirmed as real, current APIs before the generator surgery (Rule 3)
101
103
  was written against them. The generated command was built behind its own
102
104
  `--selftest` fixture (a real `py_compile` check plus a fake `delegate_task`
103
105
  double driving the actual generated logic against the real linters)
@@ -3,7 +3,7 @@ name: gen-ui-review
3
3
  description: >-
4
4
  Closed-loop Gen UI gallery quality review, per cycle: derive ideal specs,
5
5
  decompose the rendered canvas, score the gap, root-cause, emit fix plans
6
- until every prompt clears the exit gate. Use for /gen-review, "score the
6
+ until every prompt clears the exit gate. Use for /gen-ui-review, "score the
7
7
  gallery", "review gen-ui outputs". NOT for corpus fixes (a2ui-maintenance),
8
8
  primitive authoring (primitive-authoring), or a hand-authored demo/app-shell
9
9
  QA sweep (demo-audit).
@@ -3,7 +3,7 @@
3
3
  "note": "Trigger-routing suite (gh#369). expect=trigger: the skill should fire on the prompt in a fresh session. expect=no-trigger: a near-miss owned elsewhere (owner named per case) or generic knowledge with no AdiaUI skill involved. Cases derived from evals/routing-corpus.json's phrases array (gh#355 vetted corpus) plus the SKILL.md description's own trigger/NOT-fence language.",
4
4
  "cases": [
5
5
  { "id": "t01", "prompt": "Score the gen-ui gallery outputs against the rubric", "expect": "trigger" },
6
- { "id": "t02", "prompt": "Run a /gen-review cycle over the gallery", "expect": "trigger" },
6
+ { "id": "t02", "prompt": "Run a /gen-ui-review cycle over the gallery", "expect": "trigger" },
7
7
  { "id": "t03", "prompt": "Decompose the rendered canvas and score the gap against the ideal composition", "expect": "trigger" },
8
8
  { "id": "t04", "prompt": "Check for overflow elements in the generated screens", "expect": "trigger" },
9
9
  { "id": "t05", "prompt": "Root-cause why this gen-ui prompt's render score is low", "expect": "trigger" },
@@ -36,7 +36,7 @@ this" and "what's the state of each shape's fix", it never carries the fix itsel
36
36
  2b. **Custom-element upgrade doesn't replay `attributeChangedCallback` for pre-existing attributes → reflected properties stuck at class default.** The REAL mechanism behind gh#284's symptom. **Fixed 2026-07-18** (PR #309).
37
37
  3. **A connect-time layout measurement is treated as confirmed, not unknown.** **Fixed for one component** (gh#286); the general pattern is unswept.
38
38
  4. **Property-only components can't seed initial state from SSR HTML** (gh#288), a feature gap, **CLOSED 2026-07-18** (table-ui's `data="[…]"` attribute).
39
- 5. **A custom `render()`/`connected()` unconditionally rebuilds a subtree that already matches**, no value-diff, no adopt-existing-DOM path, so a byte-identical server-rendered subtree gets torn down at upgrade. **Implemented for table-ui in open PR #1756** (gh#1678), pending merge, not yet fixed/shipped; not swept framework-wide (no static audit for it).
39
+ 5. **A custom `render()`/`connected()` unconditionally rebuilds a subtree that already matches**, no value-diff, no adopt-existing-DOM path, so a byte-identical server-rendered subtree gets torn down at upgrade. **Fixed for table-ui** (PR #1756, gh#1678, merged 2026-08-20); not swept framework-wide (no static audit for it).
40
40
  6. **The conditional-inject class** (`querySelector`-guard-before-`innerHTML`, `search-ui`/`pagination-ui`), decision recorded: SSR-safe when the guard target is structurally specific; post-adopt attribute writes still need shape 5's idempotent-write guard, **not yet applied** to either component (gh#1678's follow-up).
41
41
 
42
42
  Full symptom → root-cause → status detail, cited to the actual shipped/open
@@ -53,7 +53,7 @@ code: [failure-shapes.md](references/failure-shapes.md).
53
53
  | "how do I test / prove an SSR gap or fix" | [`test-without-linkedom.md`](references/test-without-linkedom.md), run the linkedom shim gate first (`node scripts/dev/ssr-linkedom-smoke.mjs`, the consumer's exact global surface), then the unit-level delete/try/finally pattern and what it does NOT prove |
54
54
  | "what's the consumer's current workaround, and can they drop it yet" | [`consumer-workarounds.md`](references/consumer-workarounds.md) |
55
55
  | "table/chart/select renders empty in the SSR response" | [`failure-shapes.md`](references/failure-shapes.md) §4, shape 4, CLOSED (table-ui's `data="[…]"` attribute); check whether the reporting component is registered server-side first if it still reproduces |
56
- | "a byte-identical SSR subtree gets rebuilt/mutated at upgrade, role/tabindex/cells added that weren't in the SSR HTML" | [`failure-shapes.md`](references/failure-shapes.md) §5, shape 5, implemented for table-ui in open PR #1756 (gh#1678), pending merge; the adopt-or-diff pattern to copy for a NEW instance is [`guard-patterns.md`](references/guard-patterns.md) §4, `Node.isEqualNode()` for a positional child, a seeded keyed-reconcile map for a flat list, `setAttrIfChanged()` for a plain attribute write, and §4.1 for why a renderer-owned candidate (one that can attach a listener) must never be adopted on structural equality alone |
56
+ | "a byte-identical SSR subtree gets rebuilt/mutated at upgrade, role/tabindex/cells added that weren't in the SSR HTML" | [`failure-shapes.md`](references/failure-shapes.md) §5, shape 5, fixed for table-ui (PR #1756, gh#1678, merged 2026-08-20); the adopt-or-diff pattern to copy for a NEW instance is [`guard-patterns.md`](references/guard-patterns.md) §4, `Node.isEqualNode()` for a positional child, a seeded keyed-reconcile map for a flat list, `setAttrIfChanged()` for a plain attribute write, and §4.1 for why a renderer-owned candidate (one that can attach a listener) must never be adopted on structural equality alone |
57
57
  | "is this querySelector-guard-before-innerHTML component (search-ui/pagination-ui shape) SSR-safe" | [`failure-shapes.md`](references/failure-shapes.md) §6, decision recorded: yes, when the guard target is structurally specific; post-adopt attribute writes are a separate, NOT-yet-closed gap (same file, same section) |
58
58
 
59
59
  ## Deviation doctrine
@@ -235,8 +235,7 @@ values never actually change.
235
235
  (rows, cells, header), every position gets a fresh node and a
236
236
  `replaceChild()`, whether or not the existing one is already correct.
237
237
 
238
- **Status: implemented for `table-ui` in open PR #1756 (gh#1678), pending
239
- merge, not yet fixed/shipped.** `table.class.js`
238
+ **Status: fixed for `table-ui`** (PR #1756, gh#1678, merged 2026-08-20). `table.class.js`
240
239
  `render()`/`connected()`: a module-level `adoptOrDiffChildren()` helper
241
240
  compares each freshly-computed cell against its existing DOM position via
242
241
  `Node.isEqualNode()`, standard DOM, present under linkedom, happy-dom, and
@@ -26,7 +26,7 @@ the territory: the territory is `gh issue list` / `gh issue view`.
26
26
  | [#284](https://github.com/adiahealth/gen-ui-kit/issues/284) | §2, destructive `stamp()` on connect | **CLOSED 2026-07-18, narrowed AND separately fixed** | `scripts/dev/audit-template-child-conflict.mjs` (PR #295) + `packages/web-components/core/element.js` connectedCallback resync (PR #309) | Two distinct findings. (1) The ORIGINAL diagnosis (destructive `stamp()`) was narrowed 2026-07-17: every component the issue names has `static template = () => null`, so `stamp()` never runs for them, zero shipped components exposed; a static audit gate catches a future regression instead of a lifecycle rewrite. (2) A SEPARATE, real, live bug was found in the same investigation area and fixed 2026-07-18: happy-dom/linkedom don't replay `attributeChangedCallback` for attributes already present at custom-element upgrade (spec §4.13.5 step 6), any `reflect: true` property seeded only from pre-parsed/SSR HTML stayed at its class default after upgrade (e.g. `<nav-item-ui text="Profile">` rendered with an empty label). `connectedCallback` now re-syncs every declared property from its live attribute before `connected()` runs. See `failure-shapes.md` §2 for the full narrative. |
27
27
  | [#288](https://github.com/adiahealth/gen-ui-kit/issues/288) | §4, property-only components can't seed from SSR HTML | **CLOSED 2026-07-18** | `table.class.js` `data="[…]"` attribute hydration | Never actually blocked on #284 (table-ui/chart-ui/select-ui all use `static template = () => null`, so the stamp() question never applied). Scope was narrower than filed: `select-ui` already parsed declarative `<option>` children, `chart-ui` already hydrated `.data` from a `data="[…]"` attribute, only `table-ui`'s `.data` had no declarative form. Fixed in the same attribute-hydration shape as chart-ui, not the JSON-script-child form originally proposed. |
28
28
  | [#287](https://github.com/adiahealth/gen-ui-kit/issues/287) | Unrelated to the three SSR shapes above, a Phosphor-icon `import.meta.glob` path failure under workspace hoisting, plus the dep-optimizer silently emptying the icon registry | **CLOSED** | PR #294 (merged 2026-07-17) | Root cause confirmed empirically (a from-scratch pnpm workspace repro): the glob's leading `/` joined to Vite's configured root, which only reaches a transitive dependency's assets when hoisted there. Fixed by switching to an entry-file-relative glob (`../node_modules/...`). A second, independent cause (Vite's dev-server `optimizeDeps` pre-bundling) has no package-side fix, documented as a consumer `optimizeDeps.exclude` workaround. A bundler/workspace-resolution bug, not an SSR-lifecycle bug, still doesn't route through this pack's failure taxonomy. |
29
- | [#1678](https://github.com/adiahealth/gen-ui-kit/issues/1678) | §5 (new), a custom `render()`/`connected()` unconditionally rebuilds a subtree that already matches; §5.1 (new), `isEqualNode()` proves structural safety only, never runtime-state safety (a renderer-owned listener can be silently dropped on adoption, CodeRabbit finding, closed in the same PR); §6 (new), the conditional-inject class, decision recorded | **PR #1756 opened 2026-08-20 (branch `1678-table-ssr-adopt-or-diff`), NOT yet merged, human review required before landing (core table-ui render path)** | `table.class.js` `adoptOrDiffChildren()` + `RENDERER_OWNED` + `setAttrIfChanged()`/`removeAttrIfPresent()`; `cell-types.js`'s `attachesListeners: true` on `actions` | §5/§5.1 implemented for table-ui only, pending merge, no framework-wide static audit exists for this shape yet. §6's decision: querySelector-guard-before-innerHTML (`search-ui`, `pagination-ui`) is SSR-safe when the guard target is structurally specific; [#1755](https://github.com/adiahealth/gen-ui-kit/issues/1755) (filed alongside this PR, already merged) extends the idempotent-write guard to those two components' own post-adopt attribute writes, scoped OUT of this PR. |
29
+ | [#1678](https://github.com/adiahealth/gen-ui-kit/issues/1678) | §5 (new), a custom `render()`/`connected()` unconditionally rebuilds a subtree that already matches; §5.1 (new), `isEqualNode()` proves structural safety only, never runtime-state safety (a renderer-owned listener can be silently dropped on adoption, CodeRabbit finding, closed in the same PR); §6 (new), the conditional-inject class, decision recorded | **MERGED 2026-08-20** (PR #1756, branch `1678-table-ssr-adopt-or-diff`, core table-ui render path) | `table.class.js` `adoptOrDiffChildren()` + `RENDERER_OWNED` + `setAttrIfChanged()`/`removeAttrIfPresent()`; `cell-types.js`'s `attachesListeners: true` on `actions` | §5/§5.1 fixed for table-ui only, no framework-wide static audit exists for this shape yet. §6's decision: querySelector-guard-before-innerHTML (`search-ui`, `pagination-ui`) is SSR-safe when the guard target is structurally specific; [#1755](https://github.com/adiahealth/gen-ui-kit/issues/1755) (filed alongside this PR, already merged) extends the idempotent-write guard to those two components' own post-adopt attribute writes, scoped OUT of this PR. |
30
30
 
31
31
  ## What "done" looks like for the open items
32
32