nodality 1.3.19 → 1.3.21
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/bin/mcp-server.mjs +8 -3
- package/bin/nodality.mjs +41 -0
- package/dist/animator.cjs.js +1 -1
- package/dist/animator.cjs.js.LICENSE.txt +1 -1
- package/dist/animator.esm.js +1 -1
- package/dist/animator.esm.js.LICENSE.txt +1 -1
- package/dist/audionew.cjs.js +1 -1
- package/dist/audionew.cjs.js.LICENSE.txt +1 -1
- package/dist/audionew.esm.js +1 -1
- package/dist/audionew.esm.js.LICENSE.txt +1 -1
- package/dist/base.cjs.js +1 -1
- package/dist/base.cjs.js.LICENSE.txt +1 -1
- package/dist/base.esm.js +1 -1
- package/dist/base.esm.js.LICENSE.txt +1 -1
- package/dist/beta-desktop-bar.cjs.js +1 -1
- package/dist/beta-desktop-bar.cjs.js.LICENSE.txt +1 -1
- package/dist/beta-desktop-bar.esm.js +1 -1
- package/dist/beta-desktop-bar.esm.js.LICENSE.txt +1 -1
- package/dist/beta-mobile-bar.cjs.js +1 -1
- package/dist/beta-mobile-bar.cjs.js.LICENSE.txt +1 -1
- package/dist/beta-mobile-bar.esm.js +1 -1
- package/dist/beta-mobile-bar.esm.js.LICENSE.txt +1 -1
- package/dist/bundle.umd.js +1 -1
- package/dist/bundle.umd.js.LICENSE.txt +1 -1
- package/dist/button.cjs.js +1 -1
- package/dist/button.cjs.js.LICENSE.txt +1 -1
- package/dist/button.esm.js +1 -1
- package/dist/button.esm.js.LICENSE.txt +1 -1
- package/dist/card-getter.cjs.js.LICENSE.txt +1 -1
- package/dist/card-getter.esm.js.LICENSE.txt +1 -1
- package/dist/center.cjs.js +1 -1
- package/dist/center.cjs.js.LICENSE.txt +1 -1
- package/dist/center.esm.js +1 -1
- package/dist/center.esm.js.LICENSE.txt +1 -1
- package/dist/checkbox.cjs.js +1 -1
- package/dist/checkbox.cjs.js.LICENSE.txt +1 -1
- package/dist/checkbox.esm.js +1 -1
- package/dist/checkbox.esm.js.LICENSE.txt +1 -1
- package/dist/code.cjs.js +1 -1
- package/dist/code.cjs.js.LICENSE.txt +1 -1
- package/dist/code.esm.js +1 -1
- package/dist/code.esm.js.LICENSE.txt +1 -1
- package/dist/container.cjs.js +1 -1
- package/dist/container.cjs.js.LICENSE.txt +1 -1
- package/dist/container.esm.js +1 -1
- package/dist/container.esm.js.LICENSE.txt +1 -1
- package/dist/data-list.cjs.js +1 -1
- package/dist/data-list.cjs.js.LICENSE.txt +1 -1
- package/dist/data-list.esm.js +1 -1
- package/dist/data-list.esm.js.LICENSE.txt +1 -1
- package/dist/designer.cjs.js +1 -1
- package/dist/designer.cjs.js.LICENSE.txt +1 -1
- package/dist/designer.esm.js +1 -1
- package/dist/designer.esm.js.LICENSE.txt +1 -1
- package/dist/element-mapper.cjs.js +1 -1
- package/dist/element-mapper.cjs.js.LICENSE.txt +1 -1
- package/dist/element-mapper.esm.js +1 -1
- package/dist/element-mapper.esm.js.LICENSE.txt +1 -1
- package/dist/finalresult.esm.js +1 -1
- package/dist/finalresult.esm.js.LICENSE.txt +1 -1
- package/dist/flex-card.cjs.js +1 -1
- package/dist/flex-card.cjs.js.LICENSE.txt +1 -1
- package/dist/flex-card.esm.js +1 -1
- package/dist/flex-card.esm.js.LICENSE.txt +1 -1
- package/dist/flex-grid.cjs.js +1 -1
- package/dist/flex-grid.cjs.js.LICENSE.txt +1 -1
- package/dist/flex-grid.esm.js +1 -1
- package/dist/flex-grid.esm.js.LICENSE.txt +1 -1
- package/dist/flex-row.cjs.js +1 -1
- package/dist/flex-row.cjs.js.LICENSE.txt +1 -1
- package/dist/flex-row.esm.js +1 -1
- package/dist/flex-row.esm.js.LICENSE.txt +1 -1
- package/dist/floating-input.cjs.js +1 -1
- package/dist/floating-input.cjs.js.LICENSE.txt +1 -1
- package/dist/floating-input.esm.js +1 -1
- package/dist/floating-input.esm.js.LICENSE.txt +1 -1
- package/dist/free.cjs.js +1 -1
- package/dist/free.cjs.js.LICENSE.txt +1 -1
- package/dist/free.esm.js +1 -1
- package/dist/free.esm.js.LICENSE.txt +1 -1
- package/dist/horizontal-scroller.cjs.js.LICENSE.txt +1 -1
- package/dist/horizontal-scroller.esm.js.LICENSE.txt +1 -1
- package/dist/image-picker.cjs.js +1 -1
- package/dist/image-picker.cjs.js.LICENSE.txt +1 -1
- package/dist/image-picker.esm.js +1 -1
- package/dist/image-picker.esm.js.LICENSE.txt +1 -1
- package/dist/image.cjs.js +1 -1
- package/dist/image.cjs.js.LICENSE.txt +1 -1
- package/dist/image.esm.js +1 -1
- package/dist/image.esm.js.LICENSE.txt +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.LICENSE.txt +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.esm.js +1 -1
- package/dist/index.esm.js.LICENSE.txt +1 -1
- package/dist/keyframe-animation.cjs.js.LICENSE.txt +1 -1
- package/dist/keyframe-animation.esm.js.LICENSE.txt +1 -1
- package/dist/link-getter.cjs.js +1 -1
- package/dist/link-getter.cjs.js.LICENSE.txt +1 -1
- package/dist/link-getter.esm.js +1 -1
- package/dist/link-getter.esm.js.LICENSE.txt +1 -1
- package/dist/link.cjs.js +1 -1
- package/dist/link.cjs.js.LICENSE.txt +1 -1
- package/dist/link.esm.js +1 -1
- package/dist/link.esm.js.LICENSE.txt +1 -1
- package/dist/meta-adder.cjs.js +1 -1
- package/dist/meta-adder.cjs.js.LICENSE.txt +1 -1
- package/dist/meta-adder.esm.js +1 -1
- package/dist/meta-adder.esm.js.LICENSE.txt +1 -1
- package/dist/modal-2025.cjs.js +1 -1
- package/dist/modal-2025.cjs.js.LICENSE.txt +1 -1
- package/dist/modal-2025.esm.js +1 -1
- package/dist/modal-2025.esm.js.LICENSE.txt +1 -1
- package/dist/multiswitcher.cjs.js +1 -1
- package/dist/multiswitcher.cjs.js.LICENSE.txt +1 -1
- package/dist/multiswitcher.esm.js +1 -1
- package/dist/multiswitcher.esm.js.LICENSE.txt +1 -1
- package/dist/new-nav-bar.cjs.js +1 -1
- package/dist/new-nav-bar.cjs.js.LICENSE.txt +1 -1
- package/dist/new-nav-bar.esm.js +1 -1
- package/dist/new-nav-bar.esm.js.LICENSE.txt +1 -1
- package/dist/picker.cjs.js +1 -1
- package/dist/picker.cjs.js.LICENSE.txt +1 -1
- package/dist/picker.esm.js +1 -1
- package/dist/picker.esm.js.LICENSE.txt +1 -1
- package/dist/progress.cjs.js +1 -1
- package/dist/progress.cjs.js.LICENSE.txt +1 -1
- package/dist/progress.esm.js +1 -1
- package/dist/progress.esm.js.LICENSE.txt +1 -1
- package/dist/radio.cjs.js +1 -1
- package/dist/radio.cjs.js.LICENSE.txt +1 -1
- package/dist/radio.esm.js +1 -1
- package/dist/radio.esm.js.LICENSE.txt +1 -1
- package/dist/range.cjs.js +1 -1
- package/dist/range.cjs.js.LICENSE.txt +1 -1
- package/dist/range.esm.js +1 -1
- package/dist/range.esm.js.LICENSE.txt +1 -1
- package/dist/scroll-video.cjs.js.LICENSE.txt +1 -1
- package/dist/scroll-video.esm.js.LICENSE.txt +1 -1
- package/dist/side-bar.cjs.js +1 -1
- package/dist/side-bar.cjs.js.LICENSE.txt +1 -1
- package/dist/side-bar.esm.js +1 -1
- package/dist/side-bar.esm.js.LICENSE.txt +1 -1
- package/dist/side-nav-bar.cjs.js +1 -1
- package/dist/side-nav-bar.cjs.js.LICENSE.txt +1 -1
- package/dist/side-nav-bar.esm.js +1 -1
- package/dist/side-nav-bar.esm.js.LICENSE.txt +1 -1
- package/dist/simple-bar.cjs.js +1 -1
- package/dist/simple-bar.cjs.js.LICENSE.txt +1 -1
- package/dist/simple-bar.esm.js +1 -1
- package/dist/simple-bar.esm.js.LICENSE.txt +1 -1
- package/dist/slider-2025.cjs.js +1 -1
- package/dist/slider-2025.cjs.js.LICENSE.txt +1 -1
- package/dist/slider-2025.esm.js +1 -1
- package/dist/slider-2025.esm.js.LICENSE.txt +1 -1
- package/dist/spacer.cjs.js +1 -1
- package/dist/spacer.cjs.js.LICENSE.txt +1 -1
- package/dist/spacer.esm.js +1 -1
- package/dist/spacer.esm.js.LICENSE.txt +1 -1
- package/dist/stack.cjs.js +1 -1
- package/dist/stack.cjs.js.LICENSE.txt +1 -1
- package/dist/stack.esm.js +1 -1
- package/dist/stack.esm.js.LICENSE.txt +1 -1
- package/dist/stacker.cjs.js.LICENSE.txt +1 -1
- package/dist/stacker.esm.js.LICENSE.txt +1 -1
- package/dist/table.cjs.js +1 -1
- package/dist/table.cjs.js.LICENSE.txt +1 -1
- package/dist/table.esm.js +1 -1
- package/dist/table.esm.js.LICENSE.txt +1 -1
- package/dist/text-field.cjs.js +1 -1
- package/dist/text-field.cjs.js.LICENSE.txt +1 -1
- package/dist/text-field.esm.js +1 -1
- package/dist/text-field.esm.js.LICENSE.txt +1 -1
- package/dist/text.cjs.js +1 -1
- package/dist/text.cjs.js.LICENSE.txt +1 -1
- package/dist/text.esm.js +1 -1
- package/dist/text.esm.js.LICENSE.txt +1 -1
- package/dist/theme.cjs.js.LICENSE.txt +1 -1
- package/dist/theme.esm.js.LICENSE.txt +1 -1
- package/dist/transform-anim.cjs.js.LICENSE.txt +1 -1
- package/dist/transform-anim.esm.js.LICENSE.txt +1 -1
- package/dist/ulist.cjs.js +1 -1
- package/dist/ulist.cjs.js.LICENSE.txt +1 -1
- package/dist/ulist.esm.js +1 -1
- package/dist/ulist.esm.js.LICENSE.txt +1 -1
- package/dist/video.cjs.js +1 -1
- package/dist/video.cjs.js.LICENSE.txt +1 -1
- package/dist/video.esm.js +1 -1
- package/dist/video.esm.js.LICENSE.txt +1 -1
- package/dist/wrap.cjs.js +1 -1
- package/dist/wrap.cjs.js.LICENSE.txt +1 -1
- package/dist/wrap.esm.js +1 -1
- package/dist/wrap.esm.js.LICENSE.txt +1 -1
- package/dist/zoom-card.cjs.js +1 -1
- package/dist/zoom-card.cjs.js.LICENSE.txt +1 -1
- package/dist/zoom-card.esm.js +1 -1
- package/dist/zoom-card.esm.js.LICENSE.txt +1 -1
- package/layout/animator.js +191 -135
- package/layout/audio.js +1 -1
- package/layout/audionew.js +1 -1
- package/layout/base.js +1 -1
- package/layout/beta-desktop-bar.js +7 -1
- package/layout/beta-mobile-bar.js +13 -3
- package/layout/button.js +1 -1
- package/layout/center.js +1 -1
- package/layout/checkbox.js +1 -1
- package/layout/circle.js +1 -1
- package/layout/code.js +1 -1
- package/layout/container.js +1 -1
- package/layout/dropdown-2025.js +1 -1
- package/layout/flex-card.js +1 -1
- package/layout/flex-grid.js +1 -1
- package/layout/flex-row.js +1 -1
- package/layout/form-components/custom.js +1 -1
- package/layout/form-components/data-list.js +1 -1
- package/layout/form-components/floating-input.js +1 -1
- package/layout/form-components/form-all.js +1 -1
- package/layout/form-components/form.js +1 -1
- package/layout/form-components/image-picker.js +1 -1
- package/layout/form-components/picker.js +1 -1
- package/layout/form-components/radio.js +1 -1
- package/layout/form-components/radiogroup.js +1 -1
- package/layout/form-components/range.js +1 -1
- package/layout/free.js +1 -1
- package/layout/grid-overlay.js +1 -1
- package/layout/grid-switcher.js +1 -1
- package/layout/grid.js +1 -1
- package/layout/horizontal-scroller.js +1 -1
- package/layout/image.js +1 -1
- package/layout/index.js +1 -1
- package/layout/link.js +1 -1
- package/layout/list.js +1 -1
- package/layout/meta-adder.js +1 -1
- package/layout/modal-2025.js +1 -1
- package/layout/morph.js +1 -1
- package/layout/multiswitcher.js +1 -1
- package/layout/nav-bar.js +1 -1
- package/layout/nav-factor/custom-div.js +1 -1
- package/layout/new-nav-bar.js +1 -1
- package/layout/polygon.js +1 -1
- package/layout/prerender-site.js +1 -1
- package/layout/prerender.js +1 -1
- package/layout/progress.js +1 -1
- package/layout/row.js +1 -1
- package/layout/scroll-video.js +1 -1
- package/layout/shop.js +9 -1
- package/layout/side-bar.js +1 -1
- package/layout/side-nav-bar.js +1 -1
- package/layout/simple-bar.js +1 -1
- package/layout/slider-2025.js +1 -1
- package/layout/spacer.js +1 -1
- package/layout/stack.js +1 -1
- package/layout/svg.js +1 -1
- package/layout/switcher.js +1 -1
- package/layout/table.js +1 -1
- package/layout/text-field.js +1 -1
- package/layout/text.js +7 -1
- package/layout/ulist.js +1 -1
- package/layout/video.js +1 -1
- package/layout/wrap.js +1 -1
- package/layout/zoom-card.js +1 -1
- package/lib/agent-surface.js +1 -1
- package/lib/card-getter.js +1 -1
- package/lib/check-page.js +14 -2
- package/lib/codegen.js +1 -1
- package/lib/data.js +1 -1
- package/lib/designer.js +1 -1
- package/lib/element-mapper.js +23 -8
- package/lib/element-params.generated.js +4 -4
- package/lib/grid-geometry.js +1 -1
- package/lib/keyframe-animation.js +1 -1
- package/lib/known-inert.js +8 -9
- package/lib/link-getter.js +1 -1
- package/lib/morph-node.js +1 -1
- package/lib/normalize-spec.js +1 -1
- package/lib/parse-html.js +1 -1
- package/lib/raster-inspect.js +1 -1
- package/lib/raster-ops.js +1 -1
- package/lib/raster-presets.js +1 -1
- package/lib/resolve-refs.js +1 -1
- package/lib/scroll-video.js +1 -1
- package/lib/seo.js +1 -1
- package/lib/stacker.js +1 -1
- package/lib/suggest.js +1 -1
- package/lib/theme.js +1 -1
- package/lib/transform-anim.js +1 -1
- package/lib/transition.js +1 -1
- package/lib/validate-nodes.js +9 -2
- package/lib/webmcp-adapter.js +1 -1
- package/package.json +2 -1
- package/schema.json +10100 -2535
- package/scripts/generate-schema.mjs +83 -2
- package/skills/nodality/SKILL.md +16 -3
package/bin/mcp-server.mjs
CHANGED
|
@@ -148,7 +148,11 @@ const TOOLS = [
|
|
|
148
148
|
"width and reports horizontal overflow, elements past the viewport, " +
|
|
149
149
|
"clipped content, images with no description, tap targets under 24px, " +
|
|
150
150
|
"controls with no accessible name, skipped heading levels and text " +
|
|
151
|
-
"below the WCAG contrast minimum
|
|
151
|
+
"below the WCAG contrast minimum, and a shop product whose loading " +
|
|
152
|
+
"copy sits somewhere other than the loaded element (the shop script is " +
|
|
153
|
+
"blocked, so this needs no store). For a prerendered site page, pass " +
|
|
154
|
+
"`base` (the dev server's origin) so its fonts and assets load. Same " +
|
|
155
|
+
"report shape as validate_nodes; " +
|
|
152
156
|
"`path` in an error is a CSS selector into the rendered page. It " +
|
|
153
157
|
"reports facts, never taste \u2014 it will not tell you whether a " +
|
|
154
158
|
"design is good.",
|
|
@@ -157,6 +161,7 @@ const TOOLS = [
|
|
|
157
161
|
properties: {
|
|
158
162
|
html: { type: "string", description: "Rendered HTML: a document or a fragment." },
|
|
159
163
|
path: { type: "string", description: "Path to an HTML file, e.g. what `preview` returned." },
|
|
164
|
+
base: { type: "string", description: "Origin the page is served from, e.g. http://localhost:4000/ — resolves its /assets/ fonts and styles." },
|
|
160
165
|
},
|
|
161
166
|
},
|
|
162
167
|
},
|
|
@@ -259,7 +264,7 @@ const IMPL = {
|
|
|
259
264
|
// generator is a build-time script and this server answers in-process. The
|
|
260
265
|
// drift test keeps the committed copy honest, so reading it is not a second
|
|
261
266
|
// source of truth, it is the same one at rest.
|
|
262
|
-
check_page: async ({ html, path: file } = {}) => {
|
|
267
|
+
check_page: async ({ html, path: file, base } = {}) => {
|
|
263
268
|
const { checkPage } = await import("../lib/check-page.js");
|
|
264
269
|
let source = html;
|
|
265
270
|
if (!source && file) {
|
|
@@ -276,7 +281,7 @@ const IMPL = {
|
|
|
276
281
|
}],
|
|
277
282
|
});
|
|
278
283
|
}
|
|
279
|
-
return ok(await checkPage(source));
|
|
284
|
+
return ok(await checkPage(source, base ? { base, waitUntil: "networkidle" } : {}));
|
|
280
285
|
},
|
|
281
286
|
|
|
282
287
|
get_schema: async ({ type } = {}) => {
|
package/bin/nodality.mjs
CHANGED
|
@@ -126,6 +126,13 @@ function showUsage() {
|
|
|
126
126
|
# --dir=<path> copy SKILL.md anywhere
|
|
127
127
|
# --no-mcp skip MCP registration
|
|
128
128
|
# Re-run after upgrading to refresh in place.
|
|
129
|
+
nodality check <page.html>... [--base=<url>] # Check rendered pages in a real browser
|
|
130
|
+
# (Playwright): overflow, clipping,
|
|
131
|
+
# contrast, labels, tap targets, a shop
|
|
132
|
+
# product's loading shift. --base is the
|
|
133
|
+
# origin they are served from, so fonts
|
|
134
|
+
# and /assets/ load. Exit 1 on findings.
|
|
135
|
+
# The same check as the MCP check_page.
|
|
129
136
|
nodality schema [type] [--check] # Print the machine-readable element
|
|
130
137
|
# schema, derived from the source
|
|
131
138
|
# at run time. With a type, print
|
|
@@ -916,6 +923,35 @@ async function runFanoutStandalone(rawArgs) {
|
|
|
916
923
|
}
|
|
917
924
|
}
|
|
918
925
|
|
|
926
|
+
// ─── check subcommand ──────────────────────────────────────────
|
|
927
|
+
|
|
928
|
+
async function runCheck(rest) {
|
|
929
|
+
const fs = await import("node:fs");
|
|
930
|
+
const files = rest.filter((a) => !a.startsWith("--"));
|
|
931
|
+
const baseArg = rest.find((a) => a.startsWith("--base="));
|
|
932
|
+
if (!files.length) {
|
|
933
|
+
console.error("[nodality] check: name one or more HTML files, e.g. npx nodality check upload/index.html --base=http://localhost:4000/");
|
|
934
|
+
process.exit(1);
|
|
935
|
+
}
|
|
936
|
+
const { checkPage } = await import("../lib/check-page.js");
|
|
937
|
+
let findings = 0;
|
|
938
|
+
for (const file of files) {
|
|
939
|
+
const html = fs.readFileSync(file, "utf8");
|
|
940
|
+
const opts = baseArg ? { base: baseArg.slice("--base=".length), waitUntil: "networkidle" } : {};
|
|
941
|
+
const r = await checkPage(html, opts);
|
|
942
|
+
if (r.errors[0]?.code === "MISSING_PEER_DEPENDENCY") {
|
|
943
|
+
console.error(`[nodality] check: ${r.errors[0].detail}\n ${r.errors[0].suggestions.join("\n ")}`);
|
|
944
|
+
process.exit(1);
|
|
945
|
+
}
|
|
946
|
+
findings += r.errors.length;
|
|
947
|
+
console.log(r.errors.length ? `✗ ${file} — ${r.errors.length} finding(s)` : `✓ ${file}`);
|
|
948
|
+
for (const e of r.errors) {
|
|
949
|
+
console.log(` ${e.code} ${e.path} ${e.got ?? ""} [${e.viewport}]${e.detail ? `\n ${e.detail}` : ""}${e.suggestions.length ? `\n → ${e.suggestions[0]}` : ""}`);
|
|
950
|
+
}
|
|
951
|
+
}
|
|
952
|
+
if (findings) process.exit(1);
|
|
953
|
+
}
|
|
954
|
+
|
|
919
955
|
// ─── Dispatch ──────────────────────────────────────────────────
|
|
920
956
|
|
|
921
957
|
async function main() {
|
|
@@ -960,6 +996,11 @@ async function main() {
|
|
|
960
996
|
// should cost nothing, and a broken generator must not take the CLI down.
|
|
961
997
|
const { runSchema } = await import("./schema-cli.mjs");
|
|
962
998
|
await runSchema(rest);
|
|
999
|
+
} else if (command === "check") {
|
|
1000
|
+
// check_page without the MCP. A session where the server is not loaded
|
|
1001
|
+
// (it needs approving per project) had no way to run it: the module was
|
|
1002
|
+
// not exported and no command reached it.
|
|
1003
|
+
await runCheck(rest);
|
|
963
1004
|
} else if (command === "skill") {
|
|
964
1005
|
const { runSkillInstall } = await import("./install-skill.mjs");
|
|
965
1006
|
await runSkillInstall(rest);
|