@adia-ai/adia-ui-factory 0.8.55 → 0.8.57

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 (60) hide show
  1. package/.claude-plugin/plugin.json +3 -2
  2. package/.codex-plugin/plugin.json +1 -1
  3. package/.mcp.json +1 -1
  4. package/CHANGELOG.md +33 -0
  5. package/README.md +19 -3
  6. package/__init__.py +6 -1
  7. package/agents/surface-qa-agent.md +2 -1
  8. package/commands/app-audit.md +4 -2
  9. package/commands/app-migration.md +1 -1
  10. package/commands/app-planning.md +3 -2
  11. package/commands/find-unused.md +3 -3
  12. package/commands/gen-ui-wiring.md +1 -1
  13. package/commands/project-scaffolding.md +3 -2
  14. package/commands/surface-qa.md +1 -1
  15. package/commands/theme-audit.md +28 -0
  16. package/hermes-mcp.yaml +1 -1
  17. package/package.json +4 -1
  18. package/plugin.yaml +1 -1
  19. package/prompts/app-audit.md +4 -2
  20. package/prompts/app-migration.md +1 -1
  21. package/prompts/app-planning.md +3 -2
  22. package/prompts/find-unused.md +3 -3
  23. package/prompts/gen-ui-wiring.md +1 -1
  24. package/prompts/project-scaffolding.md +3 -2
  25. package/prompts/surface-qa.md +1 -1
  26. package/prompts/theme-audit.md +25 -0
  27. package/references/authoring-components.md +1 -1
  28. package/references/composed-surface-rubric.md +1 -1
  29. package/references/shell-admin.md +1 -1
  30. package/scripts/adia-lint.mjs +193 -0
  31. package/scripts/adia-probe.mjs +89 -13
  32. package/scripts/adia-theme-audit.mjs +1637 -0
  33. package/scripts/lint-rules.generated.mjs +1700 -0
  34. package/scripts/theme-audit-fixtures/expected.json +16 -0
  35. package/scripts/theme-audit-fixtures/fixture-app/index.html +15 -0
  36. package/scripts/theme-audit-fixtures/fixture-app/sitemap.json +6 -0
  37. package/scripts/theme-audit-fixtures/fixture-theme.css +99 -0
  38. package/skills/app-audit/references/gap-classes.md +1 -1
  39. package/skills/app-migration/SKILL.md +1 -1
  40. package/skills/app-planning/SKILL.md +5 -1
  41. package/skills/find-unused/SKILL.md +4 -2
  42. package/skills/find-unused/references/recon-and-audits.md +3 -3
  43. package/skills/pattern-catalog/references/annotations.yaml +28 -0
  44. package/skills/pattern-catalog/references/pattern-index.md +80 -65
  45. package/skills/project-scaffolding/SKILL.md +6 -6
  46. package/skills/screen-composition/SKILL.md +6 -4
  47. package/skills/screen-composition/assets/figma-make/guidelines/components.md +5 -7
  48. package/skills/shell-selection/SKILL.md +1 -1
  49. package/skills/surface-qa/SKILL.md +1 -1
  50. package/skills/surface-qa/references/ci-recipe.md +2 -2
  51. package/skills/surface-qa/references/verification.md +4 -1
  52. package/skills/table-composition/references/base-table.md +1 -1
  53. package/skills/theme-audit/SKILL.md +129 -0
  54. package/skills/theme-audit/agents/openai.yaml +3 -0
  55. package/skills/theme-audit/evals/evals.json +20 -0
  56. package/skills/theme-audit/evals/routing-corpus.json +162 -0
  57. package/skills/theme-audit/references/report-shape.md +84 -0
  58. package/skills/token-selection/references/a-alias-layer.md +18 -1
  59. package/hooks/hooks.json +0 -15
  60. package/scripts/adia-lint +0 -411
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "adia-ui-kit-factory",
3
- "version": "0.8.55",
3
+ "version": "0.8.57",
4
4
  "description": "Author and verify apps built ON the adia-ui (@adia-ai) light-DOM web-component framework \u2014 orient, scaffold, compose, wire, verify, and migrate across SPA and SSR rendering modes. Wires the a2ui MCP for catalog retrieval, UI generation, and validation.",
5
5
  "author": {
6
6
  "name": "Kim",
@@ -15,5 +15,6 @@
15
15
  "web-components",
16
16
  "app-authoring",
17
17
  "consumer"
18
- ]
18
+ ],
19
+ "hooks": "./adapters/claude/hooks.json"
19
20
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "adia-ui-kit-factory",
3
- "version": "0.8.55",
3
+ "version": "0.8.57",
4
4
  "description": "Author and verify apps built ON the adia-ui (@adia-ai) light-DOM web-component framework — orient, scaffold, compose, wire, verify, and migrate across SPA and SSR rendering modes. Wires the a2ui MCP for catalog retrieval, UI generation, and validation.",
5
5
  "author": {
6
6
  "name": "Kim",
package/.mcp.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "mcpServers": {
3
3
  "adia-gen-ui": {
4
4
  "command": "npx",
5
- "args": ["-y", "@adia-ai/mcp@0.8.55", "gen-ui"]
5
+ "args": ["-y", "@adia-ai/mcp@0.8.57", "gen-ui"]
6
6
  }
7
7
  }
8
8
  }
package/CHANGELOG.md CHANGED
@@ -1,5 +1,38 @@
1
1
  # Changelog — adia-ui-kit-factory
2
2
 
3
+ ## [0.8.57] — 2026-09-01
4
+
5
+ ### Fixed
6
+ - **Plugin passes `author-cross-harness-plugins`'s cross-harness validator, modulo one documented, permanent, irreconcilable exception (gh#2668).** `${CLAUDE_PLUGIN_ROOT}`/`$ARGUMENTS`/the `` !`command` `` auto-injection syntax removed from shared `app-migration`, `theme-audit`, `screen-composition`, `project-scaffolding`, `app-planning`, `surface-qa`, and `find-unused` SKILL.md bodies, all eight `commands/*.md` bodies, and their linked reference docs (`surface-qa/references/verification.md`, `find-unused/references/recon-and-audits.md`) — portable `<plugin-root>` prose / "named in the current request" phrasing throughout; `screen-composition`/`app-planning`'s Claude-only auto-injected context block became an explicit "run this yourself" instruction, since Codex has no equivalent auto-injection surface. `hooks/hooks.json` moved to `adapters/claude/hooks.json` (unchanged, `${CLAUDE_PLUGIN_ROOT}`-based); new root `hooks.json` mirrors the same event/matcher/action signature with a monorepo-root-relative command path for Codex's convention-discovered hook surface — an unverified-but-honest fallback documented in `HARNESS-NOTES.md`. **The one exception:** every skill's `disable-model-invocation:`/`user-invocable:` frontmatter — required, explicitly, by this repo's own blocking `check:skills` gate (`plugin-estate-v2.md`'s species-pinning charter) — collides head-on with the validator's opposite requirement on the exact same file, and Codex is hard-pinned to read root `skills/` directly (no adapter escape). The repo's own charter is not weakened; `npm run check:cross-harness-plugins` (`scripts/verify/check-cross-harness-plugins.mjs`, wrapping the vendored `scripts/verify/vendor/validate_cross_harness.py`) treats only this one exact finding shape as accepted (logged as INFO) and still fails on every other portability class. Full reasoning in `HARNESS-NOTES.md`.
7
+
8
+ ### Docs
9
+ - **`skills/pattern-catalog/references/pattern-index.md` regenerated for `page-scroll`'s addition (gh#2639, ADR-0098 Fork 4).** `build:patterns-index`'s re-extraction picked up `admin-dashboard.contents.html`/`admin-shell.contents.html`'s tag-list changes under the page-chrome consolidation (`admin-page*` → `page-ui[band]`, `admin-scroll` → `page-scroll`).
10
+
11
+ ### Changed
12
+ - **`adia-lint` rewritten as a thin Node CLI (`adia-lint.mjs`) consuming a shared generated lint-rule bank, retiring the Python script (gh#2638, LLD-0016, ADR-0099).** The consumer-app structural checks (the forge-shared rules plus SSR-DOUBLE-ROUTER, SSR-TOPLEVEL-IMPORT, HARDCODED-OPEN, SHELL-NESTING, SHELL-RESIZE, LLM-KEY-IN-CLIENT, GENUI-UNVALIDATED, GENUI-DOC-CONFLICT) now live as individually-fixtured rule modules under `scripts/lint/rules/` in the repo root, built into `scripts/lint/generated/rule-bank.mjs` and vendored byte-identically into this plugin, `adia-ui-forge`, and the gen-ui MCP's factory vendor tree (`npm run build:lint-rules`, freshness gated by `npm run check:lint-rules-fresh`). `hooks/hooks.json`'s PostToolUse command changes from `python3 ".../adia-lint" --hook` to `node ".../adia-lint.mjs" --hook`; the CLI contract (including `-h`/`--help`), exit codes, and PostToolUse never-block invariant are unchanged. `npm run check:lint-rules-selftest` proves finding-parity against the retired script's own `selftest()` fixtures. The gen-ui MCP factory server's `lint` tool (`audit_structure`) now spawns the Node CLI directly instead of shelling through `python3`.
13
+
14
+ ### Maintenance
15
+ - **`.claude-plugin/plugin.json` version bump** — moves in lockstep with package.json (the `/plugin update` cache key).
16
+ - **`.codex-plugin/` touched in this release window** (1 file(s), e.g. `.codex-plugin/plugin.json`) — carried by the entries above.
17
+ - **`agents/` touched in this release window** (1 file(s), e.g. `agents/surface-qa-agent.md`) — carried by the entries above.
18
+ - **`prompts/` touched in this release window** (8 file(s), e.g. `prompts/app-audit.md`) — carried by the entries above.
19
+
20
+ ## [0.8.56] — 2026-08-31
21
+
22
+ ### Added
23
+ - **`theme-audit` skill, `/theme-audit` command, and `scripts/adia-theme-audit.mjs` runner (lld-0012 B1–B3, gh#2257).** Audits a consumer app's `theme.css` for the four redundancy classes (restated defaults, token re-derivations, dead selectors, hand-built components) across every sitemap route, with a Playwright class-1 toggle and route discovery (#2308, #2312, #2413). Fixtures under `scripts/theme-audit-fixtures/`; report shape in `skills/theme-audit/references/report-shape.md`; Codex/Pi/Hermes manifests derived (`skills/theme-audit/agents/openai.yaml`, `prompts/theme-audit.md`).
24
+ - **`HARNESS-NOTES.md`** pointer for non-Claude harnesses (gh#2449) — points at `AGENTS.md`/README rather than duplicating install prose.
25
+
26
+ ### Changed
27
+ - **`scripts/adia-probe.mjs`** gains the route-discovery + class-1 toggle hooks the theme-audit runner drives (#2413); `agents/surface-qa-agent.md` cites the extended probe.
28
+ - **`skills/token-selection/references/a-alias-layer.md`** documents the 15 new `--a-*` aliases from tokens batch C0 and the advisory reroute gate (gh#2240, #2243).
29
+ - **`skills/pattern-catalog/references/{pattern-index.md,annotations.yaml}`** pick up the sidebar-modal pattern (#2226) and the registration/NPI-search and errors surfaces (#2242, #2270); `skills/table-composition/references/base-table.md` follows `table-toolbar-ui`'s count-cluster redesign (#2190); `skills/find-unused/SKILL.md` wording tightened.
30
+
31
+ ### Maintenance
32
+ - **`.claude-plugin/plugin.json` version bump** — moves in lockstep with package.json (the `/plugin update` cache key).
33
+ - **`.codex-plugin/` touched in this release window** (1 file(s), e.g. `.codex-plugin/plugin.json`) — carried by the entries above.
34
+ - **`commands/` touched in this release window** (1 file(s), e.g. `commands/theme-audit.md`) — carried by the entries above.
35
+
3
36
  ## [0.8.55] — 2026-08-28
4
37
 
5
38
  ### Changed
package/README.md CHANGED
@@ -51,7 +51,7 @@ posture (ADR-0040) is about this plugin working standalone in any consumer
51
51
  repo once installed some other way (no monorepo path assumptions in its own
52
52
  scripts) — it does not add an npm-sourced marketplace entry.
53
53
 
54
- ## Skills (19 — `skills/` on disk is the roster; `check:plugin-count-claims` guards this header count)
54
+ ## Skills (20 — `skills/` on disk is the roster; `check:plugin-count-claims` guards this header count)
55
55
 
56
56
  | Skill | Species | Job |
57
57
  |---|---|---|
@@ -74,6 +74,7 @@ scripts) — it does not add an npm-sourced marketplace entry.
74
74
  | `app-migration` | procedural | version upgrades + port-to-adia sweeps (breaking changes) |
75
75
  | `find-unused` | procedural | what a *non*-breaking upgrade left unused — inert opt-in layers, stale workarounds |
76
76
  | `surface-qa` | procedural | browser + a11y + composition exit gate |
77
+ | `theme-audit` | procedural | classify a consumer theme.css against the framework's own defaults/tokens/primitives — restated defaults, re-derived tokens, dead selectors, hand-built component work; audit + report only, no rewrites (gh#2257) |
77
78
 
78
79
  ## Agents (4)
79
80
 
@@ -97,11 +98,20 @@ surface-qa-agent) · `component-model.md` · the `references/contracts/` twins.
97
98
 
98
99
  ## Commands
99
100
 
100
- `/project-scaffolding` · `/app-planning` · `/surface-qa` · `/app-migration` · `/find-unused` · `/gen-ui-wiring` · `/app-audit`
101
+ `/project-scaffolding` · `/app-planning` · `/surface-qa` · `/app-migration` · `/find-unused` · `/gen-ui-wiring` · `/app-audit` · `/theme-audit`
102
+
103
+ ## Scripts
104
+
105
+ Consumer-runnable checks shipped as plain Node scripts under `scripts/`, no
106
+ MCP server required: `adia-probe.mjs` (the browser-QA gate; see
107
+ `surface-qa`), `adia-preflight.mjs` (every CI-step prerequisite, each
108
+ failure named with its remedy), `adia-contract-check.mjs` (authored markup
109
+ attributes vs. the shipped component contracts), and `adia-theme-audit.mjs`
110
+ (the theme.css redundancy classifier; see `theme-audit`).
101
111
 
102
112
  ## MCP
103
113
 
104
- `adia-gen-ui` server pinned: `@adia-ai/mcp@0.8.55` (tool SoT:
114
+ `adia-gen-ui` server pinned: `@adia-ai/mcp@0.8.57` (tool SoT:
105
115
  `packages/gen-ui/mcp/TOOLS.md` — the `gen-ui` section; stability rule in
106
116
  `references/contracts/`; pin lives in `.mcp.json` — `check:plugin-count-claims`
107
117
  guards this README copy against it). The server is `adia-mcp gen-ui`,
@@ -120,6 +130,12 @@ plug-and-play install** — read this section before promising Pi/Hermes
120
130
  support for this plugin specifically, since its whole value proposition is
121
131
  wiring the `adia-gen-ui` MCP server.
122
132
 
133
+ `theme-audit`'s `adia-theme-audit` bin runs identically on every harness — a
134
+ plain Node script with no Claude-specific runtime dependency; the
135
+ `/theme-audit` command degrades to invoking the skill directly on Codex and
136
+ Hermes, and becomes a genuine `prompts/theme-audit.md` Pi command via
137
+ `build:harness-manifests`.
138
+
123
139
  - **Codex** (gh#1888): `.codex-plugin/plugin.json` + per-skill
124
140
  `agents/openai.yaml`, derived; `mcpServers` points at the same
125
141
  `.mcp.json` Claude Code uses. No manifest key for hooks/commands/agents —
package/__init__.py CHANGED
@@ -263,7 +263,7 @@ def register(ctx):
263
263
  ctx.register_skill(
264
264
  name="find-unused",
265
265
  path=Path(os.path.join(_HERE, "skills", "find-unused", "SKILL.md")),
266
- description="Finds what a non-breaking @adia-ai upgrade shipped that this app never picked up — the opt-in layers nothing imports, the local workarounds a fixed bug made redundant, retired enum values still sitting in stored state, and the fixes that never reached MIGRATION.md. Use after \"we bumped and nothing broke\", \"what are we missing from 0.8.x\", \"are we actually using what we ship\", \"why is [scale]/[theme] doing nothing\", or when a PATCH span needs adoption rather than repair. NOT for breaking-change repair (app-migration); NOT for a first-time install (adia-scaffold); NOT for diagnosing a broken surface (app-audit).",
266
+ description="Finds what a non-breaking @adia-ai upgrade shipped that this app never picked up — the opt-in layers nothing imports, the local workarounds a fixed bug made redundant, retired enum values still sitting in stored state, and the fixes that never reached MIGRATION.md. Use after \"we bumped and nothing broke\", \"what are we missing from 0.8.x\", \"are we actually using what we ship\", \"why is [scale]/[theme] doing nothing\", or when a PATCH span needs adoption rather than repair. NOT for breaking-change repair (app-migration); NOT for a first-time install (adia-scaffold); NOT for diagnosing a broken surface (app-audit); NOT for CSS-only redundancy in a theme file (theme-audit — the CSS-side sibling).",
267
267
  )
268
268
  ctx.register_skill(
269
269
  name="gen-ui-wiring",
@@ -310,6 +310,11 @@ def register(ctx):
310
310
  path=Path(os.path.join(_HERE, "skills", "table-composition", "SKILL.md")),
311
311
  description="Answers how to display/organize tabular data with table-ui: contained vs uncontained chrome, [raw] (consumer-owned body, a separate axis), opt-in striped rows, and resize/sort defaults that flip between JS .columns and declarative col-def forms, plus inline-edit-grid and tree/hierarchical-row patterns. Use for \"how do I show a table\", \"add sorting/filtering\", \"make this table striped\", \"columns aren't resizable\", \"card vs bare table\", \"editable/spreadsheet grid\", \"tree table / nested rows\", \"huge list of rows\". NOT for composing the surrounding screen (screen-composition), data wiring (data-wiring), OTHER non-table patterns (pattern-catalog), or 1000+-row virtualized lists (list-window-ui).",
312
312
  )
313
+ ctx.register_skill(
314
+ name="theme-audit",
315
+ path=Path(os.path.join(_HERE, "skills", "theme-audit", "SKILL.md")),
316
+ description="Classifies a consumer app's theme.css against what the adia-ui framework already ships — restated defaults, re-derived tokens, dead selectors, and hand-built component work. Runs `adia-theme-audit` against a theme file + app root; audits and reports, never rewrites. Use when a theme.css is suspected of restating the kit, after bumping `@adia-ai/web-components`, or before a `find-unused` sweep. NOT for rendering/grading a surface (surface-qa); NOT for picking a token going forward (token-selection); NOT for JS/markup an upgrade left unused (find-unused — the CSS-side sibling); NOT for the framework's OWN token layer in packages/web-components (forge's component-token-audit).",
317
+ )
313
318
  ctx.register_skill(
314
319
  name="token-selection",
315
320
  path=Path(os.path.join(_HERE, "skills", "token-selection", "SKILL.md")),
@@ -9,6 +9,7 @@ description: |
9
9
  tools: Read, Grep, Glob, Bash
10
10
  skills:
11
11
  - surface-qa
12
+ - theme-audit
12
13
  # Explicit pin (gh#618, tier corrected gh#1045): a review/critic seat's
13
14
  # verdict must not depend on the caller's model tier — never `inherit`.
14
15
  # Operator's explicit standing instruction for this seat family: sonnet + xhigh.
@@ -38,7 +39,7 @@ a surface can pass the browser gate and still be a keyword-driven premature
38
39
  render (D1) that never traced to a resolved plan. Every claim in the
39
40
  proof cites its evidence (the probe JSON, the screenshot path, the element
40
41
  inspected). The structure row's evidence comes from running
41
- `python3 "${CLAUDE_PLUGIN_ROOT}/scripts/adia-lint"` over the surface's files via
42
+ `node "${CLAUDE_PLUGIN_ROOT}/scripts/adia-lint.mjs"` over the surface's files via
42
43
  Bash — the PostToolUse hook never fires for a seat that writes nothing. A
43
44
  gate that cannot run (no dev server, Playwright missing) is reported
44
45
  UNMEASURED with the reason, never silently skipped; a dispatch without a
@@ -6,9 +6,11 @@ disable-model-invocation: false
6
6
  user-invocable: true
7
7
  ---
8
8
 
9
- Probe the project context. **$ARGUMENTS**
9
+ Probe the project context named in the current request (a directory, if given).
10
10
 
11
- Run `python3 "${CLAUDE_PLUGIN_ROOT}/scripts/adia-info" $ARGUMENTS` and present
11
+ Run `python3 "<plugin-root>/scripts/adia-info" [dir]` (`<plugin-root>` is `$CLAUDE_PLUGIN_ROOT`
12
+ in Claude Code; the plugin's installed directory in Codex) with the directory named in the
13
+ current request, and present
12
14
  the JSON as a short read: each field with the signal it derived from and
13
15
  the decision it drives (screen-composition §Current project context carries the
14
16
  field→decision table). An `installedVersion` that is null or mismatched vs
@@ -6,7 +6,7 @@ disable-model-invocation: false
6
6
  user-invocable: true
7
7
  ---
8
8
 
9
- Migrate this codebase. **$ARGUMENTS**
9
+ Migrate this codebase to the target version named in the current request.
10
10
 
11
11
  Invoke **`app-migration`**: read the shipped guide for the span
12
12
  (`node_modules/@adia-ai/web-components/MIGRATION.md` — install/upgrade the
@@ -6,10 +6,11 @@ disable-model-invocation: false
6
6
  user-invocable: true
7
7
  ---
8
8
 
9
- Orient in this repo. **$ARGUMENTS**
9
+ Orient in this repo, answering the path or question named in the current request.
10
10
 
11
11
  Invoke **`app-planning`** and produce the Orientation Record in the skill's
12
12
  own contract shape (Rendering mode · Project shape · Shell · Task ·
13
13
  Screen plan (start mode) · → Route · Verify target · Open questions), each
14
14
  axis citing its signal. Self-check the record with
15
- `python3 "${CLAUDE_PLUGIN_ROOT}/scripts/record-lint" -` before returning it.
15
+ `python3 "<plugin-root>/scripts/record-lint" -` (`<plugin-root>` is `$CLAUDE_PLUGIN_ROOT` in
16
+ Claude Code; the plugin's installed directory in Codex) before returning it.
@@ -6,12 +6,12 @@ disable-model-invocation: false
6
6
  user-invocable: true
7
7
  ---
8
8
 
9
- Find what this app is not using. **$ARGUMENTS**
9
+ Find what this app is not using, scoped to the target version named in the current request.
10
10
 
11
11
  Invoke **`find-unused`**: enumerate every `@adia-ai/*` package each manifest
12
12
  declares (never assume `web-components`), recon the three versions that differ
13
- per package — declared range, installed, and the target: **the version in
14
- `$ARGUMENTS` when one was given, registry latest only as the default**. Read
13
+ per package — declared range, installed, and the target: **the version named in the current request
14
+ when one was given, registry latest only as the default**. Read
15
15
  every `node_modules/@adia-ai/*/CHANGELOG.md` section across the
16
16
  installed→target span, then run all four audits — inert opt-in layers, redundant local
17
17
  workarounds, retired enum values sitting in persisted state, and shipped
@@ -6,7 +6,7 @@ disable-model-invocation: false
6
6
  user-invocable: true
7
7
  ---
8
8
 
9
- Build a gen-UI experience. **$ARGUMENTS**
9
+ Build the gen-UI experience or surface named in the current request.
10
10
 
11
11
  Invoke **`gen-ui-wiring`** and run its generate → validate → render → iterate
12
12
  loop; generated A2UI is validated as data before it is serialized, and the
@@ -6,10 +6,11 @@ disable-model-invocation: false
6
6
  user-invocable: true
7
7
  ---
8
8
 
9
- Scaffold an adia-ui surface. **$ARGUMENTS**
9
+ Scaffold the adia-ui surface named in the current request.
10
10
 
11
11
  Invoke **`project-scaffolding`** to classify the project shape and target, then use
12
- `${CLAUDE_PLUGIN_ROOT}/scripts/adia-scaffold` for the mechanical skeleton. Shapes
12
+ `<plugin-root>/scripts/adia-scaffold` (`<plugin-root>` is `$CLAUDE_PLUGIN_ROOT` in Claude
13
+ Code; the plugin's installed directory in Codex) for the mechanical skeleton. Shapes
13
14
  the bin doesn't one-shot (rollup, shared-foundation) are composed per the
14
15
  project-shapes reference. `inventory <app-root>` scores an existing app
15
16
  against the structure rubric (4 mechanized gates with cited paths + the 2
@@ -6,7 +6,7 @@ disable-model-invocation: false
6
6
  user-invocable: true
7
7
  ---
8
8
 
9
- Verify a composed surface. **$ARGUMENTS**
9
+ Verify the composed surface named in the current request.
10
10
 
11
11
  Dispatch the **surface-qa-agent** agent on the named surface/URL — the exit
12
12
  gate runs ISOLATED from whatever context built the surface (generator ≠
@@ -0,0 +1,28 @@
1
+ ---
2
+ wraps: theme-audit
3
+ description: Classify a consumer app's theme.css against what the adia-ui framework already ships — restated defaults, re-derived tokens, dead selectors, hand-built component work. Audit and report only; no rewrites.
4
+ argument-hint: "[--theme <file>] [--app <root>]"
5
+ disable-model-invocation: false
6
+ user-invocable: true
7
+ ---
8
+
9
+ Audit the theme stylesheet named in the current request.
10
+
11
+ Run `node "<plugin-root>/scripts/adia-theme-audit.mjs" --theme <file>
12
+ --app <root>` (add `--json`/`--json-out <path>` for a structured report,
13
+ `--strict` to exit non-zero on any `high`-confidence finding, `--class
14
+ 1,2,3,4` to narrow scope). No `@adia-ai/web-components` resolvable from
15
+ `<app>` → the tool reports `E_NO_FRAMEWORK` with the install remedy; pass
16
+ `--framework-root <checkout>` to audit against an unreleased framework
17
+ checkout instead. No `--base-url`/Playwright unreachable → class 3's
18
+ rendered census degrades to `UNMEASURED` and the run still exits `0`
19
+ (unless `--strict`); static `last-wins` detection still runs.
20
+
21
+ Return the human-readable summary and per-class tables (theme-audit
22
+ §Reading the report). Findings route back to the owning skill — a
23
+ restated default or re-derived token deletes from the theme file directly;
24
+ a hand-built-component finding routes to `screen-composition` to swap in
25
+ the primitive; a dead selector still needs a human's confirmation before
26
+ removal (the census may not have covered every interaction state). Never
27
+ apply a fix inline from this command — theme-audit and its runner never
28
+ rewrite the file, and neither does this wrapper.
package/hermes-mcp.yaml CHANGED
@@ -6,5 +6,5 @@ mcp_servers:
6
6
  command: "npx"
7
7
  args:
8
8
  - "-y"
9
- - "@adia-ai/mcp@0.8.55"
9
+ - "@adia-ai/mcp@0.8.57"
10
10
  - "gen-ui"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adia-ai/adia-ui-factory",
3
- "version": "0.8.55",
3
+ "version": "0.8.57",
4
4
  "description": "Author and verify apps built ON the adia-ui (@adia-ai) light-DOM web-component framework — orient, scaffold, compose, wire, verify, and migrate across SPA and SSR rendering modes. Wires the a2ui MCP for catalog retrieval, UI generation, and validation.",
5
5
  "keywords": [
6
6
  "adia-ui",
@@ -19,6 +19,9 @@
19
19
  "bugs": {
20
20
  "email": "kim.granlund@adia.ai"
21
21
  },
22
+ "bin": {
23
+ "adia-theme-audit": "./scripts/adia-theme-audit.mjs"
24
+ },
22
25
  "pi": {
23
26
  "skills": ["./skills"],
24
27
  "prompts": ["./prompts"],
package/plugin.yaml CHANGED
@@ -1,4 +1,4 @@
1
1
  name: "adia-ui-kit-factory"
2
- version: "0.8.55"
2
+ version: "0.8.57"
3
3
  description: "Author and verify apps built ON the adia-ui (@adia-ai) light-DOM web-component framework — orient, scaffold, compose, wire, verify, and migrate across SPA and SSR rendering modes. Wires the a2ui MCP for catalog retrieval, UI generation, and validation."
4
4
  manifest_version: 1
@@ -3,9 +3,11 @@ description: "Probe this repo's adia-ui project context — declared vs installe
3
3
  argument-hint: "[dir]"
4
4
  ---
5
5
 
6
- Probe the project context. **$ARGUMENTS**
6
+ Probe the project context named in the current request (a directory, if given).
7
7
 
8
- Run `python3 "${CLAUDE_PLUGIN_ROOT}/scripts/adia-info" $ARGUMENTS` and present
8
+ Run `python3 "<plugin-root>/scripts/adia-info" [dir]` (`<plugin-root>` is `$CLAUDE_PLUGIN_ROOT`
9
+ in Claude Code; the plugin's installed directory in Codex) with the directory named in the
10
+ current request, and present
9
11
  the JSON as a short read: each field with the signal it derived from and
10
12
  the decision it drives (screen-composition §Current project context carries the
11
13
  field→decision table). An `installedVersion` that is null or mismatched vs
@@ -3,7 +3,7 @@ description: "Migrate consumer code across @adia-ai versions (or port a foreign
3
3
  argument-hint: "[target version]"
4
4
  ---
5
5
 
6
- Migrate this codebase. **$ARGUMENTS**
6
+ Migrate this codebase to the target version named in the current request.
7
7
 
8
8
  Invoke **`app-migration`**: read the shipped guide for the span
9
9
  (`node_modules/@adia-ai/web-components/MIGRATION.md` — install/upgrade the
@@ -3,10 +3,11 @@ description: "Orient in an existing adia-ui app — classify rendering mode, pro
3
3
  argument-hint: "[path or question]"
4
4
  ---
5
5
 
6
- Orient in this repo. **$ARGUMENTS**
6
+ Orient in this repo, answering the path or question named in the current request.
7
7
 
8
8
  Invoke **`app-planning`** and produce the Orientation Record in the skill's
9
9
  own contract shape (Rendering mode · Project shape · Shell · Task ·
10
10
  Screen plan (start mode) · → Route · Verify target · Open questions), each
11
11
  axis citing its signal. Self-check the record with
12
- `python3 "${CLAUDE_PLUGIN_ROOT}/scripts/record-lint" -` before returning it.
12
+ `python3 "<plugin-root>/scripts/record-lint" -` (`<plugin-root>` is `$CLAUDE_PLUGIN_ROOT` in
13
+ Claude Code; the plugin's installed directory in Codex) before returning it.
@@ -3,12 +3,12 @@ description: "Find what a clean @adia-ai upgrade left unused — opt-in layers n
3
3
  argument-hint: "[target version]"
4
4
  ---
5
5
 
6
- Find what this app is not using. **$ARGUMENTS**
6
+ Find what this app is not using, scoped to the target version named in the current request.
7
7
 
8
8
  Invoke **`find-unused`**: enumerate every `@adia-ai/*` package each manifest
9
9
  declares (never assume `web-components`), recon the three versions that differ
10
- per package — declared range, installed, and the target: **the version in
11
- `$ARGUMENTS` when one was given, registry latest only as the default**. Read
10
+ per package — declared range, installed, and the target: **the version named in the current request
11
+ when one was given, registry latest only as the default**. Read
12
12
  every `node_modules/@adia-ai/*/CHANGELOG.md` section across the
13
13
  installed→target span, then run all four audits — inert opt-in layers, redundant local
14
14
  workarounds, retired enum values sitting in persisted state, and shipped
@@ -3,7 +3,7 @@ description: "Author a generative-UI experience — wire the a2ui runtime, gener
3
3
  argument-hint: "[experience or surface]"
4
4
  ---
5
5
 
6
- Build a gen-UI experience. **$ARGUMENTS**
6
+ Build the gen-UI experience or surface named in the current request.
7
7
 
8
8
  Invoke **`gen-ui-wiring`** and run its generate → validate → render → iterate
9
9
  loop; generated A2UI is validated as data before it is serialized, and the
@@ -3,10 +3,11 @@ description: "Scaffold a new adia-ui app, page, or component skeleton (scripts/a
3
3
  argument-hint: "[spa|ssr|page|component|inventory|selftest] [name or app-root]"
4
4
  ---
5
5
 
6
- Scaffold an adia-ui surface. **$ARGUMENTS**
6
+ Scaffold the adia-ui surface named in the current request.
7
7
 
8
8
  Invoke **`project-scaffolding`** to classify the project shape and target, then use
9
- `${CLAUDE_PLUGIN_ROOT}/scripts/adia-scaffold` for the mechanical skeleton. Shapes
9
+ `<plugin-root>/scripts/adia-scaffold` (`<plugin-root>` is `$CLAUDE_PLUGIN_ROOT` in Claude
10
+ Code; the plugin's installed directory in Codex) for the mechanical skeleton. Shapes
10
11
  the bin doesn't one-shot (rollup, shared-foundation) are composed per the
11
12
  project-shapes reference. `inventory <app-root>` scores an existing app
12
13
  against the structure rubric (4 mechanized gates with cited paths + the 2
@@ -3,7 +3,7 @@ description: "Run the consumer-side exit gate on a composed surface — dispatch
3
3
  argument-hint: "[url or surface] [key selectors]"
4
4
  ---
5
5
 
6
- Verify a composed surface. **$ARGUMENTS**
6
+ Verify the composed surface named in the current request.
7
7
 
8
8
  Dispatch the **surface-qa-agent** agent on the named surface/URL — the exit
9
9
  gate runs ISOLATED from whatever context built the surface (generator ≠
@@ -0,0 +1,25 @@
1
+ ---
2
+ description: "Classify a consumer app's theme.css against what the adia-ui framework already ships — restated defaults, re-derived tokens, dead selectors, hand-built component work. Audit and report only; no rewrites."
3
+ argument-hint: "[--theme <file>] [--app <root>]"
4
+ ---
5
+
6
+ Audit the theme stylesheet named in the current request.
7
+
8
+ Run `node "<plugin-root>/scripts/adia-theme-audit.mjs" --theme <file>
9
+ --app <root>` (add `--json`/`--json-out <path>` for a structured report,
10
+ `--strict` to exit non-zero on any `high`-confidence finding, `--class
11
+ 1,2,3,4` to narrow scope). No `@adia-ai/web-components` resolvable from
12
+ `<app>` → the tool reports `E_NO_FRAMEWORK` with the install remedy; pass
13
+ `--framework-root <checkout>` to audit against an unreleased framework
14
+ checkout instead. No `--base-url`/Playwright unreachable → class 3's
15
+ rendered census degrades to `UNMEASURED` and the run still exits `0`
16
+ (unless `--strict`); static `last-wins` detection still runs.
17
+
18
+ Return the human-readable summary and per-class tables (theme-audit
19
+ §Reading the report). Findings route back to the owning skill — a
20
+ restated default or re-derived token deletes from the theme file directly;
21
+ a hand-built-component finding routes to `screen-composition` to swap in
22
+ the primitive; a dead selector still needs a human's confirmation before
23
+ removal (the census may not have covered every interaction state). Never
24
+ apply a fix inline from this command — theme-audit and its runner never
25
+ rewrite the file, and neither does this wrapper.
@@ -109,4 +109,4 @@ The mechanizable smells the framework audits — these seed the phase-(c) hook a
109
109
  | Hardcoded `open` on `<modal-ui>`/`<drawer-ui>` | drive via `.open = true` |
110
110
  | `new URL('…', import.meta.url)` literal for a corpus path | hold the path in a variable first |
111
111
 
112
- Run the plugin's `scripts/adia-lint` on changed files, the framework's `audit:*` gates when you have the repo, and `mcp__a2ui__check_anti_patterns` / `validate_schema` on generated markup.
112
+ Run the plugin's `scripts/adia-lint.mjs` on changed files, the framework's `audit:*` gates when you have the repo, and `mcp__a2ui__check_anti_patterns` / `validate_schema` on generated markup.
@@ -72,5 +72,5 @@ Verdict: <shippable | blocked: D#…>
72
72
 
73
73
  _Provenance: the two-axis COMPOSE/REALIZE defect-quadrant model is adapted from a component-grading
74
74
  rubric; the audit tool names and slot contracts here are the factory plugin's own (`adia-lint`,
75
- `adia-probe`, the current primitive catalog). Verify a named audit rule against `scripts/adia-lint`'s
75
+ `adia-probe`, the current primitive catalog). Verify a named audit rule against `scripts/adia-lint.mjs`'s
76
76
  actual rule set before citing it._
@@ -89,7 +89,7 @@ SPA mounts the full markup. SSR keeps the shell + chrome fixed and swaps only th
89
89
 
90
90
  - **Piecemeal import** → `AdminSidebar`/`AdminCommand` unregistered; `.toggle()/.show()` undefined. Import the barrel.
91
91
  - **Wrapping shell children in `<col-ui>`/`<row-ui>`** → breaks the grid (it reads tag selectors). Generics go _inside_ `admin-content`/`admin-page-body`.
92
- - **Raw `<header>` vs `<header-ui>` inside `<admin-page-header>`**: both work the shell CSS targets `admin-page-header > :is(header, header-ui)` identically (css/admin-shell.templates.css:39), and the CHANGELOG's canonical composition uses raw `<header>`. Pick either; just don't wrap the header in a layout primitive.
92
+ - **Raw `<header>` vs `<header-ui>` inside `<admin-page-header>`**: always use `<header-ui>`. The shell CSS targets `admin-page-header > :is(header, header-ui)` identically for geometry (css/admin-shell.templates.css:39), but only `<header-ui>` has the shadow DOM that routes `slot="heading"` / `slot="description"` / `slot="icon"` / `slot="action"` children — a raw `<header>` matches the CSS rhythm but silently drops every named slot.
93
93
  - **`[resizable]` without a child `<div data-sidebar-resize>`** → no drag handle.
94
94
  - **Hardcoded `[collapsed]`** → won't auto-clear on resize; use `.collapse()/.expand()`.
95
95
  - **Multiple `<admin-page>` in one `<admin-scroll>`** → single-axis scroll breaks; one page per scroll.