llynt 0.2.2 → 0.2.4

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 (2) hide show
  1. package/cli.js +22 -22
  2. package/package.json +1 -1
package/cli.js CHANGED
@@ -1,38 +1,38 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var We=Object.create;var ue=Object.defineProperty;var qe=Object.getOwnPropertyDescriptor;var Ye=Object.getOwnPropertyNames;var Je=Object.getPrototypeOf,Ke=Object.prototype.hasOwnProperty;var z=(e,r)=>()=>(e&&(r=e(e=0)),r);var Ge=(e,r)=>{for(var t in r)ue(e,t,{get:r[t],enumerable:!0})},Xe=(e,r,t,s)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of Ye(r))!Ke.call(e,o)&&o!==t&&ue(e,o,{get:()=>r[o],enumerable:!(s=qe(r,o))||s.enumerable});return e};var E=(e,r,t)=>(t=e!=null?We(Je(e)):{},Xe(r||!e||!e.__esModule?ue(t,"default",{value:e,enumerable:!0}):t,e));function Ae(e){let r=e.trim();if(!r)throw new Error("LLYNT_API_URL is empty");return r.includes("/v1/check")?r:r.replace(/\/+$/g,"")+"/v1/check"}function at(e){return new Promise((r,t)=>{oe.gzip(e,(s,o)=>{s?t(s):r(o)})})}function lt(e){return new Promise((r,t)=>{oe.brotliCompress(e,(s,o)=>{s?t(s):r(o)})})}function ct(e,r,t,s){return new Promise((o,d)=>{let i=(e.protocol==="https:"?it:nt).request({...r,protocol:e.protocol,hostname:e.hostname,port:e.port,path:e.pathname+e.search},l=>{let f=[];l.on("data",g=>f.push(g)),l.on("end",()=>{o({statusCode:l.statusCode??0,body:Buffer.concat(f)})})});i.on("error",l=>d(l)),i.setTimeout(s,()=>{i.destroy(new Error(`Hosted API request timed out after ${s}ms`))}),i.end(t)})}async function Ce(e,r){let t=new URL(e.apiUrl),s=e.timeoutMs??3e4,o=Buffer.from(JSON.stringify(r),"utf8"),d=e.compression??"gzip",m=d==="identity"?o:d==="br"?await lt(o):await at(o),i={"content-type":"application/json",accept:"application/json","user-agent":"llynt-hosted-client/0","content-length":String(m.length)};d!=="identity"&&(i["content-encoding"]=d),e.apiKey&&(i.authorization=`Bearer ${e.apiKey}`);let{statusCode:l,body:f}=await ct(t,{method:"POST",headers:i},m,s),g=f.toString("utf8");if(l<200||l>=300)throw new Error(`Hosted API error (${l}): ${g.slice(0,500)}`);let u=JSON.parse(g);if(!u||u._schemaVersion!=="llynt-hosted-check-result@0"||!Array.isArray(u.issues))throw new Error("Hosted API response schema mismatch");return u}var nt,it,oe,de=z(()=>{"use strict";nt=E(require("http")),it=E(require("https")),oe=E(require("zlib"))});async function Ie(e,r,t){let s=t?.maxDepth??gt,o=t?.maxNodes??yt,d=typeof t?.includeComputedStyles=="boolean"?t.includeComputedStyles?"all":"none":t?.computedStyleMode??"essential",m=Array.isArray(t?.computedStyleProps)?t.computedStyleProps:void 0,i=t?.internComputedStyles??!0,l=t?.includeUrlAttributes??!1,f=t?.redactUrlAttributes??!0,g=await e.evaluate(({selector:P,maxDepth:L,maxNodes:S,computedStyleMode:N,computedStyleProps:y,essentialProps:w,internComputedStyles:v,includeUrlAttributes:_,redactUrlAttributes:H})=>{function A(a){let c=2166136261;for(let h=0;h<a.length;h++)c^=a.charCodeAt(h),c=Math.imul(c,16777619);return(c>>>0).toString(36)}function M(a){let c=Object.keys(a).sort(),h=[];for(let n of c)h.push(`${n}=${a[n]}`);return h.join(";")}function le(a){try{let c=new URL(a,document.baseURI);return c.protocol==="http:"||c.protocol==="https:"?`${c.protocol}//${c.host}${c.pathname}`:c.protocol==="data:"?"data:[redacted]":c.protocol==="blob:"?"blob:[redacted]":`${c.protocol}[redacted]`}catch{return"[redacted]"}}function X(a,c){let h=[],n=a;for(;n&&n!==c;){let p=n.parentElement??null;if(!p)break;let b=n.tagName.toLowerCase(),j=Array.from(p.children).filter(V=>String(V?.tagName??"").toLowerCase()===b),O=Math.max(0,j.indexOf(n));h.push(`${b}:${O}`),n=p}return h.push(c.tagName.toLowerCase()),h.reverse().join("/")}function K(a,c){let h=[],n=a;for(;n&&n!==c;){let p=n.parentElement??null;if(!p)break;let b=n.tagName.toLowerCase(),j=n.id;if(j){h.push(`#${CSS.escape(j)}`);break}let O=Array.from(p.children);if(O.filter(D=>String(D?.tagName??"").toLowerCase()===b).length===1)h.push(b);else{let D=O.indexOf(n)+1;h.push(`${b}:nth-child(${D})`)}n=p}return h.length?h.reverse().join(" > "):c.tagName.toLowerCase()}function Q(a){return!!(a.getAttribute("data-figma-id")||a.getAttribute("data-llynt-node-id")||a.getAttribute("data-component")||a.getAttribute("data-testid")||a.id)}function Z(a,c){let h=a.getAttribute("data-figma-id");if(h)return h;let n=a.getAttribute("data-llynt-node-id");if(n)return n;let p=a.getAttribute("data-component");if(p)return p;let b=a.getAttribute("data-testid");if(b)return b;let j=a.id;if(j)return j;let O=X(a,c),V=A(O);return`llynt-${a.tagName.toLowerCase()}-${V}`}function F(a){let c={};for(let h of Array.from(a.attributes)){let n=h.name;if(n==="id"||n==="class"||n==="role"||n==="alt"||n==="type"||n==="width"||n==="height"||n==="target"||n==="rel"||n==="loading"||n==="name"||n==="autocomplete"||n==="disabled"||n==="required"||n==="placeholder"||n==="for"||n==="tabindex"||n==="lang"||n==="style"||n.startsWith("aria-")||n==="data-figma-id"||n==="data-component"||n==="data-testid"||n==="data-primary"||n.startsWith("data-llynt-")){let p=h.value;typeof p=="string"&&(c[n]=p)}if(n==="href"||n==="src"){let p=h.value;typeof p=="string"&&(p===""||p==="#"||p.startsWith("javascript:")?c[n]=p:p.length>0&&(c[n]=_&&!H?p:le(p)))}}return Object.keys(c).length>0?c:void 0}function ee(a){if(N==="none")return;let c=window.getComputedStyle(a),h={},n=Array.isArray(y)&&y.length?y:N==="essential"?w:null;if(n){for(let p of n){let b=c.getPropertyValue(p);typeof b=="string"&&b.trim()&&(h[p]=b.trim())}return Object.keys(h).length>0?h:void 0}for(let p=0;p<c.length;p++){let b=c[p],j=c.getPropertyValue(b);typeof j=="string"&&j.trim()&&(h[b]=j.trim())}return Object.keys(h).length>0?h:void 0}function k(a){let c=a.getBoundingClientRect();return{left:c.left,top:c.top,width:c.width,height:c.height}}let I=document.querySelector(P||"body")??document.body,G=0,me=!1,he=new Set,te={};function fe(a,c,h){if(G+=1,G>S)return me=!0,null;let n=Q(a),p=Z(a,I);if(he.has(p)){let U=A(p+":"+G);p=`${p}-${U}`}if(he.add(p),!n)try{a.setAttribute("data-llynt-node-id",p)}catch{}let b=ee(a),j;if(v&&b&&Object.keys(b).length){let U=M(b);j=`cs-${A(U)}`,te[j]||(te[j]=b)}let O=K(a,I),V=(a.textContent?.trim()??"").length,D,$=a;($.scrollWidth>$.clientWidth||$.scrollHeight>$.clientHeight)&&(D={scrollWidth:$.scrollWidth,clientWidth:$.clientWidth,scrollHeight:$.scrollHeight,clientHeight:$.clientHeight});let C={nodeId:p,parentId:h,tagName:a.tagName.toLowerCase(),attributes:F(a),bbox:k(a),computed:j?void 0:b,computedRef:j,cssSelector:O,textLen:V>0?V:void 0,scrollOverflow:D,children:[]};if(a.tagName==="IMG"){let U=a;C.naturalWidth=U.naturalWidth,C.naturalHeight=U.naturalHeight}if(c>=L)return C;for(let U of Array.from(a.children)){let ce=fe(U,c+1,p);if(!ce)break;C.children.push(ce)}return C.children.length===0&&delete C.children,C.parentId||delete C.parentId,C.attributes||delete C.attributes,C.computed||delete C.computed,C.computedRef||delete C.computedRef,C}let ge=fe(I,0);if(!ge)return{tree:{nodeId:Z(I,I),tagName:I.tagName.toLowerCase(),bbox:k(I)},stats:{nodeCount:Math.min(G,S),maxDepth:L,maxNodes:S,truncated:!0}};let ze=document.documentElement.getAttribute("lang")||void 0;return{tree:ge,computedStyles:Object.keys(te).length?te:void 0,stats:{nodeCount:Math.min(G,S),maxDepth:L,maxNodes:S,truncated:me},htmlLang:ze}},{selector:r.selector??"body",maxDepth:s,maxNodes:o,computedStyleMode:d,computedStyleProps:m,essentialProps:[...bt],internComputedStyles:i,includeUrlAttributes:l,redactUrlAttributes:f}),u={_schemaVersion:"dom-blob@0",_extractedAt:new Date().toISOString(),target:{url:r.url,selector:r.selector,viewport:r.viewport},tree:g.tree,computedStyles:g.computedStyles,stats:g.stats,htmlLang:g.htmlLang};if(u.stats){u.stats.coverage={completeness:u.stats.truncated?"truncated":"complete",reason:u.stats.truncated?"maxNodes":void 0},u.stats.confidence={extractionCompleteness:u.stats.truncated?"low":"high"};let P={...u,stats:{...u.stats}};delete P.stats.bytesRaw,delete P.stats.bytesGzip,delete P.stats.computedStyleMode,delete P.stats.urlAttributes;let L=Buffer.from(JSON.stringify(P),"utf8"),S=Pe.gzipSync(L);u.stats.bytesRaw=L.length,u.stats.bytesGzip=S.length,u.stats.computedStyleMode=d,u.stats.urlAttributes=l?f?"redacted":"raw":"omitted"}return u}var Pe,gt,yt,bt,Re=z(()=>{"use strict";Pe=E(require("zlib")),gt=10,yt=1e4,bt=["display","position","overflow","overflow-x","overflow-y","visibility","opacity","width","height","min-width","min-height","max-width","max-height","margin-top","margin-right","margin-bottom","margin-left","padding-top","padding-right","padding-bottom","padding-left","gap","flex-basis","flex-shrink","flex-wrap","align-items","z-index","pointer-events","cursor","font-size","font-family","font-weight","line-height","letter-spacing","text-decoration","text-overflow","white-space","color","background-color","border-width","border-color","border-top-color","border-top-width","border-radius","box-shadow","outline","outline-style","transition-duration","transition-property","aspect-ratio","padding"]});function wt(){let e=ie.platform(),r=ie.homedir();if(e==="darwin")return W.join(r,"Library","Caches","llynt","playwright");if(e==="win32"){let o=process.env.LOCALAPPDATA||process.env.APPDATA||W.join(r,"AppData","Local");return W.join(o,"llynt","playwright")}let t=process.env.XDG_CACHE_HOME,s=t&&t.trim().length>0?t:W.join(r,".cache");return W.join(s,"llynt","playwright")}function Le(){return{source:"llynt",browsersPath:wt()}}function Ne(e){process.env.PLAYWRIGHT_BROWSERS_PATH=e.browsersPath}var ie,W,_e=z(()=>{"use strict";ie=E(require("os")),W=E(require("path"))});async function kt(){return ae||(ae=import("playwright").then(e=>e.chromium).catch(e=>{throw ae=null,e})),ae}function vt(){return["* {"," animation: none !important;"," transition: none !important;"," scroll-behavior: auto !important;","}","html {"," -webkit-text-size-adjust: 100% !important;","}"].join(`
3
- `)}async function Oe(){if(q&&q.isConnected())return q;if(Y)try{let e=await Y;if(e.isConnected())return e}catch{}return Y=xt().then(e=>(q=e,e.on("disconnected",()=>{q===e&&(q=null,Y=null)}),e)).catch(e=>{throw Y=null,e}),Y}async function xt(){let e=Le();Ne(e);let r=await kt(),t=["--no-sandbox","--disable-gpu","--disable-dev-shm-usage","--allow-file-access-from-files","--allow-file-access","--disable-lcd-text","--font-render-hinting=none"];try{return await r.launch({headless:!0,args:t})}catch{return await new Promise(s=>setTimeout(s,250)),await r.launch({headless:!0,args:t})}}async function St(e){try{await e.addStyleTag({content:vt()})}catch(r){console.warn("Failed to apply deterministic CSS:",r)}}async function $e(e,r,t){let o=await(await e.newContext({viewport:r||{width:1280,height:720},...t||{}})).newPage();return await St(o),o}var q,Y,ae,Ue=z(()=>{"use strict";_e();q=null,Y=null,ae=null});function jt(e,r=1e4){let t=[];return t.push("(function(){"),t.push(`const selector = ${JSON.stringify(e)};`),t.push(`const maxNodes = ${JSON.stringify(r)};`),t.push("function fnv1aBase36(input){"),t.push(" let hash = 0x811c9dc5;"),t.push(" for (let i=0;i<input.length;i++){"),t.push(" hash ^= input.charCodeAt(i);"),t.push(" hash = Math.imul(hash, 0x01000193);"),t.push(" }"),t.push(" return (hash >>> 0).toString(36);"),t.push("}"),t.push("function domPathSignature(el, root){"),t.push(" const parts=[];"),t.push(" let cur=el;"),t.push(" while(cur && cur!==root){"),t.push(" const parent=cur.parentElement;"),t.push(" if(!parent) break;"),t.push(" const tag=cur.tagName.toLowerCase();"),t.push(" const siblings=Array.from(parent.children).filter(c=>c.tagName.toLowerCase()===tag);"),t.push(" const idx=Math.max(0,siblings.indexOf(cur));"),t.push(" parts.push(`${tag}:${idx}`);"),t.push(" cur=parent;"),t.push(" }"),t.push(" parts.push(root.tagName.toLowerCase());"),t.push(' return parts.reverse().join("/");'),t.push("}"),t.push("function hasStableIdentity(el){"),t.push(" return Boolean("),t.push(' el.getAttribute("data-figma-id") ||'),t.push(' el.getAttribute("data-llynt-node-id") ||'),t.push(' el.getAttribute("data-component") ||'),t.push(' el.getAttribute("data-testid") ||'),t.push(" el.id"),t.push(" );"),t.push("}"),t.push("function assignIds(){"),t.push(" const root = document.querySelector(selector) || document.body;"),t.push(" if(!root) return 0;"),t.push(" const used=new Set();"),t.push(" let assigned=0;"),t.push(" const walker=document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);"),t.push(" let node=walker.currentNode;"),t.push(" let seen=0;"),t.push(" while(node){"),t.push(" const el=node;"),t.push(" if(el && el instanceof Element){"),t.push(" seen++;"),t.push(" if(seen>maxNodes) break;"),t.push(" if(!hasStableIdentity(el)){"),t.push(" const sig=domPathSignature(el, root);"),t.push(" const hash=fnv1aBase36(sig);"),t.push(" const tag=el.tagName.toLowerCase();"),t.push(" let id=`llynt-${tag}-${hash}`;"),t.push(' if(used.has(id)){ id = `${id}-${fnv1aBase36(id+":"+seen)}`; }'),t.push(" used.add(id);"),t.push(' el.setAttribute("data-llynt-node-id", id);'),t.push(" assigned++;"),t.push(" } else {"),t.push(' const existing = el.getAttribute("data-llynt-node-id") || el.getAttribute("data-figma-id") || el.getAttribute("data-component") || el.getAttribute("data-testid") || el.id;'),t.push(" if(existing) used.add(existing);"),t.push(" }"),t.push(" }"),t.push(" node = walker.nextNode();"),t.push(" }"),t.push(" return assigned;"),t.push("}"),t.push("try { assignIds(); } catch {}"),t.push("})();"),t.join(`
4
- `)}async function Be(e,r,t){let s=jt(r||"body",t?.maxNodes??1e4);await e.addInitScript(s),await e.evaluate(s)}var Te=z(()=>{"use strict"});var Ve={};Ge(Ve,{runHostedThinClientChecks:()=>At});async function At(e){let r=e.repoRoot??process.cwd(),t=e.artifactDir??"tools/artifacts/llynt",s=e.timeoutMs??3e4,o=e.computedStyleMode??"essential",d=e.internComputedStyles??!0,m=e.maxNodes,i=!!e.allowTruncated,l=!!(e.traceOnFailure??process.env.LLYNT_TRACE_ON_FAILURE==="1"),f=null;try{f=await Oe();let g=[];for(let u of e.targets){let P=u.selector??"body",L=u.viewports?.length?u.viewports:[{width:360,height:720},{width:768,height:720}],S=await $e(f),N=S.context(),y=!1,w;try{if(l)try{await N.tracing.start({screenshots:!0,snapshots:!0,sources:!1}),y=!0}catch{y=!1}S.setDefaultTimeout(s),await S.goto(u.url,{waitUntil:"domcontentloaded"});let v=[];for(let A of L){await S.setViewportSize(A),await S.waitForTimeout(50),await Be(S,P);let M=await Ie(S,{url:u.url,selector:P,viewport:A},{computedStyleMode:o,internComputedStyles:d,...typeof m=="number"?{maxNodes:m}:{}});if(!i&&M.stats?.truncated)throw new Error(`Extraction truncated for ${u.url} at ${A.width}x${A.height}. Narrow the selector scope or increase limits (free-tier should be component-scoped).`);v.push(M)}let _=await Ce(e.client,{_schemaVersion:"llynt-hosted-check@0",blobs:v,rules:{overlap:!0,viewport:!0}}),H=_.issues.some(A=>A.severity==="error");if(y&&H){let A=u.url.toLowerCase().replace(/https?:\/\//g,"").replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,64)||"target";w=J.resolve(r,J.join(t,`trace-hosted-${A}.zip`))}g.push({url:u.url,selector:P,viewports:L,blobs:v,response:_,tracePath:w})}finally{if(y)try{w?(Me.mkdirSync(J.dirname(w),{recursive:!0}),await N.tracing.stop({path:w})):await N.tracing.stop()}catch{}await N.close().catch(()=>{})}}return g}finally{await f?.close().catch(()=>{})}}var Me,J,De=z(()=>{"use strict";Me=E(require("fs")),J=E(require("path"));Re();Ue();de();Te()});var ye={name:"llynt",version:"0.1.2",private:!0,description:"Llynt \u2013 UI integrity engine (token/scale drift, SARIF, evidence packs)",license:"UNLICENSED",type:"commonjs",main:"dist/src/index.js",bin:{llynt:"dist/src/cli/index.js"},files:[],scripts:{build:`tsc -p tsconfig.json && node -e "const f='dist/src/cli/index.js';const c=require('fs').readFileSync(f,'utf8');if(!c.startsWith('#!'))require('fs').writeFileSync(f,'#!/usr/bin/env node\\n'+c)"`,typecheck:"tsc -p tsconfig.json --noEmit","build:cli":"npx esbuild src/cli/cli-thin.ts --bundle --platform=node --target=node18 --format=cjs --minify --tree-shaking=true --external:playwright --outfile=dist/npm/cli.js --banner:js='#!/usr/bin/env node' --legal-comments=none","build:lambda":"npx esbuild src/platform/hosted/lambda-handler.ts --bundle --platform=node --target=node22 --outfile=dist/lambda/handler.js --format=cjs --external:@aws-sdk/client-dynamodb --external:@aws-sdk/client-s3 --external:@aws-sdk/lib-dynamodb",cli:"node dist/src/cli/index.js","bundle:action":"npm run build && ncc build dist/src/cli/action.js -o dist-action --license licenses.txt","test:smoke:core":"node scripts/run-core-smoke-strict.js","routine:run":"npm run build && node dist/src/cli/index.js workflow routine-run --routine onboarding --dry-run --execution-class scaffolded_external","demo:no-figma":"npm run build && tsc -p tsconfig.tests.json && node dist/src/cli/index.js validate --repo-root . --artifact-dir tools/artifacts/evidence-lab/solidcopy --css-vars tools/evidence-lab/fixtures/instances/tokens.css --dtcg tools/evidence-lab/fixtures/instances/tokens.dtcg.json --tailwind-json tools/evidence-lab/fixtures/instances/tailwind.theme.json --include-json tools/evidence-lab/fixtures/instances/include.json && node dist-tests/tools/smoke/tests/runtime-smoke.js && node dist/tools/internal/run.js standardize --snapshot-dir tools/artifacts/evidence-lab/solidcopy","demo:evidence":"npm run demo:no-figma","demo:bundle":"node scripts/bundle-artifacts.js","demo:scoreboard":"node scripts/demo-scoreboard.js","demo:storybook":"node scripts/public-storybook-harness.js --dry-run","demo:verify":"node scripts/compare-ground-truth.js","demo:gallery":"node scripts/gallery-build.js --link","demos:build":"node scripts/demos-build.js","onboarding:setup-repo":"node tools/internal/scripts/setup-onboarding-repo.js","demo318:setup-repo":"npm run onboarding:setup-repo","demo:harvest":"node scripts/harvest-storybook.js","battle:bootstrap:external":"node tools/evidence-lab/scripts/bootstrap-external-corpus-truth.js","hosted:preflight":"node tools/internal/scripts/hosted-preflight.js","browser:preflight":"node dist/tools/internal/run.js browser preflight --json",doctor:"node dist/tools/internal/run.js doctor --json","hosted:smoke:remote":"node tools/internal/scripts/hosted-remote-smoke.js","check:capabilities":"node tools/internal/scripts/check-capability-registry.js","docs:ip-check":"node scripts/check-docs-publish-boundary.js","docs:reference":"npm run build && node scripts/generate-reference-docs.js","docs:site:prepare":"npm run docs:reference && node scripts/sync-reference-docs.js && npm run docs:ip-check","docs:dev":"npm run docs:site:prepare && vitepress dev docs/site","docs:build":"npm run docs:site:prepare && vitepress build docs/site","docs:preview":"vitepress preview docs/site","gate:real-external":"node tools/internal/scripts/verify-execution-class.js --manifest tools/artifacts/routines/latest-manifest.json --required real_external","test:routine-runtime-gates":"node dist-tests/tools/smoke/tests/routine-runtime-gates-smoke.js","gate:real-external-proof":"node tools/internal/scripts/require-real-external-proof.js","test:routine-real-external":"npm run build && node dist/src/cli/index.js workflow routine-run --routine onboarding --dry-run --execution-class real_external --out tools/artifacts/routines/latest-manifest.real_external.json && npm run gate:real-external-proof","test:onboarding-auth-mode":"node dist-tests/tools/smoke/tests/onboarding-auth-mode-smoke.js","test:hosted-runs-api-smoke":"node dist-tests/tools/smoke/tests/hosted-runs-api-smoke.js","ide:surface-pack":"node scripts/ide-surface-pack-build.js","ide:host-runtime-proof:capture":"node scripts/ide-host-runtime-proof-capture.js","ide:host-runtime-proof-lint":"node tools/internal/scripts/ide-host-runtime-proof-lint.js","github:agentic-workflow-pack":"node scripts/github-agentic-workflow-pack.js","github:agentic-runtime-proof:capture":"node scripts/github-agentic-runtime-proof-capture.js","github:agentic-runtime-proof-lint":"node tools/internal/scripts/github-agentic-runtime-proof-lint.js","test:ide-surface-pack-smoke":"node dist-tests/tools/smoke/tests/ide-surface-pack-smoke.js","test:ide-host-parity-audit-smoke":"node dist-tests/tools/smoke/tests/ide-host-parity-audit-smoke.js","test:ide-host-runtime-proof-capture-smoke":"node dist-tests/tools/smoke/tests/ide-host-runtime-proof-capture-smoke.js","test:ide-host-runtime-proof-lint-smoke":"node dist-tests/tools/smoke/tests/ide-host-runtime-proof-lint-smoke.js","test:github-agentic-workflow-pack-smoke":"node dist-tests/tools/smoke/tests/github-agentic-workflow-pack-smoke.js","test:github-agentic-runtime-proof-capture-smoke":"node dist-tests/tools/smoke/tests/github-agentic-runtime-proof-capture-smoke.js","test:onboarding-key-ops-contract":"node dist-tests/tools/smoke/tests/onboarding-key-ops-contract-smoke.js","test:routine-choreography":"node dist-tests/tools/smoke/tests/routine-choreography-smoke.js","test:onboarding-scorecard":"node tools/internal/scripts/onboarding-scorecard-build.js --enforce","test:real-external-scorecard":"node tools/internal/scripts/real-external-scorecard-build.js --enforce --min-passes 3","real-external:scorecard":"node tools/internal/scripts/real-external-scorecard-build.js","real-external:init-run":"node scripts/real-external-run-init.js","onboarding:scorecard":"node tools/internal/scripts/onboarding-scorecard-build.js","test:fixture-archetype-catalog":"node dist-tests/tools/smoke/tests/fixture-archetype-catalog-smoke.js","test:fixture-archetype-runtime":"node dist-tests/tools/smoke/tests/fixture-archetype-runtime-smoke.js","test:mcp-tier-guidance":"node dist-tests/tools/smoke/tests/mcp-tier-guidance-smoke.js","test:mcp-tier-guidance-retry":"node dist-tests/tools/smoke/tests/mcp-tier-guidance-retry-smoke.js","test:collections-runtime":"node dist-tests/tools/smoke/tests/collections-runtime-smoke.js","test:onboarding-preflight-runtime":"node dist-tests/tools/smoke/tests/onboarding-preflight-runtime-smoke.js","test:mcp-init-bootstrap-contract-smoke":"node dist-tests/tools/smoke/tests/mcp-init-bootstrap-contract-smoke.js","test:beta-scenario-coverage":"node tools/internal/scripts/beta-scenario-coverage-gate.js --enforce","beta:scenario-coverage":"node tools/internal/scripts/beta-scenario-coverage-gate.js","beta:closure-report":"node tools/internal/scripts/beta-recovery-closure-report.js","test:non-curated-pack-runner":"node dist-tests/tools/smoke/tests/non-curated-pack-runner-smoke.js","non-curated:plan":"node tools/evidence-lab/scripts/non-curated-pack-runner.js","routine:gate-decision":"node dist/src/cli/index.js workflow gate-decision","pr:execution-contract":"node dist/src/cli/index.js workflow pr-execution-contract","pr:impact-stateid-policy":"node dist/tools/internal/release/run.js pr-impact-stateid-policy","non-curated:metrics":"node tools/evidence-lab/scripts/non-curated-metrics-build.js","test:real-external-proof-lint":"node tools/internal/scripts/real-external-proof-lint.js --enforce","real-external:proof-lint":"node tools/internal/scripts/real-external-proof-lint.js","real-external:finalize-run":"node scripts/real-external-run-finalize.js","test:real-external-finalize":"node dist-tests/tools/smoke/tests/real-external-finalize-smoke.js","beta:next-actions":"node tools/internal/scripts/beta-recovery-next-actions.js","beta:status":"node tools/internal/scripts/beta-recovery-status.js","beta:refresh":"node tools/internal/scripts/beta-recovery-refresh.js","test:beta-refresh":"node dist-tests/tools/smoke/tests/beta-recovery-refresh-smoke.js","real-external:validate-run":"node scripts/real-external-run-validate.js","test:real-external-validate":"node dist-tests/tools/smoke/tests/real-external-run-validate-smoke.js","non-curated:init-run":"node tools/evidence-lab/scripts/non-curated-init-run.js","real-external:guide":"node scripts/real-external-run-guide.js","onboarding:attempt-import":"node scripts/onboarding-attempt-import.js","test:onboarding-attempt-import":"node dist-tests/tools/smoke/tests/onboarding-attempt-import-smoke.js","real-external:import-onboarding-attempt":"node scripts/real-external-import-onboarding-attempt.js","test:real-external-import-onboarding-attempt":"node dist-tests/tools/smoke/tests/real-external-import-onboarding-attempt-smoke.js","test:action-plan-rollup":"node dist-tests/tools/smoke/tests/action-plan-rollup-smoke.js","test:blocker-remediation-coverage-smoke":"node dist-tests/tools/smoke/tests/blocker-remediation-coverage-smoke.js","test:mcp-onboarding-contract-errors-smoke":"node dist-tests/tools/smoke/tests/mcp-onboarding-contract-errors-smoke.js","test:mcp-redaction-smoke":"node dist-tests/tools/smoke/tests/mcp-redaction-smoke.js","test:profile-surface-smoke":"node dist-tests/tools/smoke/tests/profile-surface-smoke.js","probabilistic:harness":"node scripts/run-probabilistic-agent-harness.js","mutation:audit":"node tools/evidence-lab/scripts/mutation-intent-audit.js","mutation:reconcile":"node tools/evidence-lab/scripts/mutation-truth-reconcile.js","correlation:root-cause":"node tools/evidence-lab/scripts/correlated-cluster-build.js","state-graph:build":"node tools/evidence-lab/scripts/state-graph-build.js","actionset:trace":"node tools/evidence-lab/scripts/actionset-trace-build.js","planner:seed-reduction":"node tools/evidence-lab/scripts/render-predicate-planner-build.js","discovery:flow-graph":"node tools/evidence-lab/scripts/discovery-flow-graph-build.js","l2:macro-coverage":"node dist/tools/internal/release/run.js l2-macro-coverage","l2:component-category-coverage":"node dist/tools/internal/release/run.js l2-component-category-coverage","l2:surface-bundle-map":"node dist/tools/internal/release/run.js l2-surface-bundle-map","network:scenario-runner":"node tools/evidence-lab/scripts/network-scenario-runner.js","seed:design-kit-harvest":"node tools/evidence-lab/scripts/design-kit-seed-harvester.js","chaos:mutation-sim":"node tools/evidence-lab/scripts/chaos-mutation-simulator.js","gauntlet:factory":"node tools/evidence-lab/scripts/gauntlet-factory.js","react:intake-normalize":"node tools/evidence-lab/scripts/real-react-intake-normalize.js","gallery:corpus-build":"node tools/evidence-lab/scripts/gallery-corpus-build.js","evidence-lab":"npx tsx tools/evidence-lab/pipeline.ts run","evidence-lab:status":"npx tsx tools/evidence-lab/pipeline.ts status","evidence-lab:gallery":"npx tsx tools/evidence-lab/pipeline.ts run --stage 4","evidence-lab:chaos":"npx tsx tools/evidence-lab/pipeline.ts run --stage 3","v0:operator-usability":"node tools/evidence-lab/scripts/v0-operator-usability-loop.js","audit:smoke-truth":"node scripts/smoke-truth-audit.js","audit:smoke-disposition":"node scripts/smoke-disposition-audit.js","replay:recipes":"node scripts/replay-recipe-build.js","replay:repro-gate":"node tools/internal/scripts/replay-repro-gate.js","core:quality-floor":"node dist/tools/internal/run.js core-quality-floor","invariant:coverage-gap":"node dist/tools/internal/run.js invariant-coverage-gap","test:core-invariant-quality-floor":"node dist/tools/internal/run.js core-quality-floor --enforce","test:invariant-coverage-gap":"node dist/tools/internal/run.js invariant-coverage-gap --enforce","test:l2-macro-profile-coverage-smoke":"node dist-tests/tools/smoke/tests/l2-macro-profile-coverage-smoke.js","test:l2-component-category-coverage-smoke":"node dist-tests/tools/smoke/tests/l2-component-category-coverage-smoke.js","test:l2-surface-bundle-map-smoke":"node dist-tests/tools/smoke/tests/l2-surface-bundle-map-smoke.js","test:network-scenario-runner-smoke":"node dist-tests/tools/smoke/tests/network-scenario-runner-smoke.js","test:chaos-mutation-simulator-smoke":"node dist-tests/tools/smoke/tests/chaos-mutation-simulator-smoke.js","test:gauntlet-factory-smoke":"node dist-tests/tools/smoke/tests/gauntlet-factory-smoke.js","test:real-react-intake-normalize-smoke":"node dist-tests/tools/smoke/tests/real-react-intake-normalize-smoke.js","test:gallery-corpus-build-smoke":"node dist-tests/tools/smoke/tests/gallery-corpus-build-smoke.js","test:replay-repro-gate-smoke":"node dist-tests/tools/smoke/tests/replay-repro-gate-smoke.js","test:pr-execution-contract-smoke":"node dist-tests/tools/smoke/tests/pr-execution-contract-smoke.js","test:pr-impact-stateid-policy-smoke":"node dist-tests/tools/smoke/tests/pr-impact-stateid-policy-smoke.js","onboarding:accuracy":"node tools/internal/scripts/onboarding-accuracy-eval.js","test:onboarding-accuracy":"node tools/internal/scripts/onboarding-accuracy-eval.js --enforce","onboarding:harness-matrix:run":"node tools/internal/scripts/onboarding-harness-matrix-run.js","onboarding:harness-matrix:eval":"node tools/internal/scripts/onboarding-harness-matrix-eval.js","test:onboarding-harness-matrix":"node dist-tests/tools/smoke/tests/onboarding-harness-matrix-smoke.js","evidence:freshness":"node dist/tools/internal/run.js evidence-freshness","test:evidence-freshness":"node dist/tools/internal/run.js evidence-freshness --enforce","canary:run":"node scripts/real-target-canary-run.js","canary:drift-gate":"node tools/internal/scripts/real-target-canary-drift-gate.js --enforce","canary:nightly":"npm run canary:run -- --enforce && npm run canary:drift-gate","benchmark:wall-time":"node tools/internal/scripts/wall-time-benchmark.js","test:concurrent-pr-isolation":"node tools/internal/scripts/concurrent-pr-isolation-test.js --enforce","test:real-target-canary-run-smoke":"node dist-tests/tools/smoke/tests/real-target-canary-run-smoke.js","gate:required-r1-claims":"node tools/internal/scripts/required-r1-claim-gate.js --enforce","test:unit":"vitest run","test:check-command-smoke":"npx tsc --target ES2022 --module commonjs --moduleResolution node --esModuleInterop --resolveJsonModule --skipLibCheck --types node --outDir dist-tests --rootDir . tools/smoke/tests/check-command-smoke.ts && node dist-tests/tools/smoke/tests/check-command-smoke.js","test:hosted-signup-smoke":"npx tsc --target ES2022 --module commonjs --moduleResolution node --esModuleInterop --resolveJsonModule --skipLibCheck --types node --outDir dist-tests --rootDir . tools/smoke/tests/hosted-signup-smoke.ts && node dist-tests/tools/smoke/tests/hosted-signup-smoke.js","site:llynt-dev:build":"npm --prefix src/brand/logo-animation run build",adversarial:"npm run build && npx tsx tools/evidence-lab/adversarial/run-all.ts"},dependencies:{"@actions/core":"^2.0.3","@modelcontextprotocol/sdk":"^1.26.0",commander:"^12.1.0",minimatch:"^9.0.5",playwright:"^1.45.0",zod:"^4.3.6"},devDependencies:{"@aws-sdk/client-dynamodb":"^3.1004.0","@aws-sdk/client-s3":"^3.1004.0","@aws-sdk/lib-dynamodb":"^3.1004.0","@types/node":"^20.11.30","@vercel/ncc":"^0.38.1",esbuild:"^0.27.3",typescript:"^5.4.5","vite-tsconfig-paths":"^4.3.2",vitepress:"^1.6.4",vitest:"^3.2.4"},overrides:{qs:"^6.14.2"}};function be(e){let r={};for(let t=0;t<e.length;t++){let s=e[t];if(!s.startsWith("--"))continue;let o=s.slice(2),d=e[t+1];!d||d.startsWith("--")?r[o]=!0:(r[o]=d,t++)}return r}function re(e){if(e==null)return!1;if(typeof e=="boolean")return e;let r=String(e).trim().toLowerCase();return!(r===""||r==="0"||r==="false"||r==="no"||r==="off")}function we(e){return e.replace(/\s+/g," ").trim()}function Ze(e){return e.replace(/\bllynt-[a-z]+-[a-z0-9]+\b/g,r=>{let t=r.split("-");return t.length>=2?`<${t[1]}>`:r})}function ke(e){let r=we(String(e.message??""));return r||`${we(String(e.ruleId??"unknown.rule"))} violation`}function et(e){return Ze(ke(e))}function tt(e){return e.length?e.map(r=>`${r.width}px`).join(", "):""}function ve(e){let r=e.issues.filter(l=>l.severity==="error"),t=e.issues.filter(l=>l.severity==="warning"),s=e.issues.filter(l=>l.severity==="info"),o=e.issues.length,d=e.viewports.length,m=tt(e.viewports),i=[];if(i.push(`llynt check ${e.url}`),i.push(""),e.rulesChecked!=null&&e.rulesAvailable!=null&&i.push(` ${e.rulesChecked} of ${e.rulesAvailable} rules checked${e.isAnonymous?" (anonymous)":""}`),i.push(` Capturing... ${d} viewport${d!==1?"s":""}${m?` (${m})`:""}`),i.push(` Analyzing... ${Math.max(0,Math.floor(e.nodeCount))} nodes, ${Math.max(0,Math.floor(e.costUnits))} cost units`),e.truncated&&i.push(" Note: Capture was truncated due to DOM limits."),i.push(""),o===0?i.push(" 0 issues found"):(i.push(` ${o} issues across ${d} viewport${d!==1?"s":""}`),i.push(` ${r.length} errors \xB7 ${t.length} warnings \xB7 ${s.length} info`)),i.push(""),e.reportUrl){let l=e.reportExpiresAt?` (expires ${e.reportExpiresAt.slice(0,10)})`:"";i.push(` Report: ${e.reportUrl}${l}`),i.push("")}if(o>0){let l=new Set,f=[];for(let g of[...r,...t,...s]){let u=et(g);!l.has(u)&&f.length<5&&(l.add(u),f.push(u))}if(f.length>0){i.push(" Top issues:");for(let u of f)i.push(` ${u}`);let g=o-f.length;g>0&&i.push(` ... and ${g} more (see report)`),i.push("")}e.gatedIssueCount&&e.gatedIssueCount>0&&(i.push(` ${e.gatedIssueCount} more issues found with full analysis \u2014 sign up at llynt.dev`),i.push(""))}return e.isAnonymous?(i.push(" Sign up free at https://llynt.dev for 28 rules, 2 viewports, 70 checks/week."),i.push(" Then: export LLYNT_API_KEY=<your-key>"),i.push("")):o>0&&(i.push(" Want full SARIF evidence + agent-ready fixes?"),i.push(" Set up the PR gate \u2014 your agent can do it:"),i.push(" npx llynt init --github")),i.join(`
5
- `).trimEnd()}function xe(e){let r={error:0,warning:1,info:2},t=e.issues.map(m=>({severity:m.severity,ruleId:m.ruleId,message:ke(m)})).sort((m,i)=>(r[m.severity]??3)-(r[i.severity]??3)),s=t.filter(m=>m.severity==="error").length,o=t.filter(m=>m.severity==="warning").length,d=t.length-s-o;return{url:e.url,viewports:e.viewports,nodeCount:Math.max(0,Math.floor(e.nodeCount)),costUnits:Math.max(0,Math.floor(e.costUnits)),issueCount:t.length,errors:s,warnings:o,infos:d,truncated:!!e.truncated,issues:t,gatedIssueCount:Math.max(0,Math.floor(e.gatedIssueCount??0)),...e.reportUrl?{reportUrl:e.reportUrl}:{},...e.reportExpiresAt?{reportExpiresAt:e.reportExpiresAt}:{},...e.rulesChecked!=null?{rulesChecked:e.rulesChecked,rulesAvailable:e.rulesAvailable}:{}}}async function Se(e){try{let r=e.to.trim();if(!r||typeof fetch!="function")return;let t=`llynt check report \u2014 ${e.url}`,s=[`Your UI check found ${e.issueCount} issue${e.issueCount===1?"":"s"}.`,`View report: ${e.reportUrl}`,"","Want full SARIF evidence + agent-ready fixes?","Set up the PR gate: npx llynt init --github"].join(`
6
- `);await fetch("https://formsubmit.co/ajax/hello@llynt.dev",{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({email:r,_subject:t,message:s})})}catch{}}var rt=E(require("http")),st=E(require("https"));function se(e){let r=e.trim();if(!r)throw new Error("LLYNT_API_URL is empty");let t=new URL(r),s=t.pathname.replace(/\/+$/g,"");s.endsWith("/v1/check")&&(s=s.slice(0,s.length-9)),t.pathname=s||"/",t.search="",t.hash="";let o=t.pathname==="/"?"":t.pathname.replace(/\/+$/g,"");return`${t.origin}${o}`}function ot(e,r,t,s){return new Promise((o,d)=>{let i=(e.protocol==="https:"?st:rt).request({...r,protocol:e.protocol,hostname:e.hostname,port:e.port,path:e.pathname+e.search},l=>{let f=[];l.on("data",g=>f.push(g)),l.on("end",()=>o({statusCode:l.statusCode??0,body:Buffer.concat(f)}))});i.on("error",d),i.setTimeout(s,()=>i.destroy(new Error(`Report upload timed out after ${s}ms`))),i.end(t)})}async function je(e,r,t){try{let s=se(e),o=new URL(`${s}/reports`),d=1e4,m=Buffer.from(JSON.stringify(t),"utf8"),i=await ot(o,{method:"POST",headers:{"content-type":"application/json",accept:"application/json","content-length":String(m.length),"user-agent":"llynt-check-report-upload/0",...r?{authorization:`Bearer ${r}`}:{}}},m,d);if(i.statusCode<200||i.statusCode>=300)return null;let l=JSON.parse(i.body.toString("utf8"));return!l||typeof l.reportUrl!="string"||typeof l.expiresAt!="string"?null:l}catch{return null}}de();var ne=["marketing","app_shell","auth","onboarding","forms","checkout","billing","dashboard"];var B={profile:"PRODUCTION"},T={rules:{"token.color":"warning","token.spacing":"warning","token.typography":"warning"}},pe={marketing:{...B,surface:"marketing",...T},app_shell:{...B,surface:"app_shell",...T,ruleSeverityOverrides:{"dom.modal.scrollLock":"error"}},auth:{...B,surface:"auth",...T,ruleSeverityOverrides:{"dom.a11y.contrast":"error","dom.a11y.hitTarget":"error","dom.text.overflow":"error","dom.protected.clipping":"error","dom.modal.scrollLock":"error"}},onboarding:{...B,surface:"onboarding",...T,ruleSeverityOverrides:{"dom.a11y.hitTarget":"error","dom.text.overflow":"error","dom.protected.occlusion":"error","dom.modal.scrollLock":"error"}},forms:{...B,surface:"forms",...T,ruleSeverityOverrides:{"dom.a11y.hitTarget":"error","dom.a11y.contrast":"error","dom.text.overflow":"error","dom.form.errorAssociation":"error"}},checkout:{...B,surface:"checkout",...T,ruleSeverityOverrides:{"dom.a11y.hitTarget":"error","dom.a11y.contrast":"error","dom.protected.occlusion":"error","dom.protected.clipping":"error","dom.protected.overlap.interactive":"error","dom.form.errorAssociation":"error","dom.table.headerAlignment":"error","dom.modal.scrollLock":"error"}},billing:{...B,surface:"billing",...T,ruleSeverityOverrides:{"dom.text.overflow":"error","dom.viewport.horizontalOverflow":"error","dom.form.errorAssociation":"error","dom.table.headerAlignment":"error"}},dashboard:{...B,surface:"dashboard",...T,ruleSeverityOverrides:{"dom.viewport.horizontalOverflow":"error","dom.protected.occlusion":"error","dom.table.headerAlignment":"error"}}};function pt(e){return e.trim().toLowerCase().replace(/[\s-]+/g,"_")}function mt(e){return ne.includes(e)}function ht(e){if(!e)return null;let r=pt(e);return mt(r)?{name:r,policy:pe[r]}:null}function ft(e,r){if(!(!e&&!r))return e?r?{...e,...r,runtime:{...e.runtime??{},...r.runtime??{}},importanceOverrides:{...e.importanceOverrides??{},...r.importanceOverrides??{}},rules:{...e.rules??{},...r.rules??{}},ruleSeverityOverrides:{...e.ruleSeverityOverrides??{},...r.ruleSeverityOverrides??{}},allowRawValues:r.allowRawValues??e.allowRawValues}:e:r}function Ee(e,r){if(!e&&!r)return r;let t=ht(e);if(e&&!t)throw new Error(`Unknown surface profile: ${e}. Expected one of: ${ne.join(", ")}`);return ft(t?.policy,r)}var Ct=0,Et=2,R=3,He=[{width:360,height:720},{width:768,height:720}],Pt=[{width:360,height:720}];function It(e){for(let r=0;r<e.length;r++){let t=e[r];if(!t.startsWith("--"))return t;let s=e[r+1];s&&!s.startsWith("--")&&(r+=1)}}function Rt(e){if(typeof e!="string"||!e.trim())return He;let r=e.split(",").map(t=>t.trim()).filter(Boolean).map(t=>{let s=t.match(/^(\d{2,5})x(\d{2,5})$/i);if(!s)throw new Error(`Invalid viewport "${t}". Expected format WIDTHxHEIGHT.`);return{width:Number(s[1]),height:Number(s[2])}});return r.length?r:He}function Lt(e,r){if(!r)return e;let s=Ee(r,void 0)?.ruleSeverityOverrides;return s?e.map(o=>{let d=s[o.ruleId];return d!=="error"&&d!=="warning"||d===o.severity?o:{...o,severity:d}}):e}function Nt(e){let r=e instanceof Error?e.message:String(e);return r.includes("Cannot find module 'playwright'")||r.includes("Cannot find package 'playwright'")||r.includes("ERR_MODULE_NOT_FOUND")}function _t(e,r){let t=r instanceof Error?r.message:String(r);return t.includes("ERR_CONNECTION_REFUSED")?`Error: Could not reach ${e}
2
+ "use strict";var qe=Object.create;var ue=Object.defineProperty;var We=Object.getOwnPropertyDescriptor;var Ye=Object.getOwnPropertyNames;var Je=Object.getPrototypeOf,Ke=Object.prototype.hasOwnProperty;var z=(e,r)=>()=>(e&&(r=e(e=0)),r);var Ge=(e,r)=>{for(var t in r)ue(e,t,{get:r[t],enumerable:!0})},Xe=(e,r,t,s)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of Ye(r))!Ke.call(e,o)&&o!==t&&ue(e,o,{get:()=>r[o],enumerable:!(s=We(r,o))||s.enumerable});return e};var A=(e,r,t)=>(t=e!=null?qe(Je(e)):{},Xe(r||!e||!e.__esModule?ue(t,"default",{value:e,enumerable:!0}):t,e));function Ae(e){let r=e.trim();if(!r)throw new Error("LLYNT_API_URL is empty");return r.includes("/v1/check")?r:r.replace(/\/+$/g,"")+"/v1/check"}function at(e){return new Promise((r,t)=>{oe.gzip(e,(s,o)=>{s?t(s):r(o)})})}function lt(e){return new Promise((r,t)=>{oe.brotliCompress(e,(s,o)=>{s?t(s):r(o)})})}function ct(e,r,t,s){return new Promise((o,d)=>{let i=(e.protocol==="https:"?it:nt).request({...r,protocol:e.protocol,hostname:e.hostname,port:e.port,path:e.pathname+e.search},l=>{let f=[];l.on("data",y=>f.push(y)),l.on("end",()=>{o({statusCode:l.statusCode??0,body:Buffer.concat(f)})})});i.on("error",l=>d(l)),i.setTimeout(s,()=>{i.destroy(new Error(`Hosted API request timed out after ${s}ms`))}),i.end(t)})}async function Ce(e,r){let t=new URL(e.apiUrl),s=e.timeoutMs??3e4,o=Buffer.from(JSON.stringify(r),"utf8"),d=e.compression??"gzip",m=d==="identity"?o:d==="br"?await lt(o):await at(o),i={"content-type":"application/json",accept:"application/json","user-agent":"llynt-hosted-client/0","content-length":String(m.length)};d!=="identity"&&(i["content-encoding"]=d),e.apiKey&&(i.authorization=`Bearer ${e.apiKey}`);let{statusCode:l,body:f}=await ct(t,{method:"POST",headers:i},m,s),y=f.toString("utf8");if(l<200||l>=300)throw new Error(`Hosted API error (${l}): ${y.slice(0,500)}`);let u=JSON.parse(y);if(!u||u._schemaVersion!=="llynt-hosted-check-result@0"||!Array.isArray(u.issues))throw new Error("Hosted API response schema mismatch");return u}var nt,it,oe,de=z(()=>{"use strict";nt=A(require("http")),it=A(require("https")),oe=A(require("zlib"))});async function Re(e,r,t){let s=t?.maxDepth??gt,o=t?.maxNodes??yt,d=typeof t?.includeComputedStyles=="boolean"?t.includeComputedStyles?"all":"none":t?.computedStyleMode??"essential",m=Array.isArray(t?.computedStyleProps)?t.computedStyleProps:void 0,i=t?.internComputedStyles??!0,l=t?.includeUrlAttributes??!1,f=t?.redactUrlAttributes??!0,y=await e.evaluate(({selector:P,maxDepth:L,maxNodes:j,computedStyleMode:N,computedStyleProps:g,essentialProps:b,internComputedStyles:v,includeUrlAttributes:_,redactUrlAttributes:H})=>{function C(a){let c=2166136261;for(let h=0;h<a.length;h++)c^=a.charCodeAt(h),c=Math.imul(c,16777619);return(c>>>0).toString(36)}function M(a){let c=Object.keys(a).sort(),h=[];for(let n of c)h.push(`${n}=${a[n]}`);return h.join(";")}function le(a){try{let c=new URL(a,document.baseURI);return c.protocol==="http:"||c.protocol==="https:"?`${c.protocol}//${c.host}${c.pathname}`:c.protocol==="data:"?"data:[redacted]":c.protocol==="blob:"?"blob:[redacted]":`${c.protocol}[redacted]`}catch{return"[redacted]"}}function X(a,c){let h=[],n=a;for(;n&&n!==c;){let p=n.parentElement??null;if(!p)break;let w=n.tagName.toLowerCase(),S=Array.from(p.children).filter(V=>String(V?.tagName??"").toLowerCase()===w),O=Math.max(0,S.indexOf(n));h.push(`${w}:${O}`),n=p}return h.push(c.tagName.toLowerCase()),h.reverse().join("/")}function K(a,c){let h=[],n=a;for(;n&&n!==c;){let p=n.parentElement??null;if(!p)break;let w=n.tagName.toLowerCase(),S=n.id;if(S){h.push(`#${CSS.escape(S)}`);break}let O=Array.from(p.children);if(O.filter(D=>String(D?.tagName??"").toLowerCase()===w).length===1)h.push(w);else{let D=O.indexOf(n)+1;h.push(`${w}:nth-child(${D})`)}n=p}return h.length?h.reverse().join(" > "):c.tagName.toLowerCase()}function Q(a){return!!(a.getAttribute("data-figma-id")||a.getAttribute("data-llynt-node-id")||a.getAttribute("data-component")||a.getAttribute("data-testid")||a.id)}function Z(a,c){let h=a.getAttribute("data-figma-id");if(h)return h;let n=a.getAttribute("data-llynt-node-id");if(n)return n;let p=a.getAttribute("data-component");if(p)return p;let w=a.getAttribute("data-testid");if(w)return w;let S=a.id;if(S)return S;let O=X(a,c),V=C(O);return`llynt-${a.tagName.toLowerCase()}-${V}`}function F(a){let c={};for(let h of Array.from(a.attributes)){let n=h.name;if(n==="id"||n==="class"||n==="role"||n==="alt"||n==="type"||n==="width"||n==="height"||n==="target"||n==="rel"||n==="loading"||n==="name"||n==="autocomplete"||n==="disabled"||n==="required"||n==="placeholder"||n==="for"||n==="tabindex"||n==="lang"||n==="style"||n.startsWith("aria-")||n==="data-figma-id"||n==="data-component"||n==="data-testid"||n==="data-primary"||n.startsWith("data-llynt-")){let p=h.value;typeof p=="string"&&(c[n]=p)}if(n==="href"||n==="src"){let p=h.value;typeof p=="string"&&(p===""||p==="#"||p.startsWith("javascript:")?c[n]=p:p.length>0&&(c[n]=_&&!H?p:le(p)))}}return Object.keys(c).length>0?c:void 0}function ee(a){if(N==="none")return;let c=window.getComputedStyle(a),h={},n=Array.isArray(g)&&g.length?g:N==="essential"?b:null;if(n){for(let p of n){let w=c.getPropertyValue(p);typeof w=="string"&&w.trim()&&(h[p]=w.trim())}return Object.keys(h).length>0?h:void 0}for(let p=0;p<c.length;p++){let w=c[p],S=c.getPropertyValue(w);typeof S=="string"&&S.trim()&&(h[w]=S.trim())}return Object.keys(h).length>0?h:void 0}function k(a){let c=a.getBoundingClientRect();return{left:c.left,top:c.top,width:c.width,height:c.height}}let R=document.querySelector(P||"body")??document.body,G=0,me=!1,he=new Set,te={};function fe(a,c,h){if(G+=1,G>j)return me=!0,null;let n=Q(a),p=Z(a,R);if(he.has(p)){let U=C(p+":"+G);p=`${p}-${U}`}if(he.add(p),!n)try{a.setAttribute("data-llynt-node-id",p)}catch{}let w=ee(a),S;if(v&&w&&Object.keys(w).length){let U=M(w);S=`cs-${C(U)}`,te[S]||(te[S]=w)}let O=K(a,R),V=(a.textContent?.trim()??"").length,D,$=a;($.scrollWidth>$.clientWidth||$.scrollHeight>$.clientHeight)&&(D={scrollWidth:$.scrollWidth,clientWidth:$.clientWidth,scrollHeight:$.scrollHeight,clientHeight:$.clientHeight});let E={nodeId:p,parentId:h,tagName:a.tagName.toLowerCase(),attributes:F(a),bbox:k(a),computed:S?void 0:w,computedRef:S,cssSelector:O,textLen:V>0?V:void 0,scrollOverflow:D,children:[]};if(a.tagName==="IMG"){let U=a;E.naturalWidth=U.naturalWidth,E.naturalHeight=U.naturalHeight}if(c>=L)return E;for(let U of Array.from(a.children)){let ce=fe(U,c+1,p);if(!ce)break;E.children.push(ce)}return E.children.length===0&&delete E.children,E.parentId||delete E.parentId,E.attributes||delete E.attributes,E.computed||delete E.computed,E.computedRef||delete E.computedRef,E}let ge=fe(R,0);if(!ge)return{tree:{nodeId:Z(R,R),tagName:R.tagName.toLowerCase(),bbox:k(R)},stats:{nodeCount:Math.min(G,j),maxDepth:L,maxNodes:j,truncated:!0}};let ze=document.documentElement.getAttribute("lang")||void 0;return{tree:ge,computedStyles:Object.keys(te).length?te:void 0,stats:{nodeCount:Math.min(G,j),maxDepth:L,maxNodes:j,truncated:me},htmlLang:ze}},{selector:r.selector??"body",maxDepth:s,maxNodes:o,computedStyleMode:d,computedStyleProps:m,essentialProps:[...bt],internComputedStyles:i,includeUrlAttributes:l,redactUrlAttributes:f}),u={_schemaVersion:"dom-blob@0",_extractedAt:new Date().toISOString(),target:{url:r.url,selector:r.selector,viewport:r.viewport},tree:y.tree,computedStyles:y.computedStyles,stats:y.stats,htmlLang:y.htmlLang};if(u.stats){u.stats.coverage={completeness:u.stats.truncated?"truncated":"complete",reason:u.stats.truncated?"maxNodes":void 0},u.stats.confidence={extractionCompleteness:u.stats.truncated?"low":"high"};let P={...u,stats:{...u.stats}};delete P.stats.bytesRaw,delete P.stats.bytesGzip,delete P.stats.computedStyleMode,delete P.stats.urlAttributes;let L=Buffer.from(JSON.stringify(P),"utf8"),j=Pe.gzipSync(L);u.stats.bytesRaw=L.length,u.stats.bytesGzip=j.length,u.stats.computedStyleMode=d,u.stats.urlAttributes=l?f?"redacted":"raw":"omitted"}return u}var Pe,gt,yt,bt,Ie=z(()=>{"use strict";Pe=A(require("zlib")),gt=10,yt=1e4,bt=["display","position","overflow","overflow-x","overflow-y","visibility","opacity","width","height","min-width","min-height","max-width","max-height","margin-top","margin-right","margin-bottom","margin-left","padding-top","padding-right","padding-bottom","padding-left","gap","flex-basis","flex-shrink","flex-wrap","align-items","z-index","pointer-events","cursor","font-size","font-family","font-weight","line-height","letter-spacing","text-decoration","text-overflow","white-space","color","background-color","border-width","border-color","border-top-color","border-top-width","border-radius","box-shadow","outline","outline-style","transition-duration","transition-property","aspect-ratio","padding"]});function wt(){let e=ie.platform(),r=ie.homedir();if(e==="darwin")return q.join(r,"Library","Caches","llynt","playwright");if(e==="win32"){let o=process.env.LOCALAPPDATA||process.env.APPDATA||q.join(r,"AppData","Local");return q.join(o,"llynt","playwright")}let t=process.env.XDG_CACHE_HOME,s=t&&t.trim().length>0?t:q.join(r,".cache");return q.join(s,"llynt","playwright")}function Le(){return{source:"llynt",browsersPath:wt()}}function Ne(e){process.env.PLAYWRIGHT_BROWSERS_PATH=e.browsersPath}var ie,q,_e=z(()=>{"use strict";ie=A(require("os")),q=A(require("path"))});async function kt(){return ae||(ae=vt().then(e=>e.chromium).catch(e=>{throw ae=null,e})),ae}async function vt(){try{let{createRequire:e}=await import("module");return e(process.cwd()+"/package.json")("playwright")}catch{return await import("playwright")}}function xt(){return["* {"," animation: none !important;"," transition: none !important;"," scroll-behavior: auto !important;","}","html {"," -webkit-text-size-adjust: 100% !important;","}"].join(`
3
+ `)}async function Oe(){if(W&&W.isConnected())return W;if(Y)try{let e=await Y;if(e.isConnected())return e}catch{}return Y=jt().then(e=>(W=e,e.on("disconnected",()=>{W===e&&(W=null,Y=null)}),e)).catch(e=>{throw Y=null,e}),Y}async function jt(){let e=Le();Ne(e);let r=await kt(),t=["--no-sandbox","--disable-gpu","--disable-dev-shm-usage","--allow-file-access-from-files","--allow-file-access","--disable-lcd-text","--font-render-hinting=none"];try{return await r.launch({headless:!0,args:t})}catch{return await new Promise(s=>setTimeout(s,250)),await r.launch({headless:!0,args:t})}}async function St(e){try{await e.addStyleTag({content:xt()})}catch(r){console.warn("Failed to apply deterministic CSS:",r)}}async function $e(e,r,t){let o=await(await e.newContext({viewport:r||{width:1280,height:720},...t||{}})).newPage();return await St(o),o}var W,Y,ae,Ue=z(()=>{"use strict";_e();W=null,Y=null,ae=null});function At(e,r=1e4){let t=[];return t.push("(function(){"),t.push(`const selector = ${JSON.stringify(e)};`),t.push(`const maxNodes = ${JSON.stringify(r)};`),t.push("function fnv1aBase36(input){"),t.push(" let hash = 0x811c9dc5;"),t.push(" for (let i=0;i<input.length;i++){"),t.push(" hash ^= input.charCodeAt(i);"),t.push(" hash = Math.imul(hash, 0x01000193);"),t.push(" }"),t.push(" return (hash >>> 0).toString(36);"),t.push("}"),t.push("function domPathSignature(el, root){"),t.push(" const parts=[];"),t.push(" let cur=el;"),t.push(" while(cur && cur!==root){"),t.push(" const parent=cur.parentElement;"),t.push(" if(!parent) break;"),t.push(" const tag=cur.tagName.toLowerCase();"),t.push(" const siblings=Array.from(parent.children).filter(c=>c.tagName.toLowerCase()===tag);"),t.push(" const idx=Math.max(0,siblings.indexOf(cur));"),t.push(" parts.push(`${tag}:${idx}`);"),t.push(" cur=parent;"),t.push(" }"),t.push(" parts.push(root.tagName.toLowerCase());"),t.push(' return parts.reverse().join("/");'),t.push("}"),t.push("function hasStableIdentity(el){"),t.push(" return Boolean("),t.push(' el.getAttribute("data-figma-id") ||'),t.push(' el.getAttribute("data-llynt-node-id") ||'),t.push(' el.getAttribute("data-component") ||'),t.push(' el.getAttribute("data-testid") ||'),t.push(" el.id"),t.push(" );"),t.push("}"),t.push("function assignIds(){"),t.push(" const root = document.querySelector(selector) || document.body;"),t.push(" if(!root) return 0;"),t.push(" const used=new Set();"),t.push(" let assigned=0;"),t.push(" const walker=document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);"),t.push(" let node=walker.currentNode;"),t.push(" let seen=0;"),t.push(" while(node){"),t.push(" const el=node;"),t.push(" if(el && el instanceof Element){"),t.push(" seen++;"),t.push(" if(seen>maxNodes) break;"),t.push(" if(!hasStableIdentity(el)){"),t.push(" const sig=domPathSignature(el, root);"),t.push(" const hash=fnv1aBase36(sig);"),t.push(" const tag=el.tagName.toLowerCase();"),t.push(" let id=`llynt-${tag}-${hash}`;"),t.push(' if(used.has(id)){ id = `${id}-${fnv1aBase36(id+":"+seen)}`; }'),t.push(" used.add(id);"),t.push(' el.setAttribute("data-llynt-node-id", id);'),t.push(" assigned++;"),t.push(" } else {"),t.push(' const existing = el.getAttribute("data-llynt-node-id") || el.getAttribute("data-figma-id") || el.getAttribute("data-component") || el.getAttribute("data-testid") || el.id;'),t.push(" if(existing) used.add(existing);"),t.push(" }"),t.push(" }"),t.push(" node = walker.nextNode();"),t.push(" }"),t.push(" return assigned;"),t.push("}"),t.push("try { assignIds(); } catch {}"),t.push("})();"),t.join(`
4
+ `)}async function Be(e,r,t){let s=At(r||"body",t?.maxNodes??1e4);await e.addInitScript(s),await e.evaluate(s)}var Te=z(()=>{"use strict"});var Ve={};Ge(Ve,{runHostedThinClientChecks:()=>Ct});async function Ct(e){let r=e.repoRoot??process.cwd(),t=e.artifactDir??"tools/artifacts/llynt",s=e.timeoutMs??3e4,o=e.computedStyleMode??"essential",d=e.internComputedStyles??!0,m=e.maxNodes,i=!!e.allowTruncated,l=!!(e.traceOnFailure??process.env.LLYNT_TRACE_ON_FAILURE==="1"),f=null;try{f=await Oe();let y=[];for(let u of e.targets){let P=u.selector??"body",L=u.viewports?.length?u.viewports:[{width:360,height:720},{width:768,height:720}],j=await $e(f),N=j.context(),g=!1,b;try{if(l)try{await N.tracing.start({screenshots:!0,snapshots:!0,sources:!1}),g=!0}catch{g=!1}j.setDefaultTimeout(s),await j.goto(u.url,{waitUntil:"domcontentloaded"});let v=[];for(let C of L){await j.setViewportSize(C),await j.waitForTimeout(50),await Be(j,P);let M=await Re(j,{url:u.url,selector:P,viewport:C},{computedStyleMode:o,internComputedStyles:d,...typeof m=="number"?{maxNodes:m}:{}});if(!i&&M.stats?.truncated)throw new Error(`Extraction truncated for ${u.url} at ${C.width}x${C.height}. Narrow the selector scope or increase limits (free-tier should be component-scoped).`);v.push(M)}let _=await Ce(e.client,{_schemaVersion:"llynt-hosted-check@0",blobs:v,rules:{overlap:!0,viewport:!0}}),H=_.issues.some(C=>C.severity==="error");if(g&&H){let C=u.url.toLowerCase().replace(/https?:\/\//g,"").replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,64)||"target";b=J.resolve(r,J.join(t,`trace-hosted-${C}.zip`))}y.push({url:u.url,selector:P,viewports:L,blobs:v,response:_,tracePath:b})}finally{if(g)try{b?(Me.mkdirSync(J.dirname(b),{recursive:!0}),await N.tracing.stop({path:b})):await N.tracing.stop()}catch{}await N.close().catch(()=>{})}}return y}finally{await f?.close().catch(()=>{})}}var Me,J,De=z(()=>{"use strict";Me=A(require("fs")),J=A(require("path"));Ie();Ue();de();Te()});var ye={name:"llynt",version:"0.1.2",private:!0,description:"Llynt \u2013 UI integrity engine (token/scale drift, SARIF, evidence packs)",license:"UNLICENSED",type:"commonjs",main:"dist/src/index.js",bin:{llynt:"dist/src/cli/index.js"},files:[],scripts:{build:`tsc -p tsconfig.json && node -e "const f='dist/src/cli/index.js';const c=require('fs').readFileSync(f,'utf8');if(!c.startsWith('#!'))require('fs').writeFileSync(f,'#!/usr/bin/env node\\n'+c)"`,typecheck:"tsc -p tsconfig.json --noEmit","build:cli":"npx esbuild src/cli/cli-thin.ts --bundle --platform=node --target=node18 --format=cjs --minify --tree-shaking=true --external:playwright --outfile=dist/npm/cli.js --banner:js='#!/usr/bin/env node' --legal-comments=none","build:lambda":"npx esbuild src/platform/hosted/lambda-handler.ts --bundle --platform=node --target=node22 --outfile=dist/lambda/handler.js --format=cjs --external:@aws-sdk/client-dynamodb --external:@aws-sdk/client-s3 --external:@aws-sdk/lib-dynamodb",cli:"node dist/src/cli/index.js","bundle:action":"npm run build && ncc build dist/src/cli/action.js -o dist-action --license licenses.txt","test:smoke:core":"node scripts/run-core-smoke-strict.js","routine:run":"npm run build && node dist/src/cli/index.js workflow routine-run --routine onboarding --dry-run --execution-class scaffolded_external","demo:no-figma":"npm run build && tsc -p tsconfig.tests.json && node dist/src/cli/index.js validate --repo-root . --artifact-dir tools/artifacts/evidence-lab/solidcopy --css-vars tools/evidence-lab/fixtures/instances/tokens.css --dtcg tools/evidence-lab/fixtures/instances/tokens.dtcg.json --tailwind-json tools/evidence-lab/fixtures/instances/tailwind.theme.json --include-json tools/evidence-lab/fixtures/instances/include.json && node dist-tests/tools/smoke/tests/runtime-smoke.js && node dist/tools/internal/run.js standardize --snapshot-dir tools/artifacts/evidence-lab/solidcopy","demo:evidence":"npm run demo:no-figma","demo:bundle":"node scripts/bundle-artifacts.js","demo:scoreboard":"node scripts/demo-scoreboard.js","demo:storybook":"node scripts/public-storybook-harness.js --dry-run","demo:verify":"node scripts/compare-ground-truth.js","demo:gallery":"node scripts/gallery-build.js --link","demos:build":"node scripts/demos-build.js","onboarding:setup-repo":"node tools/internal/scripts/setup-onboarding-repo.js","demo318:setup-repo":"npm run onboarding:setup-repo","demo:harvest":"node scripts/harvest-storybook.js","battle:bootstrap:external":"node tools/evidence-lab/scripts/bootstrap-external-corpus-truth.js","hosted:preflight":"node tools/internal/scripts/hosted-preflight.js","browser:preflight":"node dist/tools/internal/run.js browser preflight --json",doctor:"node dist/tools/internal/run.js doctor --json","hosted:smoke:remote":"node tools/internal/scripts/hosted-remote-smoke.js","check:capabilities":"node tools/internal/scripts/check-capability-registry.js","docs:ip-check":"node scripts/check-docs-publish-boundary.js","docs:reference":"npm run build && node scripts/generate-reference-docs.js","docs:site:prepare":"npm run docs:reference && node scripts/sync-reference-docs.js && npm run docs:ip-check","docs:dev":"npm run docs:site:prepare && vitepress dev docs/site","docs:build":"npm run docs:site:prepare && vitepress build docs/site","docs:preview":"vitepress preview docs/site","gate:real-external":"node tools/internal/scripts/verify-execution-class.js --manifest tools/artifacts/routines/latest-manifest.json --required real_external","test:routine-runtime-gates":"node dist-tests/tools/smoke/tests/routine-runtime-gates-smoke.js","gate:real-external-proof":"node tools/internal/scripts/require-real-external-proof.js","test:routine-real-external":"npm run build && node dist/src/cli/index.js workflow routine-run --routine onboarding --dry-run --execution-class real_external --out tools/artifacts/routines/latest-manifest.real_external.json && npm run gate:real-external-proof","test:onboarding-auth-mode":"node dist-tests/tools/smoke/tests/onboarding-auth-mode-smoke.js","test:hosted-runs-api-smoke":"node dist-tests/tools/smoke/tests/hosted-runs-api-smoke.js","ide:surface-pack":"node scripts/ide-surface-pack-build.js","ide:host-runtime-proof:capture":"node scripts/ide-host-runtime-proof-capture.js","ide:host-runtime-proof-lint":"node tools/internal/scripts/ide-host-runtime-proof-lint.js","github:agentic-workflow-pack":"node scripts/github-agentic-workflow-pack.js","github:agentic-runtime-proof:capture":"node scripts/github-agentic-runtime-proof-capture.js","github:agentic-runtime-proof-lint":"node tools/internal/scripts/github-agentic-runtime-proof-lint.js","test:ide-surface-pack-smoke":"node dist-tests/tools/smoke/tests/ide-surface-pack-smoke.js","test:ide-host-parity-audit-smoke":"node dist-tests/tools/smoke/tests/ide-host-parity-audit-smoke.js","test:ide-host-runtime-proof-capture-smoke":"node dist-tests/tools/smoke/tests/ide-host-runtime-proof-capture-smoke.js","test:ide-host-runtime-proof-lint-smoke":"node dist-tests/tools/smoke/tests/ide-host-runtime-proof-lint-smoke.js","test:github-agentic-workflow-pack-smoke":"node dist-tests/tools/smoke/tests/github-agentic-workflow-pack-smoke.js","test:github-agentic-runtime-proof-capture-smoke":"node dist-tests/tools/smoke/tests/github-agentic-runtime-proof-capture-smoke.js","test:onboarding-key-ops-contract":"node dist-tests/tools/smoke/tests/onboarding-key-ops-contract-smoke.js","test:routine-choreography":"node dist-tests/tools/smoke/tests/routine-choreography-smoke.js","test:onboarding-scorecard":"node tools/internal/scripts/onboarding-scorecard-build.js --enforce","test:real-external-scorecard":"node tools/internal/scripts/real-external-scorecard-build.js --enforce --min-passes 3","real-external:scorecard":"node tools/internal/scripts/real-external-scorecard-build.js","real-external:init-run":"node scripts/real-external-run-init.js","onboarding:scorecard":"node tools/internal/scripts/onboarding-scorecard-build.js","test:fixture-archetype-catalog":"node dist-tests/tools/smoke/tests/fixture-archetype-catalog-smoke.js","test:fixture-archetype-runtime":"node dist-tests/tools/smoke/tests/fixture-archetype-runtime-smoke.js","test:mcp-tier-guidance":"node dist-tests/tools/smoke/tests/mcp-tier-guidance-smoke.js","test:mcp-tier-guidance-retry":"node dist-tests/tools/smoke/tests/mcp-tier-guidance-retry-smoke.js","test:collections-runtime":"node dist-tests/tools/smoke/tests/collections-runtime-smoke.js","test:onboarding-preflight-runtime":"node dist-tests/tools/smoke/tests/onboarding-preflight-runtime-smoke.js","test:mcp-init-bootstrap-contract-smoke":"node dist-tests/tools/smoke/tests/mcp-init-bootstrap-contract-smoke.js","test:beta-scenario-coverage":"node tools/internal/scripts/beta-scenario-coverage-gate.js --enforce","beta:scenario-coverage":"node tools/internal/scripts/beta-scenario-coverage-gate.js","beta:closure-report":"node tools/internal/scripts/beta-recovery-closure-report.js","test:non-curated-pack-runner":"node dist-tests/tools/smoke/tests/non-curated-pack-runner-smoke.js","non-curated:plan":"node tools/evidence-lab/scripts/non-curated-pack-runner.js","routine:gate-decision":"node dist/src/cli/index.js workflow gate-decision","pr:execution-contract":"node dist/src/cli/index.js workflow pr-execution-contract","pr:impact-stateid-policy":"node dist/tools/internal/release/run.js pr-impact-stateid-policy","non-curated:metrics":"node tools/evidence-lab/scripts/non-curated-metrics-build.js","test:real-external-proof-lint":"node tools/internal/scripts/real-external-proof-lint.js --enforce","real-external:proof-lint":"node tools/internal/scripts/real-external-proof-lint.js","real-external:finalize-run":"node scripts/real-external-run-finalize.js","test:real-external-finalize":"node dist-tests/tools/smoke/tests/real-external-finalize-smoke.js","beta:next-actions":"node tools/internal/scripts/beta-recovery-next-actions.js","beta:status":"node tools/internal/scripts/beta-recovery-status.js","beta:refresh":"node tools/internal/scripts/beta-recovery-refresh.js","test:beta-refresh":"node dist-tests/tools/smoke/tests/beta-recovery-refresh-smoke.js","real-external:validate-run":"node scripts/real-external-run-validate.js","test:real-external-validate":"node dist-tests/tools/smoke/tests/real-external-run-validate-smoke.js","non-curated:init-run":"node tools/evidence-lab/scripts/non-curated-init-run.js","real-external:guide":"node scripts/real-external-run-guide.js","onboarding:attempt-import":"node scripts/onboarding-attempt-import.js","test:onboarding-attempt-import":"node dist-tests/tools/smoke/tests/onboarding-attempt-import-smoke.js","real-external:import-onboarding-attempt":"node scripts/real-external-import-onboarding-attempt.js","test:real-external-import-onboarding-attempt":"node dist-tests/tools/smoke/tests/real-external-import-onboarding-attempt-smoke.js","test:action-plan-rollup":"node dist-tests/tools/smoke/tests/action-plan-rollup-smoke.js","test:blocker-remediation-coverage-smoke":"node dist-tests/tools/smoke/tests/blocker-remediation-coverage-smoke.js","test:mcp-onboarding-contract-errors-smoke":"node dist-tests/tools/smoke/tests/mcp-onboarding-contract-errors-smoke.js","test:mcp-redaction-smoke":"node dist-tests/tools/smoke/tests/mcp-redaction-smoke.js","test:profile-surface-smoke":"node dist-tests/tools/smoke/tests/profile-surface-smoke.js","probabilistic:harness":"node scripts/run-probabilistic-agent-harness.js","mutation:audit":"node tools/evidence-lab/scripts/mutation-intent-audit.js","mutation:reconcile":"node tools/evidence-lab/scripts/mutation-truth-reconcile.js","correlation:root-cause":"node tools/evidence-lab/scripts/correlated-cluster-build.js","state-graph:build":"node tools/evidence-lab/scripts/state-graph-build.js","actionset:trace":"node tools/evidence-lab/scripts/actionset-trace-build.js","planner:seed-reduction":"node tools/evidence-lab/scripts/render-predicate-planner-build.js","discovery:flow-graph":"node tools/evidence-lab/scripts/discovery-flow-graph-build.js","l2:macro-coverage":"node dist/tools/internal/release/run.js l2-macro-coverage","l2:component-category-coverage":"node dist/tools/internal/release/run.js l2-component-category-coverage","l2:surface-bundle-map":"node dist/tools/internal/release/run.js l2-surface-bundle-map","network:scenario-runner":"node tools/evidence-lab/scripts/network-scenario-runner.js","seed:design-kit-harvest":"node tools/evidence-lab/scripts/design-kit-seed-harvester.js","chaos:mutation-sim":"node tools/evidence-lab/scripts/chaos-mutation-simulator.js","gauntlet:factory":"node tools/evidence-lab/scripts/gauntlet-factory.js","react:intake-normalize":"node tools/evidence-lab/scripts/real-react-intake-normalize.js","gallery:corpus-build":"node tools/evidence-lab/scripts/gallery-corpus-build.js","evidence-lab":"npx tsx tools/evidence-lab/pipeline.ts run","evidence-lab:status":"npx tsx tools/evidence-lab/pipeline.ts status","evidence-lab:gallery":"npx tsx tools/evidence-lab/pipeline.ts run --stage 4","evidence-lab:chaos":"npx tsx tools/evidence-lab/pipeline.ts run --stage 3","v0:operator-usability":"node tools/evidence-lab/scripts/v0-operator-usability-loop.js","audit:smoke-truth":"node scripts/smoke-truth-audit.js","audit:smoke-disposition":"node scripts/smoke-disposition-audit.js","replay:recipes":"node scripts/replay-recipe-build.js","replay:repro-gate":"node tools/internal/scripts/replay-repro-gate.js","core:quality-floor":"node dist/tools/internal/run.js core-quality-floor","invariant:coverage-gap":"node dist/tools/internal/run.js invariant-coverage-gap","test:core-invariant-quality-floor":"node dist/tools/internal/run.js core-quality-floor --enforce","test:invariant-coverage-gap":"node dist/tools/internal/run.js invariant-coverage-gap --enforce","test:l2-macro-profile-coverage-smoke":"node dist-tests/tools/smoke/tests/l2-macro-profile-coverage-smoke.js","test:l2-component-category-coverage-smoke":"node dist-tests/tools/smoke/tests/l2-component-category-coverage-smoke.js","test:l2-surface-bundle-map-smoke":"node dist-tests/tools/smoke/tests/l2-surface-bundle-map-smoke.js","test:network-scenario-runner-smoke":"node dist-tests/tools/smoke/tests/network-scenario-runner-smoke.js","test:chaos-mutation-simulator-smoke":"node dist-tests/tools/smoke/tests/chaos-mutation-simulator-smoke.js","test:gauntlet-factory-smoke":"node dist-tests/tools/smoke/tests/gauntlet-factory-smoke.js","test:real-react-intake-normalize-smoke":"node dist-tests/tools/smoke/tests/real-react-intake-normalize-smoke.js","test:gallery-corpus-build-smoke":"node dist-tests/tools/smoke/tests/gallery-corpus-build-smoke.js","test:replay-repro-gate-smoke":"node dist-tests/tools/smoke/tests/replay-repro-gate-smoke.js","test:pr-execution-contract-smoke":"node dist-tests/tools/smoke/tests/pr-execution-contract-smoke.js","test:pr-impact-stateid-policy-smoke":"node dist-tests/tools/smoke/tests/pr-impact-stateid-policy-smoke.js","onboarding:accuracy":"node tools/internal/scripts/onboarding-accuracy-eval.js","test:onboarding-accuracy":"node tools/internal/scripts/onboarding-accuracy-eval.js --enforce","onboarding:harness-matrix:run":"node tools/internal/scripts/onboarding-harness-matrix-run.js","onboarding:harness-matrix:eval":"node tools/internal/scripts/onboarding-harness-matrix-eval.js","test:onboarding-harness-matrix":"node dist-tests/tools/smoke/tests/onboarding-harness-matrix-smoke.js","evidence:freshness":"node dist/tools/internal/run.js evidence-freshness","test:evidence-freshness":"node dist/tools/internal/run.js evidence-freshness --enforce","canary:run":"node scripts/real-target-canary-run.js","canary:drift-gate":"node tools/internal/scripts/real-target-canary-drift-gate.js --enforce","canary:nightly":"npm run canary:run -- --enforce && npm run canary:drift-gate","benchmark:wall-time":"node tools/internal/scripts/wall-time-benchmark.js","test:concurrent-pr-isolation":"node tools/internal/scripts/concurrent-pr-isolation-test.js --enforce","test:real-target-canary-run-smoke":"node dist-tests/tools/smoke/tests/real-target-canary-run-smoke.js","gate:required-r1-claims":"node tools/internal/scripts/required-r1-claim-gate.js --enforce","test:unit":"vitest run","test:check-command-smoke":"npx tsc --target ES2022 --module commonjs --moduleResolution node --esModuleInterop --resolveJsonModule --skipLibCheck --types node --outDir dist-tests --rootDir . tools/smoke/tests/check-command-smoke.ts && node dist-tests/tools/smoke/tests/check-command-smoke.js","test:hosted-signup-smoke":"npx tsc --target ES2022 --module commonjs --moduleResolution node --esModuleInterop --resolveJsonModule --skipLibCheck --types node --outDir dist-tests --rootDir . tools/smoke/tests/hosted-signup-smoke.ts && node dist-tests/tools/smoke/tests/hosted-signup-smoke.js","site:llynt-dev:build":"npm --prefix src/brand/logo-animation run build",adversarial:"npm run build && npx tsx tools/evidence-lab/adversarial/run-all.ts"},dependencies:{"@actions/core":"^2.0.3","@modelcontextprotocol/sdk":"^1.26.0",commander:"^12.1.0",minimatch:"^9.0.5",playwright:"^1.45.0",zod:"^4.3.6"},devDependencies:{"@aws-sdk/client-dynamodb":"^3.1004.0","@aws-sdk/client-s3":"^3.1004.0","@aws-sdk/lib-dynamodb":"^3.1004.0","@types/node":"^20.11.30","@vercel/ncc":"^0.38.1",esbuild:"^0.27.3",typescript:"^5.4.5","vite-tsconfig-paths":"^4.3.2",vitepress:"^1.6.4",vitest:"^3.2.4"},overrides:{qs:"^6.14.2"}};function be(e){let r={};for(let t=0;t<e.length;t++){let s=e[t];if(!s.startsWith("--"))continue;let o=s.slice(2),d=e[t+1];!d||d.startsWith("--")?r[o]=!0:(r[o]=d,t++)}return r}function re(e){if(e==null)return!1;if(typeof e=="boolean")return e;let r=String(e).trim().toLowerCase();return!(r===""||r==="0"||r==="false"||r==="no"||r==="off")}function we(e){return e.replace(/\s+/g," ").trim()}function Ze(e){return e.replace(/\bllynt-[a-z]+-[a-z0-9]+\b/g,r=>{let t=r.split("-");return t.length>=2?`<${t[1]}>`:r})}function ke(e){let r=we(String(e.message??""));return r||`${we(String(e.ruleId??"unknown.rule"))} violation`}function et(e){return Ze(ke(e))}function tt(e){return e.length?e.map(r=>`${r.width}px`).join(", "):""}function ve(e){let r=e.issues.filter(l=>l.severity==="error"),t=e.issues.filter(l=>l.severity==="warning"),s=e.issues.filter(l=>l.severity==="info"),o=e.issues.length,d=e.viewports.length,m=tt(e.viewports),i=[];if(i.push(`llynt check ${e.url}`),i.push(""),e.rulesChecked!=null&&e.rulesAvailable!=null&&i.push(` ${e.rulesChecked} of ${e.rulesAvailable} rules checked${e.isAnonymous?" (anonymous)":""}`),i.push(` Capturing... ${d} viewport${d!==1?"s":""}${m?` (${m})`:""}`),i.push(` Analyzing... ${Math.max(0,Math.floor(e.nodeCount))} nodes, ${Math.max(0,Math.floor(e.costUnits))} cost units`),e.truncated&&i.push(" Note: Capture was truncated due to DOM limits."),i.push(""),o===0?i.push(" 0 issues found"):(i.push(` ${o} issues across ${d} viewport${d!==1?"s":""}`),i.push(` ${r.length} errors \xB7 ${t.length} warnings \xB7 ${s.length} info`)),i.push(""),e.reportUrl){let l=e.reportExpiresAt?` (expires ${e.reportExpiresAt.slice(0,10)})`:"";i.push(` Report: ${e.reportUrl}${l}`),i.push("")}if(o>0){let l=new Set,f=[];for(let y of[...r,...t,...s]){let u=et(y);!l.has(u)&&f.length<5&&(l.add(u),f.push(u))}if(f.length>0){i.push(" Top issues:");for(let u of f)i.push(` ${u}`);let y=o-f.length;y>0&&i.push(` ... and ${y} more (see report)`),i.push("")}e.gatedIssueCount&&e.gatedIssueCount>0&&(i.push(` ${e.gatedIssueCount} more issues found with full analysis \u2014 sign up at llynt.dev`),i.push(""))}return e.isAnonymous?(i.push(" Sign up free at https://llynt.dev for 28 rules, 2 viewports, 70 checks/week."),i.push(" Then: export LLYNT_API_KEY=<your-key>"),i.push("")):o>0&&(i.push(" Want full SARIF evidence + agent-ready fixes?"),i.push(" Set up the PR gate \u2014 your agent can do it:"),i.push(" npx llynt init --github")),i.join(`
5
+ `).trimEnd()}function xe(e){let r={error:0,warning:1,info:2},t=e.issues.map(m=>({severity:m.severity,ruleId:m.ruleId,message:ke(m)})).sort((m,i)=>(r[m.severity]??3)-(r[i.severity]??3)),s=t.filter(m=>m.severity==="error").length,o=t.filter(m=>m.severity==="warning").length,d=t.length-s-o;return{url:e.url,viewports:e.viewports,nodeCount:Math.max(0,Math.floor(e.nodeCount)),costUnits:Math.max(0,Math.floor(e.costUnits)),issueCount:t.length,errors:s,warnings:o,infos:d,truncated:!!e.truncated,issues:t,gatedIssueCount:Math.max(0,Math.floor(e.gatedIssueCount??0)),...e.reportUrl?{reportUrl:e.reportUrl}:{},...e.reportExpiresAt?{reportExpiresAt:e.reportExpiresAt}:{},...e.rulesChecked!=null?{rulesChecked:e.rulesChecked,rulesAvailable:e.rulesAvailable}:{}}}async function je(e){try{let r=e.to.trim();if(!r||typeof fetch!="function")return;let t=`llynt check report \u2014 ${e.url}`,s=[`Your UI check found ${e.issueCount} issue${e.issueCount===1?"":"s"}.`,`View report: ${e.reportUrl}`,"","Want full SARIF evidence + agent-ready fixes?","Set up the PR gate: npx llynt init --github"].join(`
6
+ `);await fetch("https://formsubmit.co/ajax/hello@llynt.dev",{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({email:r,_subject:t,message:s})})}catch{}}var rt=A(require("http")),st=A(require("https"));function se(e){let r=e.trim();if(!r)throw new Error("LLYNT_API_URL is empty");let t=new URL(r),s=t.pathname.replace(/\/+$/g,"");s.endsWith("/v1/check")&&(s=s.slice(0,s.length-9)),t.pathname=s||"/",t.search="",t.hash="";let o=t.pathname==="/"?"":t.pathname.replace(/\/+$/g,"");return`${t.origin}${o}`}function ot(e,r,t,s){return new Promise((o,d)=>{let i=(e.protocol==="https:"?st:rt).request({...r,protocol:e.protocol,hostname:e.hostname,port:e.port,path:e.pathname+e.search},l=>{let f=[];l.on("data",y=>f.push(y)),l.on("end",()=>o({statusCode:l.statusCode??0,body:Buffer.concat(f)}))});i.on("error",d),i.setTimeout(s,()=>i.destroy(new Error(`Report upload timed out after ${s}ms`))),i.end(t)})}async function Se(e,r,t){try{let s=se(e),o=new URL(`${s}/reports`),d=1e4,m=Buffer.from(JSON.stringify(t),"utf8"),i=await ot(o,{method:"POST",headers:{"content-type":"application/json",accept:"application/json","content-length":String(m.length),"user-agent":"llynt-check-report-upload/0",...r?{authorization:`Bearer ${r}`}:{}}},m,d);if(i.statusCode<200||i.statusCode>=300)return null;let l=JSON.parse(i.body.toString("utf8"));return!l||typeof l.reportUrl!="string"||typeof l.expiresAt!="string"?null:l}catch{return null}}de();var ne=["marketing","app_shell","auth","onboarding","forms","checkout","billing","dashboard"];var B={profile:"PRODUCTION"},T={rules:{"token.color":"warning","token.spacing":"warning","token.typography":"warning"}},pe={marketing:{...B,surface:"marketing",...T},app_shell:{...B,surface:"app_shell",...T,ruleSeverityOverrides:{"dom.modal.scrollLock":"error"}},auth:{...B,surface:"auth",...T,ruleSeverityOverrides:{"dom.a11y.contrast":"error","dom.a11y.hitTarget":"error","dom.text.overflow":"error","dom.protected.clipping":"error","dom.modal.scrollLock":"error"}},onboarding:{...B,surface:"onboarding",...T,ruleSeverityOverrides:{"dom.a11y.hitTarget":"error","dom.text.overflow":"error","dom.protected.occlusion":"error","dom.modal.scrollLock":"error"}},forms:{...B,surface:"forms",...T,ruleSeverityOverrides:{"dom.a11y.hitTarget":"error","dom.a11y.contrast":"error","dom.text.overflow":"error","dom.form.errorAssociation":"error"}},checkout:{...B,surface:"checkout",...T,ruleSeverityOverrides:{"dom.a11y.hitTarget":"error","dom.a11y.contrast":"error","dom.protected.occlusion":"error","dom.protected.clipping":"error","dom.protected.overlap.interactive":"error","dom.form.errorAssociation":"error","dom.table.headerAlignment":"error","dom.modal.scrollLock":"error"}},billing:{...B,surface:"billing",...T,ruleSeverityOverrides:{"dom.text.overflow":"error","dom.viewport.horizontalOverflow":"error","dom.form.errorAssociation":"error","dom.table.headerAlignment":"error"}},dashboard:{...B,surface:"dashboard",...T,ruleSeverityOverrides:{"dom.viewport.horizontalOverflow":"error","dom.protected.occlusion":"error","dom.table.headerAlignment":"error"}}};function pt(e){return e.trim().toLowerCase().replace(/[\s-]+/g,"_")}function mt(e){return ne.includes(e)}function ht(e){if(!e)return null;let r=pt(e);return mt(r)?{name:r,policy:pe[r]}:null}function ft(e,r){if(!(!e&&!r))return e?r?{...e,...r,runtime:{...e.runtime??{},...r.runtime??{}},importanceOverrides:{...e.importanceOverrides??{},...r.importanceOverrides??{}},rules:{...e.rules??{},...r.rules??{}},ruleSeverityOverrides:{...e.ruleSeverityOverrides??{},...r.ruleSeverityOverrides??{}},allowRawValues:r.allowRawValues??e.allowRawValues}:e:r}function Ee(e,r){if(!e&&!r)return r;let t=ht(e);if(e&&!t)throw new Error(`Unknown surface profile: ${e}. Expected one of: ${ne.join(", ")}`);return ft(t?.policy,r)}var Et=0,Pt=2,I=3,He=[{width:360,height:720},{width:768,height:720}],Rt=[{width:360,height:720}];function It(e){for(let r=0;r<e.length;r++){let t=e[r];if(!t.startsWith("--"))return t;let s=e[r+1];s&&!s.startsWith("--")&&(r+=1)}}function Lt(e){if(typeof e!="string"||!e.trim())return He;let r=e.split(",").map(t=>t.trim()).filter(Boolean).map(t=>{let s=t.match(/^(\d{2,5})x(\d{2,5})$/i);if(!s)throw new Error(`Invalid viewport "${t}". Expected format WIDTHxHEIGHT.`);return{width:Number(s[1]),height:Number(s[2])}});return r.length?r:He}function Nt(e,r){if(!r)return e;let s=Ee(r,void 0)?.ruleSeverityOverrides;return s?e.map(o=>{let d=s[o.ruleId];return d!=="error"&&d!=="warning"||d===o.severity?o:{...o,severity:d}}):e}function _t(e){let r=e instanceof Error?e.message:String(e);return r.includes("Cannot find module 'playwright'")||r.includes("Cannot find package 'playwright'")||r.includes("ERR_MODULE_NOT_FOUND")}function Ot(e,r){let t=r instanceof Error?r.message:String(r);return t.includes("ERR_CONNECTION_REFUSED")?`Error: Could not reach ${e}
7
7
  Is your dev server running?`:t.includes("ERR_NAME_NOT_RESOLVED")?`Error: Could not resolve hostname for ${e}`:t.toLowerCase().includes("timed out")?`Error: Page load timed out after 30s: ${e}`:null}function x(e){process.stdout.write(e.trimEnd()+`
8
- `)}async function Ot(e,r){let t=await import("http"),s=await import("https"),o=new URL(`${e}/signup`),d=Buffer.from(JSON.stringify({email:r}),"utf8");return new Promise(m=>{let l=(o.protocol==="https:"?s:t).request({method:"POST",protocol:o.protocol,hostname:o.hostname,port:o.port,path:o.pathname,headers:{"content-type":"application/json","content-length":String(d.length),"user-agent":"llynt-cli-signup/0"}},f=>{let g=[];f.on("data",u=>g.push(u)),f.on("end",()=>{try{if(f.statusCode&&f.statusCode>=200&&f.statusCode<300){let u=JSON.parse(Buffer.concat(g).toString("utf8"));m(typeof u.apiKey=="string"?u.apiKey:null)}else m(null)}catch{m(null)}})});l.on("error",()=>m(null)),l.setTimeout(1e4,()=>{l.destroy(),m(null)}),l.end(d)})}async function Fe(e){let r=be(e),t=It(e);if(!t)return x(`Error: Missing URL.
9
- Usage: llynt check <url>`),R;let s=(typeof r.key=="string"?String(r.key):process.env.LLYNT_API_KEY??"").trim(),o=re(r.signup),d=typeof r.email=="string"?String(r.email).trim():"",m=!s&&!o;if(o&&!s){if(!d)return x("Error: --signup requires --email <your@email.com>"),R;let y=(typeof process.env.LLYNT_API_URL=="string"?process.env.LLYNT_API_URL:"https://api.llynt.dev").trim(),w=se(y);x(` Signing up ${d}...`);let v=await Ot(w,d);if(!v)return x(" Error: Signup failed. Try at https://llynt.dev"),R;s=v,x(` API key: ${v}`),x(` Save it: export LLYNT_API_KEY=${v}
10
- `)}try{await import("playwright")}catch(y){return Nt(y)?(x(`llynt check ${t}
8
+ `)}async function $t(e,r){let t=await import("http"),s=await import("https"),o=new URL(`${e}/signup`),d=Buffer.from(JSON.stringify({email:r}),"utf8");return new Promise(m=>{let l=(o.protocol==="https:"?s:t).request({method:"POST",protocol:o.protocol,hostname:o.hostname,port:o.port,path:o.pathname,headers:{"content-type":"application/json","content-length":String(d.length),"user-agent":"llynt-cli-signup/0"}},f=>{let y=[];f.on("data",u=>y.push(u)),f.on("end",()=>{try{if(f.statusCode&&f.statusCode>=200&&f.statusCode<300){let u=JSON.parse(Buffer.concat(y).toString("utf8"));m(typeof u.apiKey=="string"?u.apiKey:null)}else m(null)}catch{m(null)}})});l.on("error",()=>m(null)),l.setTimeout(1e4,()=>{l.destroy(),m(null)}),l.end(d)})}async function Fe(e){let r=be(e),t=It(e);if(!t)return x(`Error: Missing URL.
9
+ Usage: llynt check <url>`),I;let s=(typeof r.key=="string"?String(r.key):process.env.LLYNT_API_KEY??"").trim(),o=re(r.signup),d=typeof r.email=="string"?String(r.email).trim():"",m=!s&&!o;if(o&&!s){if(!d)return x("Error: --signup requires --email <your@email.com>"),I;let g=(typeof process.env.LLYNT_API_URL=="string"?process.env.LLYNT_API_URL:"https://api.llynt.dev").trim(),b=se(g);x(` Signing up ${d}...`);let v=await $t(b,d);if(!v)return x(" Error: Signup failed. Try at https://llynt.dev"),I;s=v,x(` API key: ${v}`),x(` Save it: export LLYNT_API_KEY=${v}
10
+ `)}try{let{createRequire:g}=await import("module"),b=g(process.cwd()+"/package.json");try{b.resolve("playwright")}catch{await import("playwright")}}catch(g){return _t(g)?(x(`llynt check ${t}
11
11
 
12
12
  Error: Playwright not found.
13
- Install it: npm install -D playwright && npx playwright install chromium`),R):(x(`llynt check ${t}
13
+ Install it: npm install -D playwright && npx playwright install chromium`),I):(x(`llynt check ${t}
14
14
 
15
- Error: Failed to load Playwright runtime.`),R)}let i=(typeof process.env.LLYNT_API_URL=="string"?process.env.LLYNT_API_URL:"https://api.llynt.dev").trim(),l=Ae(i),f=se(i),g=(typeof r.selector=="string"?String(r.selector):"body").trim()||"body",u=typeof r.profile=="string"?String(r.profile):void 0,P=re(r.json),L=re(r.verbose),S=typeof r.email=="string"?String(r.email).trim():"",N;try{m?N=Pt:N=Rt(r.viewports)}catch(y){return x(`llynt check ${t}
15
+ Error: Failed to load Playwright runtime.`),I)}let i=(typeof process.env.LLYNT_API_URL=="string"?process.env.LLYNT_API_URL:"https://api.llynt.dev").trim(),l=Ae(i),f=se(i),y=(typeof r.selector=="string"?String(r.selector):"body").trim()||"body",u=typeof r.profile=="string"?String(r.profile):void 0,P=re(r.json),L=re(r.verbose),j=typeof r.email=="string"?String(r.email).trim():"",N;try{m?N=Rt:N=Lt(r.viewports)}catch(g){return x(`llynt check ${t}
16
16
 
17
- Error: ${y instanceof Error?y.message:String(y)}`),R}try{let{runHostedThinClientChecks:y}=await Promise.resolve().then(()=>(De(),Ve)),w=await y({targets:[{url:t,selector:g,viewports:N}],timeoutMs:3e4,traceOnFailure:!1,computedStyleMode:"all",internComputedStyles:!0,maxNodes:1e4,allowTruncated:!0,client:{apiUrl:l,apiKey:s||void 0,timeoutMs:3e4,compression:"gzip"}}),v=w.flatMap(k=>k.response.issues),_=Lt(v,u),H=w.reduce((k,I)=>k+Math.max(0,Math.floor(I.response.meta.nodeCount??0)),0),A=w.reduce((k,I)=>k+Math.max(0,Math.floor(I.response.meta.costUnits??0)),0),M=w.some(k=>!!k.response.meta.truncated),le=w.reduce((k,I)=>k+(I.response.meta.gatedIssueCount??0),0),X=w.flatMap(k=>k.viewports),K=w[0]?.response.meta.rulesChecked,Q=w[0]?.response.meta.rulesAvailable,Z={url:t,viewports:X,issueCount:_.length,issues:_.map(k=>({severity:k.severity,ruleId:k.ruleId,message:k.message.replace(/\s+/g," ").trim()})),meta:{nodeCount:H,costUnits:A,truncated:M,capturedAt:new Date().toISOString(),clientVersion:String(ye.version??"0.0.0"),...K!=null?{rulesChecked:K,rulesAvailable:Q}:{}}},F=await je(f,s||"",Z),ee={issues:_,url:t,viewports:X,nodeCount:H,costUnits:A,truncated:M,reportUrl:F?.reportUrl,reportExpiresAt:F?.expiresAt,gatedIssueCount:le,isAnonymous:m,rulesChecked:K,rulesAvailable:Q};if(P){let k=xe(ee);x(JSON.stringify(k,null,2))}else L&&x(`llynt check ${t}
17
+ Error: ${g instanceof Error?g.message:String(g)}`),I}try{let{runHostedThinClientChecks:g}=await Promise.resolve().then(()=>(De(),Ve)),b=await g({targets:[{url:t,selector:y,viewports:N}],timeoutMs:3e4,traceOnFailure:!1,computedStyleMode:"all",internComputedStyles:!0,maxNodes:1e4,allowTruncated:!0,client:{apiUrl:l,apiKey:s||void 0,timeoutMs:3e4,compression:"gzip"}}),v=b.flatMap(k=>k.response.issues),_=Nt(v,u),H=b.reduce((k,R)=>k+Math.max(0,Math.floor(R.response.meta.nodeCount??0)),0),C=b.reduce((k,R)=>k+Math.max(0,Math.floor(R.response.meta.costUnits??0)),0),M=b.some(k=>!!k.response.meta.truncated),le=b.reduce((k,R)=>k+(R.response.meta.gatedIssueCount??0),0),X=b.flatMap(k=>k.viewports),K=b[0]?.response.meta.rulesChecked,Q=b[0]?.response.meta.rulesAvailable,Z={url:t,viewports:X,issueCount:_.length,issues:_.map(k=>({severity:k.severity,ruleId:k.ruleId,message:k.message.replace(/\s+/g," ").trim()})),meta:{nodeCount:H,costUnits:C,truncated:M,capturedAt:new Date().toISOString(),clientVersion:String(ye.version??"0.0.0"),...K!=null?{rulesChecked:K,rulesAvailable:Q}:{}}},F=await Se(f,s||"",Z),ee={issues:_,url:t,viewports:X,nodeCount:H,costUnits:C,truncated:M,reportUrl:F?.reportUrl,reportExpiresAt:F?.expiresAt,gatedIssueCount:le,isAnonymous:m,rulesChecked:K,rulesAvailable:Q};if(P){let k=xe(ee);x(JSON.stringify(k,null,2))}else L&&x(`llynt check ${t}
18
18
 
19
- API: ${l}`),x(ve(ee));return S&&!o&&F?.reportUrl&&Se({to:S,url:t,reportUrl:F.reportUrl,issueCount:_.length}),_.length>0?Et:Ct}catch(y){let w=_t(t,y);if(w)return x(`llynt check ${t}
19
+ API: ${l}`),x(ve(ee));return j&&!o&&F?.reportUrl&&je({to:j,url:t,reportUrl:F.reportUrl,issueCount:_.length}),_.length>0?Pt:Et}catch(g){let b=Ot(t,g);if(b)return x(`llynt check ${t}
20
20
 
21
- ${w.replace(/\n/g,`
22
- `)}`),R;let v=y instanceof Error?y.message:String(y);return v.includes("Hosted API request timed out")?(x(`llynt check ${t}
21
+ ${b.replace(/\n/g,`
22
+ `)}`),I;let v=g instanceof Error?g.message:String(g);return v.includes("Hosted API request timed out")?(x(`llynt check ${t}
23
23
 
24
- Error: Hosted API timeout (${l})`),R):v.includes("Hosted API error (401)")?(x(`llynt check ${t}
24
+ Error: Hosted API timeout (${l})`),I):v.includes("Hosted API error (401)")?(x(`llynt check ${t}
25
25
 
26
- Error: Invalid API key. Sign up at https://llynt.dev`),R):v.includes("Hosted API error (403)")?(x(`llynt check ${t}
26
+ Error: Invalid API key. Sign up at https://llynt.dev`),I):v.includes("Hosted API error (403)")?(x(`llynt check ${t}
27
27
 
28
- Error: API key revoked. Sign up at https://llynt.dev for a new key.`),R):v.includes("Hosted API error (429)")?(x(`llynt check ${t}
28
+ Error: API key revoked. Sign up at https://llynt.dev for a new key.`),I):v.includes("Hosted API error (429)")?(x(`llynt check ${t}
29
29
 
30
- Error: Rate limit exceeded. ${m?"Sign up at https://llynt.dev for 70 checks/week.":"Try again later or upgrade at https://llynt.dev"}`),R):v.includes("Hosted API error")?(x(`llynt check ${t}
30
+ Error: Rate limit exceeded. ${m?"Sign up at https://llynt.dev for 70 checks/week.":"Try again later or upgrade at https://llynt.dev"}`),I):v.includes("Hosted API error")?(x(`llynt check ${t}
31
31
 
32
- Error: Hosted API failure at ${l}`),R):(x(`llynt check ${t}
32
+ Error: Hosted API failure at ${l}`),I):(x(`llynt check ${t}
33
33
 
34
34
  Error: ${v.split(`
35
- `)[0]}`),R)}}var $t=`llynt - UI integrity checks for AI coding agents
35
+ `)[0]}`),I)}}var Ut=`llynt - UI integrity checks for AI coding agents
36
36
 
37
37
  Usage:
38
38
  llynt check <url> Check a URL
@@ -44,8 +44,8 @@ Sign up free at https://llynt.dev
44
44
  Examples:
45
45
  npx llynt check http://localhost:3000
46
46
  npx llynt check https://my-app.vercel.app
47
- `;async function Ut(){let e=process.argv.slice(2),r=e[0];if((!r||r==="help"||r==="--help"||r==="-h")&&(process.stdout.write($t),process.exit(0)),r==="check"){let t=await Fe(e.slice(1));process.exit(t)}process.stderr.write(`Unknown command: ${r}
47
+ `;async function Bt(){let e=process.argv.slice(2),r=e[0];if((!r||r==="help"||r==="--help"||r==="-h")&&(process.stdout.write(Ut),process.exit(0)),r==="check"){let t=await Fe(e.slice(1));process.exit(t)}process.stderr.write(`Unknown command: ${r}
48
48
 
49
49
  Run "llynt help" for usage.
50
- `),process.exit(3)}Ut().catch(e=>{process.stderr.write(`Fatal: ${e instanceof Error?e.message:String(e)}
50
+ `),process.exit(3)}Bt().catch(e=>{process.stderr.write(`Fatal: ${e instanceof Error?e.message:String(e)}
51
51
  `),process.exit(3)});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "llynt",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "description": "Free UI quality checks for AI coding agents",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "type": "commonjs",