{"_id":"@a11y-pulse/tab-orchestrator","_rev":"7-944a8c524856e5cf085d4c36389f5330","name":"@a11y-pulse/tab-orchestrator","dist-tags":{"latest":"0.6.1"},"versions":{"0.1.0":{"name":"@a11y-pulse/tab-orchestrator","version":"0.1.0","author":{"name":"A11y Pulse Limited"},"license":"SEE LICENSE IN LICENSE.md","_id":"@a11y-pulse/tab-orchestrator@0.1.0","maintainers":[{"name":"wildlyinaccurate","email":"joseph@wildlyinaccurate.com"}],"homepage":"https://github.com/A11y-Pulse/audits/tree/main/packages/tab-orchestrator#readme","bugs":{"url":"https://github.com/A11y-Pulse/audits/issues"},"dist":{"shasum":"dffebfe24fe9fe1c3f53eba7e0ed635f8d44e76c","tarball":"https://registry.npmjs.org/@a11y-pulse/tab-orchestrator/-/tab-orchestrator-0.1.0.tgz","fileCount":20,"integrity":"sha512-2Nh0aI6CBsLLd2dbsZtUthd0bLEHi8cCK6/e+sffUf5EMm8jqpM+f310vSflIRGxDcrk/7ai2k4OMV5Pn/PyiQ==","signatures":[{"sig":"MEYCIQDKwoYjmiW5uTxtGi8aFWqAs/L+tUDg+lX7ZKDkk3V0jgIhAM/4lfDfqKLeh4DsTdfzFLFPEzP86WKbV1ivuaGrHiNE","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":170894},"type":"module","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","source":"./src/index.ts"},"./puppeteer":{"types":"./dist/adaptors/puppeteer.d.ts","import":"./dist/adaptors/puppeteer.js","source":"./src/adaptors/puppeteer.ts"}},"gitHead":"16989f9d06b39c893b2ee2607651b8cdafc20d5b","scripts":{"test":"npm run typecheck && npm run test:unit","build":"tsup && tsc -p tsconfig.build.json","test:unit":"vitest run","typecheck":"tsc --noEmit","prepublishOnly":"npm run build","test:integration":"vitest run --config vitest.integration.config.ts"},"_npmUser":{"name":"wildlyinaccurate","email":"joseph@wildlyinaccurate.com"},"repository":{"url":"git+https://github.com/A11y-Pulse/audits.git","type":"git","directory":"packages/tab-orchestrator"},"_npmVersion":"11.11.0","description":"Shared Tab-session runner for A11y Pulse keyboard audits.","directories":{},"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"happy-dom":"^20.11.2","puppeteer":"^25.7.0","@a11y-pulse/focus-appearance-audit":"*","@a11y-pulse/focus-not-obscured-audit":"*","@a11y-pulse/context-change-on-focus-audit":"*"},"peerDependencies":{"puppeteer":"^25.7.0"},"peerDependenciesMeta":{"puppeteer":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/tab-orchestrator_0.1.0_1787202093271_0.053488638758543594","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@a11y-pulse/tab-orchestrator","version":"0.2.0","author":{"name":"A11y Pulse Limited"},"license":"SEE LICENSE IN LICENSE.md","_id":"@a11y-pulse/tab-orchestrator@0.2.0","maintainers":[{"name":"wildlyinaccurate","email":"joseph@wildlyinaccurate.com"}],"homepage":"https://github.com/A11y-Pulse/audits/tree/main/packages/tab-orchestrator#readme","bugs":{"url":"https://github.com/A11y-Pulse/audits/issues"},"dist":{"shasum":"1cc1ca3e1edec20c508848bb11ef4676de1b3bc7","tarball":"https://registry.npmjs.org/@a11y-pulse/tab-orchestrator/-/tab-orchestrator-0.2.0.tgz","fileCount":20,"integrity":"sha512-ETkXHKAJHnfCiZAfICKr6HvqTHxZTw+qEETTG7/anJU4+HkdZuBi2EE7uFgEYvSmvfV/ZuEIEaEenPCgRdG74g==","signatures":[{"sig":"MEUCIQD97D9v8sc5pPtNyBVqJKtz6J/62kTpLSC3eQLMx8vlHgIgUtzQ8JND6F39/o1S4RjsO9KfVvlBe6ri3fJ37QYhDqc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@a11y-pulse%2ftab-orchestrator@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":170894},"type":"module","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","source":"./src/index.ts"},"./puppeteer":{"types":"./dist/adaptors/puppeteer.d.ts","import":"./dist/adaptors/puppeteer.js","source":"./src/adaptors/puppeteer.ts"}},"gitHead":"f05e0097f3dc9b26151bb00db20bf4ba98707bda","scripts":{"test":"npm run typecheck && npm run test:unit","build":"tsup && tsc -p tsconfig.build.json","test:unit":"vitest run","typecheck":"tsc --noEmit","prepublishOnly":"npm run build","test:integration":"vitest run --config vitest.integration.config.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0168c96c-dc92-4652-ba43-172bb8c985d9"}},"repository":{"url":"git+https://github.com/A11y-Pulse/audits.git","type":"git","directory":"packages/tab-orchestrator"},"_npmVersion":"12.0.2","description":"Shared Tab-session runner for A11y Pulse keyboard audits.","directories":{},"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"happy-dom":"^20.11.2","puppeteer":"^25.7.0","@a11y-pulse/focus-appearance-audit":"*","@a11y-pulse/focus-not-obscured-audit":"*","@a11y-pulse/context-change-on-focus-audit":"*"},"peerDependencies":{"puppeteer":"^25.7.0"},"peerDependenciesMeta":{"puppeteer":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/tab-orchestrator_0.2.0_1787211114501_0.8441152721851664","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@a11y-pulse/tab-orchestrator","version":"0.3.0","author":{"name":"A11y Pulse Limited"},"license":"SEE LICENSE IN LICENSE.md","_id":"@a11y-pulse/tab-orchestrator@0.3.0","maintainers":[{"name":"wildlyinaccurate","email":"joseph@wildlyinaccurate.com"}],"homepage":"https://github.com/A11y-Pulse/audits/tree/main/packages/tab-orchestrator#readme","bugs":{"url":"https://github.com/A11y-Pulse/audits/issues"},"dist":{"shasum":"64729610cd0b938a6194ec4579ea69393bceab35","tarball":"https://registry.npmjs.org/@a11y-pulse/tab-orchestrator/-/tab-orchestrator-0.3.0.tgz","fileCount":21,"integrity":"sha512-nuCngDAbHZnxXdx6Ha5q7rHlVmuvrcFzAEpDReymYSNKnPwXP8Iv8K9VO02Tr3/22zuHc2TfZIFujhK++uFViA==","signatures":[{"sig":"MEQCIFCkza7YCaK1FRHuuH56IYco0YwwAHk2nH91BzdubvhSAiBpzUmV6aSEHrcu1jKRmnWn03bua2IRp/VIfXgmW715nQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@a11y-pulse%2ftab-orchestrator@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":176107},"type":"module","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","source":"./src/index.ts"},"./puppeteer":{"types":"./dist/adaptors/puppeteer.d.ts","import":"./dist/adaptors/puppeteer.js","source":"./src/adaptors/puppeteer.ts"}},"gitHead":"cdf225620b08438311d55916e8c946f45bd61adc","scripts":{"test":"npm run typecheck && npm run test:unit","build":"tsup && tsc -p tsconfig.build.json","test:unit":"vitest run","typecheck":"tsc --noEmit","prepublishOnly":"npm run build","test:integration":"vitest run --config vitest.integration.config.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0168c96c-dc92-4652-ba43-172bb8c985d9"}},"repository":{"url":"git+https://github.com/A11y-Pulse/audits.git","type":"git","directory":"packages/tab-orchestrator"},"_npmVersion":"12.0.2","description":"Shared Tab-session runner for A11y Pulse keyboard audits.","directories":{},"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"happy-dom":"^20.11.2","puppeteer":"^25.7.0","@a11y-pulse/focus-appearance-audit":"*","@a11y-pulse/focus-not-obscured-audit":"*","@a11y-pulse/context-change-on-focus-audit":"*"},"peerDependencies":{"puppeteer":"^25.7.0"},"peerDependenciesMeta":{"puppeteer":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/tab-orchestrator_0.3.0_1787554129433_0.7243151974042374","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@a11y-pulse/tab-orchestrator","version":"0.4.0","author":{"name":"A11y Pulse Limited"},"license":"SEE LICENSE IN LICENSE.md","_id":"@a11y-pulse/tab-orchestrator@0.4.0","maintainers":[{"name":"wildlyinaccurate","email":"joseph@wildlyinaccurate.com"}],"homepage":"https://github.com/A11y-Pulse/audits/tree/main/packages/tab-orchestrator#readme","bugs":{"url":"https://github.com/A11y-Pulse/audits/issues"},"dist":{"shasum":"6e40af9b45a0732c00fb459010978b500d0c2d68","tarball":"https://registry.npmjs.org/@a11y-pulse/tab-orchestrator/-/tab-orchestrator-0.4.0.tgz","fileCount":21,"integrity":"sha512-BcVuVAdyRtYO3d4qUP5d/AGc52+HVpO/aXvErX0FpR+juoSXu5frbbd0cVAjVmSxmU7kN+h7KieKAlQk1yQ83g==","signatures":[{"sig":"MEUCIBsuSxJwRJFGjlpOqm1zYkIn4AVeeHULjxZTzEp5mgNJAiEAqxOVpdci3/s+9eWFWWiUQfR/4GVudzLCTn13TdlD1q0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@a11y-pulse%2ftab-orchestrator@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":176537},"type":"module","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","source":"./src/index.ts"},"./puppeteer":{"types":"./dist/adaptors/puppeteer.d.ts","import":"./dist/adaptors/puppeteer.js","source":"./src/adaptors/puppeteer.ts"}},"gitHead":"c310c3a5e4de35d93061a0f3ba7ff1cc3cf84e4f","scripts":{"test":"npm run typecheck && npm run test:unit","build":"tsup && tsc -p tsconfig.build.json","test:unit":"vitest run","typecheck":"tsc --noEmit","prepublishOnly":"npm run build","test:integration":"vitest run --config vitest.integration.config.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0168c96c-dc92-4652-ba43-172bb8c985d9"}},"repository":{"url":"git+https://github.com/A11y-Pulse/audits.git","type":"git","directory":"packages/tab-orchestrator"},"_npmVersion":"12.0.2","description":"Shared Tab-session runner for A11y Pulse keyboard audits.","directories":{},"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"happy-dom":"^20.11.2","puppeteer":"^25.7.0","@a11y-pulse/focus-appearance-audit":"*","@a11y-pulse/focus-not-obscured-audit":"*","@a11y-pulse/context-change-on-focus-audit":"*"},"peerDependencies":{"puppeteer":"^25.7.0"},"peerDependenciesMeta":{"puppeteer":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/tab-orchestrator_0.4.0_1788742724220_0.677808005515139","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@a11y-pulse/tab-orchestrator","version":"0.5.0","author":{"name":"A11y Pulse"},"license":"MIT","_id":"@a11y-pulse/tab-orchestrator@0.5.0","maintainers":[{"name":"wildlyinaccurate","email":"joseph@wildlyinaccurate.com"}],"homepage":"https://github.com/A11y-Pulse/audits/tree/main/packages/tab-orchestrator#readme","bugs":{"url":"https://github.com/A11y-Pulse/audits/issues"},"dist":{"shasum":"ac9ebc99e8f53ef1684971dc3a1b7c6999afad65","tarball":"https://registry.npmjs.org/@a11y-pulse/tab-orchestrator/-/tab-orchestrator-0.5.0.tgz","fileCount":21,"integrity":"sha512-yIacWmkxJDEl1cSt9AUw8jm6yo3VSLNDucPlmq5NYl14Pdp+NRfUW29sRBy+4kRgu/CNi7+JxtzPd55wCaHcFg==","signatures":[{"sig":"MEUCIQCTlE3OG6PzalFXlwkoS51U5Y96ToKeXvekVI/jg54vMAIgf1eWM1srN5gNihxJiXfXYW3JP8lnBnTps1g6OHDSlhg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@a11y-pulse%2ftab-orchestrator@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":171328},"type":"module","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","source":"./src/index.ts"},"./puppeteer":{"types":"./dist/adaptors/puppeteer.d.ts","import":"./dist/adaptors/puppeteer.js","source":"./src/adaptors/puppeteer.ts"}},"gitHead":"3c0154a99848ea8c609ebec30fca8faf6226bc69","scripts":{"test":"npm run typecheck && npm run test:unit","build":"tsup && tsc -p tsconfig.build.json","test:unit":"vitest run","typecheck":"tsc --noEmit","prepublishOnly":"npm run build","test:integration":"vitest run --config vitest.integration.config.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0168c96c-dc92-4652-ba43-172bb8c985d9"}},"repository":{"url":"git+https://github.com/A11y-Pulse/audits.git","type":"git","directory":"packages/tab-orchestrator"},"_npmVersion":"12.0.2","description":"Shared Tab-session runner for A11y Pulse keyboard audits.","directories":{},"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"happy-dom":"^20.12.0","puppeteer":"^25.9.0","@a11y-pulse/focus-appearance-audit":"*","@a11y-pulse/focus-not-obscured-audit":"*","@a11y-pulse/context-change-on-focus-audit":"*"},"peerDependencies":{"puppeteer":"^25.9.0"},"peerDependenciesMeta":{"puppeteer":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/tab-orchestrator_0.5.0_1789121891842_0.6780780076891777","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@a11y-pulse/tab-orchestrator","version":"0.6.0","author":{"name":"A11y Pulse"},"license":"MIT","_id":"@a11y-pulse/tab-orchestrator@0.6.0","maintainers":[{"name":"wildlyinaccurate","email":"joseph@wildlyinaccurate.com"}],"homepage":"https://github.com/A11y-Pulse/audits/tree/main/packages/tab-orchestrator#readme","bugs":{"url":"https://github.com/A11y-Pulse/audits/issues"},"dist":{"shasum":"bf550e5fac902d4b0073ef8cfe5268795ee922b5","tarball":"https://registry.npmjs.org/@a11y-pulse/tab-orchestrator/-/tab-orchestrator-0.6.0.tgz","fileCount":14,"integrity":"sha512-dg4dyyS5T/Icv/b8AZYa4e0U6edcAjrbbnTqE7EGKimCMFhtaMFdyiNbv6oME3/zTQop8x+WGGyqeh0wkDtCgg==","signatures":[{"sig":"MEQCIAvHD0E+kUPCixxRu7jl5pau7yajt3zhnCmfco1VasL4AiAUp2gAtR4xK5fLAaWSu0U7ytCqU3WKoS79xSIXxWyRkQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@a11y-pulse%2ftab-orchestrator@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":139607},"type":"module","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","source":"./src/index.ts"}},"gitHead":"facc34c09fbb3982d29a1dc04944b5d035af7780","scripts":{"test":"npm run typecheck && npm run test:unit","build":"tsup && tsc -p tsconfig.build.json","test:unit":"vitest run","typecheck":"tsc --noEmit","prepublishOnly":"npm run build","test:integration":"vitest run --config vitest.integration.config.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0168c96c-dc92-4652-ba43-172bb8c985d9"}},"repository":{"url":"git+https://github.com/A11y-Pulse/audits.git","type":"git","directory":"packages/tab-orchestrator"},"_npmVersion":"12.0.2","description":"Shared Tab-session runner for A11y Pulse keyboard audits.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"@a11y-pulse/browser-adaptor":"*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"happy-dom":"^20.12.0","puppeteer":"^25.10.0","playwright-core":"^1.63.0","@a11y-pulse/focus-appearance-audit":"*","@a11y-pulse/focus-not-obscured-audit":"*","@a11y-pulse/context-change-on-focus-audit":"*"},"_npmOperationalInternal":{"tmp":"tmp/tab-orchestrator_0.6.0_1789286267495_0.9853575834940334","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"_id":"@a11y-pulse/tab-orchestrator@0.6.1","bugs":{"url":"https://github.com/A11y-Pulse/audits/issues"},"dist":{"shasum":"41f54d2ac3960a380b43d101217e2e5b9aa8a983","tarball":"https://registry.npmjs.org/@a11y-pulse/tab-orchestrator/-/tab-orchestrator-0.6.1.tgz","fileCount":14,"integrity":"sha512-7q8dZevePLReJW4HaSdzuMwJewsGlLfFTYYJP7ulwpS6fg0gmKadu+R8KLD31N7YXuv2Tfa7W2wNXeSPKn+kcw==","signatures":[{"sig":"MEUCIBh2lCAcv+ReONhdmcGpwo8SzNLSMR0H2QDlqH2vuInMAiEAj+ldBTTPGWYK7A4dvWyyoP2h58eIu5LD9B3D/vciMao=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIG8yLwKxKin7Iim7Xa9Q1BXmEefS5to8UWj6UINBlwJnAiEAvyBceSTAgxu/Wx5FBBpEswIN5KmSQcM7FqiCtOkR+B8="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@a11y-pulse%2ftab-orchestrator@0.6.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":146738},"name":"@a11y-pulse/tab-orchestrator","type":"module","author":{"name":"A11y Pulse"},"engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","source":"./src/index.ts"}},"gitHead":"1ccad438ba3be29ac3e53fceed9ebf9a35097ec5","license":"MIT","scripts":{"test":"npm run typecheck && npm run test:unit","build":"tsup && tsc -p tsconfig.build.json","test:unit":"vitest run","typecheck":"tsc --noEmit","prepublishOnly":"npm run build","test:integration":"vitest run --config vitest.integration.config.ts"},"version":"0.6.1","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0168c96c-dc92-4652-ba43-172bb8c985d9"}},"homepage":"https://github.com/A11y-Pulse/audits/tree/main/packages/tab-orchestrator#readme","repository":{"url":"git+https://github.com/A11y-Pulse/audits.git","type":"git","directory":"packages/tab-orchestrator"},"_npmVersion":"12.0.2","description":"Shared Tab-session runner for A11y Pulse keyboard audits.","directories":{},"maintainers":[{"name":"wildlyinaccurate","email":"joseph@wildlyinaccurate.com"}],"_nodeVersion":"22.23.2","dependencies":{"@a11y-pulse/browser-adaptor":"*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"happy-dom":"^20.14.5","puppeteer":"^25.11.0","playwright-core":"^1.63.0","@a11y-pulse/focus-appearance-audit":"*","@a11y-pulse/focus-not-obscured-audit":"*","@a11y-pulse/context-change-on-focus-audit":"*"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/tab-orchestrator_0.6.1_1789699028526_0.18380349786417938"}}},"time":{"created":"2026-08-20T05:01:33.028Z","modified":"2026-09-18T02:37:09.002Z","0.1.0":"2026-08-20T05:01:33.463Z","0.2.0":"2026-08-20T07:31:54.635Z","0.3.0":"2026-08-24T06:48:49.614Z","0.4.0":"2026-09-07T00:58:44.383Z","0.5.0":"2026-09-11T10:18:11.989Z","0.6.0":"2026-09-13T07:57:47.629Z","0.6.1":"2026-09-18T02:37:08.617Z"},"bugs":{"url":"https://github.com/A11y-Pulse/audits/issues"},"author":{"name":"A11y Pulse"},"license":"MIT","homepage":"https://github.com/A11y-Pulse/audits/tree/main/packages/tab-orchestrator#readme","repository":{"url":"git+https://github.com/A11y-Pulse/audits.git","type":"git","directory":"packages/tab-orchestrator"},"description":"Shared Tab-session runner for A11y Pulse keyboard audits.","maintainers":[{"name":"wildlyinaccurate","email":"joseph@wildlyinaccurate.com"}],"readme":"# @a11y-pulse/tab-orchestrator\n\n[![npm version](https://img.shields.io/npm/v/@a11y-pulse/tab-orchestrator)](https://www.npmjs.com/package/@a11y-pulse/tab-orchestrator)\n[![CI](https://github.com/A11y-Pulse/audits/actions/workflows/ci.yml/badge.svg)](https://github.com/A11y-Pulse/audits/actions/workflows/ci.yml)\n[![License: MIT](https://img.shields.io/badge/license-MIT-green)](./LICENSE.md)\n\nA shared Tab-session runner for A11y Pulse's keyboard-driven accessibility audits. It drives a page through its focusable elements once (pressing Tab, tracking visited elements, capturing screenshots and styles on demand) while one or more **consumers** each score the tab stops for their own WCAG success criterion. This lets audits like [`@a11y-pulse/focus-appearance-audit`](../focus-appearance-audit) (WCAG 2.4.7) share a single tab loop with sibling audits instead of each re-tabbing the page from scratch.\n\nIt is not an audit itself: it has no opinion on what \"passing\" means. It only owns the mechanics of moving focus, tracking cycle completion, and capturing the primitives (computed styles, clipped screenshots, unfocused/focused pairs) that consumers need.\n\nThis package was developed by [A11y Pulse](https://www.a11ypulse.com/) for its accessibility monitoring service. It is released under the [MIT License](#license).\n\n## Install\n\n```bash\nnpm install @a11y-pulse/tab-orchestrator\n```\n\nThis package drives the page through a [`BrowserAdaptor`](#browseradaptor) you supply. It has no peer dependencies: install [`@a11y-pulse/browser-adaptor`](../browser-adaptor) alongside it for the bundled Puppeteer and Playwright implementations.\n\n## `createTabOrchestrator`\n\n```ts\nimport { createTabOrchestrator } from \"@a11y-pulse/tab-orchestrator\";\n\nconst orchestrator = createTabOrchestrator(adaptor, sessionOptions);\n\norchestrator.attach(consumerA);\norchestrator.attach(consumerB);\n\nawait orchestrator.run();\n```\n\n- `createTabOrchestrator(adaptor: BrowserAdaptor, options?: TabSessionOptions)` builds a session against a single page, driven through the given [`BrowserAdaptor`](#browseradaptor). `TabSessionOptions` covers shared cost controls (`screenshotSettleDelay`, `screenshotClipBuffer`, `markerLimit`, `baselineElementLimit`), not any particular audit's policy.\n- `.attach(consumer)` registers a `TabConsumer`. Attaching after `run()` has started throws.\n- `.run()` presses Tab repeatedly, dispatching each `TabStopSnapshot` to every still-attached consumer, until either a full tab cycle completes, focus is lost, navigation happens, or every consumer has disconnected. Calling it twice throws; calling it with zero attached consumers returns immediately without tabbing.\n\nEach consumer declares the `capabilities` it needs (e.g. `baselineStyles`, `unfocusedPair`) and can disconnect independently once it has what it needs (say, after hitting its own element limit). The orchestrator keeps driving the remaining consumers. Per-stop work like unfocused-pair screenshots is only captured if a still-attached consumer actually asks for it that stop.\n\nMost callers won't build a `TabConsumer` by hand. Audit packages export a `createXAudit(options)` helper that returns one, plus a `runXAudit(adaptor, options)` convenience wrapper that builds a private single-consumer orchestrator for you. See [`@a11y-pulse/focus-appearance-audit`'s \"Shared tab session\"](../focus-appearance-audit#shared-tab-session) section for a worked example.\n\n## `BrowserAdaptor`\n\nThe orchestrator drives a page through an **adaptor**: a small interface of primitives (evaluate JS in the page, press Tab, take a clipped screenshot, etc.) so it never needs to know which browser automation library is behind it. The `BrowserAdaptor` interface and its method-by-method reference live in [`@a11y-pulse/browser-adaptor`](../browser-adaptor#browseradaptor); this package does not re-export them.\n\nThe orchestrator is the only thing that mutates the page through this adaptor during a session; consumers score snapshots, they don't call `pressTab`, take screenshots, or install observers themselves.\n\n### Supplying an adaptor\n\n```js\nimport { createTabOrchestrator } from \"@a11y-pulse/tab-orchestrator\";\nimport { PuppeteerAdaptor } from \"@a11y-pulse/browser-adaptor/puppeteer\";\n\nconst orchestrator = createTabOrchestrator(new PuppeteerAdaptor(page));\n```\n\nThis package ships no adaptor of its own. [`@a11y-pulse/browser-adaptor`](../browser-adaptor) provides `BrowserAdaptor` along with two implementations, `PuppeteerAdaptor` and `PlaywrightAdaptor`, so consumers that only need the type-level interface aren't forced to install either automation library. Other environments (Selenium, WebDriver) can be supported by implementing `BrowserAdaptor` against your automation library's page/session object; use [`@a11y-pulse/browser-adaptor`'s `src/adaptors/puppeteer.ts`](../browser-adaptor/src/adaptors/puppeteer.ts) as a reference implementation.\n\n## Releasing\n\nReleases are managed in the [A11y-Pulse/audits](https://github.com/A11y-Pulse/audits) monorepo with [Changesets](https://github.com/changesets/changesets). Publishing uses [npm trusted publishing](https://docs.npmjs.com/trusted-publishers/) (OIDC). There is no long-lived `NPM_TOKEN`.\n\n### Ship a change\n\n1. Open a PR against `main` that includes a changeset (`npx changeset`) naming `@a11y-pulse/tab-orchestrator`.\n2. After merge, the Release workflow opens a Version PR. Merging that PR publishes this package to npm and tags `@a11y-pulse/tab-orchestrator@<version>`.\n\nTrusted Publisher on npm must stay configured for:\n\n| Field | Value |\n| --- | --- |\n| Organization or user | `A11y-Pulse` |\n| Repository | `audits` |\n| Workflow filename | `release.yml` |\n\n## License\n\n[MIT](./LICENSE.md). Use it however you like, including in commercial and competing products.\n\nThe audit packages in this repository are licensed separately, under the\n[PolyForm Shield License 1.0.0](../../LICENSE.md).\n","readmeFilename":"README.md"}