Repository navigation
v1.2.8
One codebase again: this release brings the npm package to the code the hosted endpoint (api.motionspec.dev/mcp) has served since September, so npm, the MCP Registry entry and the hosted serverInfo.version carry one number for one engine.
Changed
motion_auditandmotion audituse the engine of the free site check — one checker, one score.src/audit/audit.jsis the same engine as motionspec.dev/motion-check, with the same fetch limits (12 stylesheets, 8 s, 2 MB) and scoring v2: 100 minus a deduction per root-cause group (same kind + same keyframes/selector family), weighted by severity, dampened for repeated occurrences and capped per category; floor 0. Engine changes:- Cascade-aware
prefers-reduced-motionguards. A guard counts only when it wins the cascade (later in source order or!important; a universal*guard only with!important). Rules insideno-preferenceblocks are guarded by construction. AmatchMedia('(prefers-reduced-motion')check in page JS is a hint at half weight. - Colour/opacity/shadow-type transitions and opacity-only
@keyframesare not motion (WCAG 2.3.3 definition) — no finding, counted incoverage.transition: allstays a candidate at half weight. - Loading indicators are review items, not violations: spinner/loader/skeleton/progress rules become
kind: "preload-candidate",severity: "review", no score impact. - No CSS motion →
status: "not-measurable",score: null, no badge, with an explicit disclosure. Runtime motion libraries (GSAP, three.js, PixiJS, Lottie, Framer Motion, …) are detected from<script src>and withhold the badge. - Escaped quotes in selectors (Tailwind v4 arbitrary variants such as
[&_svg:not([class*='size-'])]) no longer swallow the rest of a minified stylesheet.
- Cascade-aware
- Result shape (
--jsonandstructuredContent):{ ok, url, status, score, scoring, scoring_doc, summary, badge, findings, groups, disclosures, coverage }.scorecan benull— readstatusfirst. Scores are not comparable with 1.2.7 (scoring v1);examples/ci/motion-audit.ymlcompares only same-version, measurable runs and asks for a re-baseline otherwise. - Tool texts:
motion_catalognames the free motion check and the key page; price links carry?src=mcp(?src=mcp-<tool>in the structuredupgradeblock). The Dev Key is described as $39/month (upgradeInfo()saidbilling: "one-time"). registerMotionspecToolscan register keyed tools as paywall stubs when a host passes an allow-list (deps.only): same name and input schema, no work,isError: true, a hint naming the price and the free routes (motion_validate, the free site check, localnpx -p motionspec motion compile <spec.json>). The stdio server passes no allow-list, so all five tools work locally exactly as before;deps.paywallStub === falserestores silent omission.- Package description and keywords describe web animation accessibility; the
waapikeyword is dropped (compile output is vanilla GSAP + CSS; WAAPI lowering is internal). deps:@modelcontextprotocol/sdk1.30.0 → 1.32.0;@playwright/test1.62.0 → 1.62.1 (#21);eslint,globals,zod, commitlint bumps.
Hosted endpoint (api.motionspec.dev — not part of the npm package)
- A keyless
tools/listshows all five tools;motion_compile,motion_auditandmotion_statsanswer with the paywall stub instead ofTool … not found. GET /describes the current product and links pricing, docs,llms.txtand the Registry entry;initializecarriesserverInfo.title/websiteUrland instructions naming the free and keyed tools.
Added
AGENTS.mdfor coding agents, plus the same rules in editor form:.cursor/rules/motionspec.mdc(Cursor) and.github/copilot-instructions.md(Copilot). They state the three motion rules (reduced motion · pause path for auto-playing/infinite motion, WCAG 2.2.2 · no flashing, 2.3.1 — not audited), the CLI/MCP commands, and what the audit does not check.examples/ci/motion-audit.yml— a copy-and-adapt GitHub Actions gate:motion audit --jsonper path against a checked-in.motionspec/baseline.json, failing when a comparable score fell or Level-A findings rose. README section "Use in CI".llms-install.md— agent-readable install guide for Cline, Claude, and stdio (#20).- Tests from the shared engine:
test/audit-precision.test.mjs,test/audit-escaped-quote.test.mjs,test/audit-mcp-parity.test.mjs(tool = site pipeline on five fixtures).
Fixed
- Shipped transitive dependencies refreshed to clear the production audit:
fast-uri3.1.8,ip-address10.7.3,proxy-addr2.0.8 (#43). The high-severity advisory fixed onmainin4d6fb59now ships. - README figures are measured values (354 tests; 97.23 % lines / 95.17 % functions / 80.82 % branches,
npm run coverage2026-10-08; 104 kB packed); "Two build targets" reworded — the WAAPI/CSS lowering has no CLI flag, MCP tool or schema target and is internal.
Documentation
- Web animation accessibility stated consistently in the README, npm metadata, MCP manifest (title/description) and agent context; scoped motion guide (
docs/motion-accessibility.md), repeatable discovery check (docs/discovery.md) and an aggregate analytics proposal (docs/analytics-plan.md). No new tracking is activated. - Broad legal/standards mappings replaced by the exact WCAG 2.2.2 (A) and 2.3.3 (AAA) scope; the legacy audit badge explained.
- Every place that documents the audit result describes the v2 shape (AGENTS.md, README, editor rules, audit skill, motion guide).