@fairfox/polly 0.82.0 → 0.82.1

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.
@@ -140,8 +140,9 @@ Usage:
140
140
  polly gallery --build <dir> Write a static gallery to <dir>
141
141
  polly gallery --help Show this help
142
142
 
143
- The gallery catalogues every polly-ui primitive and doubles as the
144
- render surface for the visual-regression baselines.`);
143
+ One page that renders every polly-ui primitive: the single place to see the
144
+ components, the render surface the visual-regression baselines capture, and a
145
+ gap-check that fails when a registered primitive has no specimen.`);
145
146
  }
146
147
  function flagValue(args, flag) {
147
148
  const idx = args.indexOf(flag);
@@ -207,4 +208,4 @@ main().catch((error) => {
207
208
  process.exit(1);
208
209
  });
209
210
 
210
- //# debugId=81DE099A157158AA64756E2164756E21
211
+ //# debugId=B03800BEA169F5A764756E2164756E21
@@ -3,9 +3,9 @@
3
3
  "sources": ["../tools/gallery/src/server.ts", "../tools/gallery/src/cli.ts"],
4
4
  "sourcesContent": [
5
5
  "/**\n * Build and serve the component gallery.\n *\n * One `Bun.build` pass of client.tsx bundles the Preact app and — through the\n * components' transitive `.module.css` imports plus the global stylesheets the\n * entry pulls in — emits a single CSS artifact (verified: ~38KB for one\n * primitive). The JS and CSS outputs are served as separate routes, or written\n * to a directory for a static export. CSS-module class hashing is deterministic\n * across builds, so the bundled JS and CSS always agree (the same property the\n * extension build relies on).\n */\n\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst HERE = dirname(fileURLToPath(import.meta.url));\nconst CLIENT_ENTRY = join(HERE, \"client.tsx\");\n/**\n * Where build-lib.ts writes the static gallery at package-build time. Polly\n * ships only `dist`, so the published CLI can't bundle from source at runtime —\n * it serves these pre-built files instead. From the bundled CLI at\n * `dist/tools/gallery/src/`, three levels up is `dist/`, then `gallery/`.\n */\nconst PREBUILT_DIR = join(HERE, \"..\", \"..\", \"..\", \"gallery\");\n\nexport interface GalleryBundle {\n js: string;\n css: string;\n}\n\n/** Bundle the gallery client into a JS string and a CSS string. */\nexport async function buildGalleryBundle(): Promise<GalleryBundle> {\n const result = await Bun.build({\n entrypoints: [CLIENT_ENTRY],\n target: \"browser\",\n format: \"esm\",\n minify: false,\n sourcemap: \"inline\",\n });\n\n if (!result.success) {\n const logs = result.logs.map((log) => String(log)).join(\"\\n\");\n throw new Error(`gallery build failed:\\n${logs}`);\n }\n\n let js = \"\";\n let css = \"\";\n for (const output of result.outputs) {\n const text = await output.text();\n if (output.path.endsWith(\".css\")) css += text;\n else js += text;\n }\n return { js, css };\n}\n\n/** The page shell — links the bundle's JS and CSS as separate files. */\nfunction galleryHtml(): string {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>Polly UI gallery</title>\n<link rel=\"stylesheet\" href=\"./gallery.css\">\n</head>\n<body>\n<div id=\"app\"></div>\n<script type=\"module\" src=\"./gallery.js\"></script>\n</body>\n</html>\n`;\n}\n\nexport interface ServeOptions {\n /** Port to bind. 0 (the default) asks the OS for a free port. */\n port?: number;\n}\n\nexport interface RunningGallery {\n url: string;\n port: number;\n stop: () => void;\n}\n\n/**\n * Resolve the page assets to serve. In the monorepo (source present) the client\n * is bundled fresh; in a published package (source stripped) the pre-built files\n * written by build-lib.ts are read from disk. Either way the served bytes are\n * self-contained — no source is needed at request time.\n */\nasync function resolveAssets(): Promise<{ html: string; js: string; css: string }> {\n if (await Bun.file(CLIENT_ENTRY).exists()) {\n const bundle = await buildGalleryBundle();\n return { html: galleryHtml(), js: bundle.js, css: bundle.css };\n }\n const indexFile = Bun.file(join(PREBUILT_DIR, \"index.html\"));\n if (!(await indexFile.exists())) {\n throw new Error(\n `no gallery source or pre-built bundle found (looked for ${CLIENT_ENTRY} and ${PREBUILT_DIR}). ` +\n \"Rebuild the package with 'bun run build:lib'.\"\n );\n }\n return {\n html: await indexFile.text(),\n js: await Bun.file(join(PREBUILT_DIR, \"gallery.js\")).text(),\n css: await Bun.file(join(PREBUILT_DIR, \"gallery.css\")).text(),\n };\n}\n\n/** Build (or load) once, then serve the gallery over HTTP until `stop()`. */\nexport async function serveGallery(options: ServeOptions = {}): Promise<RunningGallery> {\n const { html, js, css } = await resolveAssets();\n const bundle = { js, css };\n\n const server = Bun.serve({\n port: options.port ?? 0,\n fetch(req) {\n const { pathname } = new URL(req.url);\n if (pathname === \"/\" || pathname === \"/index.html\") {\n return new Response(html, {\n headers: { \"Content-Type\": \"text/html; charset=utf-8\" },\n });\n }\n if (pathname === \"/gallery.js\") {\n return new Response(bundle.js, {\n headers: { \"Content-Type\": \"text/javascript; charset=utf-8\" },\n });\n }\n if (pathname === \"/gallery.css\") {\n return new Response(bundle.css, {\n headers: { \"Content-Type\": \"text/css; charset=utf-8\" },\n });\n }\n // The browser always requests a favicon; answer quietly so it doesn't\n // surface as a console error (the e2e gates on a clean console).\n if (pathname === \"/favicon.ico\") {\n return new Response(null, { status: 204 });\n }\n return new Response(\"Not found\", { status: 404 });\n },\n });\n\n const boundPort = server.port ?? options.port ?? 0;\n return {\n url: `http://localhost:${boundPort}/`,\n port: boundPort,\n stop: () => server.stop(true),\n };\n}\n\n/** Build the gallery and write index.html + gallery.js + gallery.css to a dir. */\nexport async function buildGalleryToDir(outDir: string): Promise<string[]> {\n const { html, js, css } = await resolveAssets();\n const files: Array<[string, string]> = [\n [\"index.html\", html],\n [\"gallery.js\", js],\n [\"gallery.css\", css],\n ];\n const written: string[] = [];\n for (const [name, content] of files) {\n const path = join(outDir, name);\n await Bun.write(path, content);\n written.push(path);\n }\n return written;\n}\n",
6
- "#!/usr/bin/env bun\n/**\n * `polly gallery` — serve (or statically export) the polly-ui component gallery.\n *\n * polly gallery # serve at http://localhost:4321\n * polly gallery --port 5000 # serve on a chosen port\n * polly gallery --open # serve and open the default browser\n * polly gallery --build <dir> # write a static index.html + js + css\n *\n * Hand-rolled arg parsing, matching the other polly tool CLIs.\n */\n\nimport { buildGalleryToDir, serveGallery } from \"./server.ts\";\n\nconst DEFAULT_PORT = 4321;\n\nfunction printHelp(): void {\n console.log(`polly gallery — preview every polly-ui primitive in one page.\n\nUsage:\n polly gallery [--port <n>] [--open] Serve the gallery (default port ${DEFAULT_PORT})\n polly gallery --build <dir> Write a static gallery to <dir>\n polly gallery --help Show this help\n\nThe gallery catalogues every polly-ui primitive and doubles as the\nrender surface for the visual-regression baselines.`);\n}\n\n/** Read the value following a flag, erroring if it is missing or another flag. */\nfunction flagValue(args: string[], flag: string): string | undefined {\n const idx = args.indexOf(flag);\n if (idx === -1) return undefined;\n const value = args[idx + 1];\n if (value === undefined || value.startsWith(\"-\")) {\n console.log(`error: ${flag} requires a value`);\n process.exit(1);\n }\n return value;\n}\n\nfunction openBrowser(url: string): void {\n const command =\n process.platform === \"darwin\"\n ? [\"open\", url]\n : process.platform === \"win32\"\n ? [\"cmd\", \"/c\", \"start\", \"\", url]\n : [\"xdg-open\", url];\n try {\n Bun.spawn(command, { stdout: \"ignore\", stderr: \"ignore\" });\n } catch {\n // Opening the browser is best-effort; the URL is printed regardless.\n }\n}\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n\n if (args.includes(\"--help\") || args.includes(\"-h\")) {\n printHelp();\n return;\n }\n\n const buildDir = flagValue(args, \"--build\");\n if (buildDir !== undefined) {\n const files = await buildGalleryToDir(buildDir);\n console.log(`Gallery written to ${buildDir}:`);\n for (const file of files) console.log(` ${file}`);\n return;\n }\n\n const portArg = flagValue(args, \"--port\");\n const port = portArg === undefined ? DEFAULT_PORT : Number(portArg);\n if (!Number.isInteger(port) || port < 0 || port > 65535) {\n console.log(`error: --port must be an integer in 0–65535 (got \"${portArg}\")`);\n process.exit(1);\n }\n\n let gallery: Awaited<ReturnType<typeof serveGallery>>;\n try {\n gallery = await serveGallery({ port });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.log(`error: could not start the gallery server: ${message}`);\n if (/EADDRINUSE|in use|address already/i.test(message)) {\n console.log(`Port ${port} is in use — try 'polly gallery --port <other>'.`);\n }\n process.exit(1);\n }\n\n console.log(`Polly UI gallery → ${gallery.url}`);\n console.log(\"Serving the polly-ui component gallery. Press Ctrl-C to stop.\");\n if (args.includes(\"--open\")) openBrowser(gallery.url);\n\n const shutdown = (): void => {\n gallery.stop();\n process.exit(0);\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n}\n\nmain().catch((error) => {\n console.log(error);\n process.exit(1);\n});\n"
6
+ "#!/usr/bin/env bun\n/**\n * `polly gallery` — serve (or statically export) the polly-ui component gallery.\n *\n * polly gallery # serve at http://localhost:4321\n * polly gallery --port 5000 # serve on a chosen port\n * polly gallery --open # serve and open the default browser\n * polly gallery --build <dir> # write a static index.html + js + css\n *\n * Hand-rolled arg parsing, matching the other polly tool CLIs.\n */\n\nimport { buildGalleryToDir, serveGallery } from \"./server.ts\";\n\nconst DEFAULT_PORT = 4321;\n\nfunction printHelp(): void {\n console.log(`polly gallery — preview every polly-ui primitive in one page.\n\nUsage:\n polly gallery [--port <n>] [--open] Serve the gallery (default port ${DEFAULT_PORT})\n polly gallery --build <dir> Write a static gallery to <dir>\n polly gallery --help Show this help\n\nOne page that renders every polly-ui primitive: the single place to see the\ncomponents, the render surface the visual-regression baselines capture, and a\ngap-check that fails when a registered primitive has no specimen.`);\n}\n\n/** Read the value following a flag, erroring if it is missing or another flag. */\nfunction flagValue(args: string[], flag: string): string | undefined {\n const idx = args.indexOf(flag);\n if (idx === -1) return undefined;\n const value = args[idx + 1];\n if (value === undefined || value.startsWith(\"-\")) {\n console.log(`error: ${flag} requires a value`);\n process.exit(1);\n }\n return value;\n}\n\nfunction openBrowser(url: string): void {\n const command =\n process.platform === \"darwin\"\n ? [\"open\", url]\n : process.platform === \"win32\"\n ? [\"cmd\", \"/c\", \"start\", \"\", url]\n : [\"xdg-open\", url];\n try {\n Bun.spawn(command, { stdout: \"ignore\", stderr: \"ignore\" });\n } catch {\n // Opening the browser is best-effort; the URL is printed regardless.\n }\n}\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n\n if (args.includes(\"--help\") || args.includes(\"-h\")) {\n printHelp();\n return;\n }\n\n const buildDir = flagValue(args, \"--build\");\n if (buildDir !== undefined) {\n const files = await buildGalleryToDir(buildDir);\n console.log(`Gallery written to ${buildDir}:`);\n for (const file of files) console.log(` ${file}`);\n return;\n }\n\n const portArg = flagValue(args, \"--port\");\n const port = portArg === undefined ? DEFAULT_PORT : Number(portArg);\n if (!Number.isInteger(port) || port < 0 || port > 65535) {\n console.log(`error: --port must be an integer in 0–65535 (got \"${portArg}\")`);\n process.exit(1);\n }\n\n let gallery: Awaited<ReturnType<typeof serveGallery>>;\n try {\n gallery = await serveGallery({ port });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.log(`error: could not start the gallery server: ${message}`);\n if (/EADDRINUSE|in use|address already/i.test(message)) {\n console.log(`Port ${port} is in use — try 'polly gallery --port <other>'.`);\n }\n process.exit(1);\n }\n\n console.log(`Polly UI gallery → ${gallery.url}`);\n console.log(\"Serving the polly-ui component gallery. Press Ctrl-C to stop.\");\n if (args.includes(\"--open\")) openBrowser(gallery.url);\n\n const shutdown = (): void => {\n gallery.stop();\n process.exit(0);\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n}\n\nmain().catch((error) => {\n console.log(error);\n process.exit(1);\n});\n"
7
7
  ],
8
- "mappings": ";;;;;;;;;;;;;;;;;;;;AAYA;AACA;AAEA,IAAM,OAAO,QAAQ,cAAc,YAAY,GAAG,CAAC;AACnD,IAAM,eAAe,KAAK,MAAM,YAAY;AAO5C,IAAM,eAAe,KAAK,MAAM,MAAM,MAAM,MAAM,SAAS;AAQ3D,eAAsB,kBAAkB,GAA2B;AAAA,EACjE,MAAM,SAAS,MAAM,IAAI,MAAM;AAAA,IAC7B,aAAa,CAAC,YAAY;AAAA,IAC1B,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,WAAW;AAAA,EACb,CAAC;AAAA,EAED,IAAI,CAAC,OAAO,SAAS;AAAA,IACnB,MAAM,OAAO,OAAO,KAAK,IAAI,CAAC,QAAQ,OAAO,GAAG,CAAC,EAAE,KAAK;AAAA,CAAI;AAAA,IAC5D,MAAM,IAAI,MAAM;AAAA,EAA0B,MAAM;AAAA,EAClD;AAAA,EAEA,IAAI,KAAK;AAAA,EACT,IAAI,MAAM;AAAA,EACV,WAAW,UAAU,OAAO,SAAS;AAAA,IACnC,MAAM,OAAO,MAAM,OAAO,KAAK;AAAA,IAC/B,IAAI,OAAO,KAAK,SAAS,MAAM;AAAA,MAAG,OAAO;AAAA,IACpC;AAAA,YAAM;AAAA,EACb;AAAA,EACA,OAAO,EAAE,IAAI,IAAI;AAAA;AAInB,SAAS,WAAW,GAAW;AAAA,EAC7B,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiCT,eAAe,aAAa,GAAuD;AAAA,EACjF,IAAI,MAAM,IAAI,KAAK,YAAY,EAAE,OAAO,GAAG;AAAA,IACzC,MAAM,SAAS,MAAM,mBAAmB;AAAA,IACxC,OAAO,EAAE,MAAM,YAAY,GAAG,IAAI,OAAO,IAAI,KAAK,OAAO,IAAI;AAAA,EAC/D;AAAA,EACA,MAAM,YAAY,IAAI,KAAK,KAAK,cAAc,YAAY,CAAC;AAAA,EAC3D,IAAI,CAAE,MAAM,UAAU,OAAO,GAAI;AAAA,IAC/B,MAAM,IAAI,MACR,2DAA2D,oBAAoB,oBAC7E,+CACJ;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,MAAM,MAAM,UAAU,KAAK;AAAA,IAC3B,IAAI,MAAM,IAAI,KAAK,KAAK,cAAc,YAAY,CAAC,EAAE,KAAK;AAAA,IAC1D,KAAK,MAAM,IAAI,KAAK,KAAK,cAAc,aAAa,CAAC,EAAE,KAAK;AAAA,EAC9D;AAAA;AAIF,eAAsB,YAAY,CAAC,UAAwB,CAAC,GAA4B;AAAA,EACtF,QAAQ,MAAM,IAAI,QAAQ,MAAM,cAAc;AAAA,EAC9C,MAAM,SAAS,EAAE,IAAI,IAAI;AAAA,EAEzB,MAAM,SAAS,IAAI,MAAM;AAAA,IACvB,MAAM,QAAQ,QAAQ;AAAA,IACtB,KAAK,CAAC,KAAK;AAAA,MACT,QAAQ,aAAa,IAAI,IAAI,IAAI,GAAG;AAAA,MACpC,IAAI,aAAa,OAAO,aAAa,eAAe;AAAA,QAClD,OAAO,IAAI,SAAS,MAAM;AAAA,UACxB,SAAS,EAAE,gBAAgB,2BAA2B;AAAA,QACxD,CAAC;AAAA,MACH;AAAA,MACA,IAAI,aAAa,eAAe;AAAA,QAC9B,OAAO,IAAI,SAAS,OAAO,IAAI;AAAA,UAC7B,SAAS,EAAE,gBAAgB,iCAAiC;AAAA,QAC9D,CAAC;AAAA,MACH;AAAA,MACA,IAAI,aAAa,gBAAgB;AAAA,QAC/B,OAAO,IAAI,SAAS,OAAO,KAAK;AAAA,UAC9B,SAAS,EAAE,gBAAgB,0BAA0B;AAAA,QACvD,CAAC;AAAA,MACH;AAAA,MAGA,IAAI,aAAa,gBAAgB;AAAA,QAC/B,OAAO,IAAI,SAAS,MAAM,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC3C;AAAA,MACA,OAAO,IAAI,SAAS,aAAa,EAAE,QAAQ,IAAI,CAAC;AAAA;AAAA,EAEpD,CAAC;AAAA,EAED,MAAM,YAAY,OAAO,QAAQ,QAAQ,QAAQ;AAAA,EACjD,OAAO;AAAA,IACL,KAAK,oBAAoB;AAAA,IACzB,MAAM;AAAA,IACN,MAAM,MAAM,OAAO,KAAK,IAAI;AAAA,EAC9B;AAAA;AAIF,eAAsB,iBAAiB,CAAC,QAAmC;AAAA,EACzE,QAAQ,MAAM,IAAI,QAAQ,MAAM,cAAc;AAAA,EAC9C,MAAM,QAAiC;AAAA,IACrC,CAAC,cAAc,IAAI;AAAA,IACnB,CAAC,cAAc,EAAE;AAAA,IACjB,CAAC,eAAe,GAAG;AAAA,EACrB;AAAA,EACA,MAAM,UAAoB,CAAC;AAAA,EAC3B,YAAY,MAAM,YAAY,OAAO;AAAA,IACnC,MAAM,OAAO,KAAK,QAAQ,IAAI;AAAA,IAC9B,MAAM,IAAI,MAAM,MAAM,OAAO;AAAA,IAC7B,QAAQ,KAAK,IAAI;AAAA,EACnB;AAAA,EACA,OAAO;AAAA;;;ACtJT,IAAM,eAAe;AAErB,SAAS,SAAS,GAAS;AAAA,EACzB,QAAQ,IAAI;AAAA;AAAA;AAAA,0EAG4D;AAAA;AAAA;AAAA;AAAA;AAAA,oDAKtB;AAAA;AAIpD,SAAS,SAAS,CAAC,MAAgB,MAAkC;AAAA,EACnE,MAAM,MAAM,KAAK,QAAQ,IAAI;AAAA,EAC7B,IAAI,QAAQ;AAAA,IAAI;AAAA,EAChB,MAAM,QAAQ,KAAK,MAAM;AAAA,EACzB,IAAI,UAAU,aAAa,MAAM,WAAW,GAAG,GAAG;AAAA,IAChD,QAAQ,IAAI,UAAU,uBAAuB;AAAA,IAC7C,QAAQ,KAAK,CAAC;AAAA,EAChB;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,WAAW,CAAC,KAAmB;AAAA,EACtC,MAAM,UACJ,QAAQ,aAAa,WACjB,CAAC,QAAQ,GAAG,IACZ,QAAQ,aAAa,UACnB,CAAC,OAAO,MAAM,SAAS,IAAI,GAAG,IAC9B,CAAC,YAAY,GAAG;AAAA,EACxB,IAAI;AAAA,IACF,IAAI,MAAM,SAAS,EAAE,QAAQ,UAAU,QAAQ,SAAS,CAAC;AAAA,IACzD,MAAM;AAAA;AAKV,eAAe,IAAI,GAAkB;AAAA,EACnC,MAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AAAA,EAEjC,IAAI,KAAK,SAAS,QAAQ,KAAK,KAAK,SAAS,IAAI,GAAG;AAAA,IAClD,UAAU;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,UAAU,MAAM,SAAS;AAAA,EAC1C,IAAI,aAAa,WAAW;AAAA,IAC1B,MAAM,QAAQ,MAAM,kBAAkB,QAAQ;AAAA,IAC9C,QAAQ,IAAI,sBAAsB,WAAW;AAAA,IAC7C,WAAW,QAAQ;AAAA,MAAO,QAAQ,IAAI,KAAK,MAAM;AAAA,IACjD;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,UAAU,MAAM,QAAQ;AAAA,EACxC,MAAM,OAAO,YAAY,YAAY,eAAe,OAAO,OAAO;AAAA,EAClE,IAAI,CAAC,OAAO,UAAU,IAAI,KAAK,OAAO,KAAK,OAAO,OAAO;AAAA,IACvD,QAAQ,IAAI,qDAAoD,WAAW;AAAA,IAC3E,QAAQ,KAAK,CAAC;AAAA,EAChB;AAAA,EAEA,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,UAAU,MAAM,aAAa,EAAE,KAAK,CAAC;AAAA,IACrC,OAAO,OAAO;AAAA,IACd,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACrE,QAAQ,IAAI,8CAA8C,SAAS;AAAA,IACnE,IAAI,qCAAqC,KAAK,OAAO,GAAG;AAAA,MACtD,QAAQ,IAAI,QAAQ,sDAAqD;AAAA,IAC3E;AAAA,IACA,QAAQ,KAAK,CAAC;AAAA;AAAA,EAGhB,QAAQ,IAAI,sBAAqB,QAAQ,KAAK;AAAA,EAC9C,QAAQ,IAAI,+DAA+D;AAAA,EAC3E,IAAI,KAAK,SAAS,QAAQ;AAAA,IAAG,YAAY,QAAQ,GAAG;AAAA,EAEpD,MAAM,WAAW,MAAY;AAAA,IAC3B,QAAQ,KAAK;AAAA,IACb,QAAQ,KAAK,CAAC;AAAA;AAAA,EAEhB,QAAQ,GAAG,UAAU,QAAQ;AAAA,EAC7B,QAAQ,GAAG,WAAW,QAAQ;AAAA;AAGhC,KAAK,EAAE,MAAM,CAAC,UAAU;AAAA,EACtB,QAAQ,IAAI,KAAK;AAAA,EACjB,QAAQ,KAAK,CAAC;AAAA,CACf;",
9
- "debugId": "81DE099A157158AA64756E2164756E21",
8
+ "mappings": "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",
9
+ "debugId": "B03800BEA169F5A764756E2164756E21",
10
10
  "names": []
11
11
  }
@@ -618,6 +618,13 @@ async function presetAdvisory(cfg) {
618
618
  // tools/mutate/src/cli.ts
619
619
  var HELP = `polly mutate — mutation testing + useless-test detection
620
620
 
621
+ Mutation testing breaks your code one edit at a time and checks whether a test
622
+ fails; a surviving mutant is a line no test pins down — a truer signal than line
623
+ coverage, which only proves a line ran. Read the same kill matrix the other way
624
+ and it also finds dead weight: redundant tests (every kill caught elsewhere) and
625
+ theatre (code a test ran but never actually checked). How the matrix is built:
626
+ tools/mutate/README.md.
627
+
621
628
  Usage:
622
629
  polly mutate init [--force] Scaffold a stryker.conf.json for this project
623
630
  polly mutate [run] Run Stryker, then print the useless-test report
@@ -740,4 +747,4 @@ main().then((code) => process.exit(code)).catch((err) => {
740
747
  process.exit(1);
741
748
  });
742
749
 
743
- //# debugId=768AC36DADFC60B164756E2164756E21
750
+ //# debugId=63F5B93A394460DD64756E2164756E21
@@ -11,9 +11,9 @@
11
11
  "/**\n * Orchestration for `polly mutate run` / `report`: spawn Stryker, then read the\n * mutation report and produce the useless-test analysis — gating the redundancy\n * /subsumption sections on a complete (no-bail) kill matrix.\n */\nimport { resolve } from \"node:path\";\nimport type { MutateConfig } from \"./config.ts\";\nimport { buildDb, loadMutationReport } from \"./ingest.ts\";\nimport { report } from \"./report.ts\";\nimport { isMatrixComplete } from \"./verify-matrix.ts\";\n\n/** Run Stryker against the resolved config. Inherits stdio for the live reporter; returns the exit code. */\nexport async function runStryker(cfg: MutateConfig): Promise<number> {\n // Pass --configFile only when the located config is NOT the auto-discoverable\n // root stryker.conf.json — that keeps a bare repo run identical to `stryker run`.\n const autoDiscoverable = cfg.strykerConfigPath === resolve(cfg.cwd, \"stryker.conf.json\");\n const configFlag =\n cfg.strykerConfigPath && !autoDiscoverable ? [\"--configFile\", cfg.strykerConfigPath] : [];\n const proc = Bun.spawn([\"bunx\", \"stryker\", \"run\", ...configFlag], {\n cwd: cfg.cwd,\n stdout: \"inherit\",\n stderr: \"inherit\",\n stdin: \"inherit\",\n env: process.env,\n });\n return await proc.exited;\n}\n\n/** Build the useless-test report from an existing mutation.json (no Stryker run). */\nexport async function reportFromFile(cfg: MutateConfig): Promise<string> {\n if (!(await Bun.file(cfg.reportPath).exists())) {\n throw new Error(\n `no mutation report at ${cfg.reportPath}. Run 'polly mutate run' (or 'bun run mutation') first, or pass --report <path>.`\n );\n }\n const mreport = await loadMutationReport(cfg.reportPath);\n const db = buildDb(mreport, cfg.dbPath);\n try {\n return report(db, { matrixComplete: isMatrixComplete(mreport) });\n } finally {\n db.close();\n }\n}\n\n/**\n * If the Stryker config doesn't already load polly's verify-primitive ignorer,\n * return a one-line tip. The ignorer must be in the config before the run (it's\n * read at Stryker startup), so this advises rather than mutating the user's config.\n */\nexport async function presetAdvisory(cfg: MutateConfig): Promise<string | null> {\n if (!cfg.strykerConfigPath?.endsWith(\".json\")) return null;\n try {\n const conf = (await Bun.file(cfg.strykerConfigPath).json()) as unknown as {\n plugins?: string[];\n };\n if ((conf.plugins ?? []).includes(\"@fairfox/polly/stryker\")) return null;\n return (\n \"Tip: spread pollyStrykerPreset (from @fairfox/polly/stryker) into your Stryker config — \" +\n \"verify primitives (requires/ensures/…) are runtime no-ops and their mutants always survive, \" +\n \"dragging the score down with noise. See polly#143.\"\n );\n } catch {\n return null;\n }\n}\n",
12
12
  "/**\n * Test-debt report: derive the three signals from the kill matrix.\n *\n * gaps survived mutants — code no test pins (the Stryker direction)\n * redundancy tests/files whose every kill is also caught elsewhere\n * theatre covered-but-survived — code a test runs but no test detects\n * (the Survived status under coverageAnalysis \"all\")\n *\n * Redundancy is reported at BOTH file and case level. Decisions are keyed at\n * file level (stable identity); case level is the drill-down.\n */\nimport type { Database } from \"bun:sqlite\";\nimport { buildDb, loadMutationReport, queryAll, queryGet } from \"./ingest.ts\";\n\ntype SubsumedCase = { file: string; name: string; total: number };\ntype LineCount = { line: number; mutator: string; n: number };\n\n/** Greedy set cover: smallest set of `units` whose kill-sets cover all killed mutants. */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: a textbook greedy set-cover loop — clearer whole than split.\nfunction greedyCover(units: Map<string, Set<string>>, universe: Set<string>): string[] {\n const remaining = new Set(universe);\n const chosen: string[] = [];\n const pool = new Map([...units].map(([k, v]) => [k, new Set(v)]));\n while (remaining.size > 0) {\n let best: string | null = null;\n let bestGain = 0;\n for (const [unit, set] of pool) {\n let gain = 0;\n for (const m of set) if (remaining.has(m)) gain++;\n if (gain > bestGain) {\n bestGain = gain;\n best = unit;\n }\n }\n if (best === null || bestGain === 0) break; // remaining mutants killed by nobody (shouldn't happen for killed set)\n chosen.push(best);\n for (const m of pool.get(best) ?? []) remaining.delete(m);\n pool.delete(best);\n }\n return chosen;\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: one report builder emitting all sections in order — splitting would scatter the shared db/out.\nexport function report(db: Database, opts: { matrixComplete?: boolean } = {}): string {\n // Defaults to true so `report(db)` is byte-identical to before (the parity\n // guard depends on this). When false — the kill matrix is partial (an\n // unpatched/bail runner) — the redundancy/subsumption sections would lie, so\n // they are suppressed and a warning shown; score/gaps/theatre still hold.\n const matrixComplete = opts.matrixComplete ?? true;\n const out: string[] = [];\n const p = (s = \"\") => out.push(s);\n\n // --- summary ---\n const tot = queryGet<{\n n: number;\n killed: number;\n survived: number;\n timeout: number;\n nocov: number;\n }>(\n db,\n \"SELECT count(*) n, sum(status='Killed') killed, sum(status='Survived') survived, sum(status='Timeout') timeout, sum(status='NoCoverage') nocov FROM mutants\"\n ) ?? { n: 0, killed: 0, survived: 0, timeout: 0, nocov: 0 };\n const nTests = queryGet<{ n: number }>(db, \"SELECT count(*) n FROM tests\")?.n ?? 0;\n const detected = tot.killed + tot.timeout;\n const score = ((detected / (tot.n - tot.nocov || 1)) * 100).toFixed(1);\n p(\n `MUTATION score ${score}% ${tot.killed} killed · ${tot.timeout} timeout · ${tot.survived} survived · ${tot.nocov} no-coverage (${tot.n} mutants, ${nTests} tests)`\n );\n\n if (matrixComplete) {\n // --- kill-multiplicity: how much slack is in the matrix ---\n const mult = queryAll<{ bucket: string; n: number }>(\n db,\n `\n\t\t\tSELECT CASE WHEN c=1 THEN '1' WHEN c=2 THEN '2' WHEN c BETWEEN 3 AND 5 THEN '3-5' ELSE '6+' END bucket, count(*) n\n\t\t\tFROM (SELECT mutant_id, count(*) c FROM kills GROUP BY mutant_id)\n\t\t\tGROUP BY bucket ORDER BY min(c)`\n );\n p(`\\nKILL MULTIPLICITY (killers per killed mutant — higher = more redundancy slack)`);\n for (const r of mult) p(` killed by ${String(r.bucket).padStart(3)} test(s): ${r.n}`);\n\n // --- redundancy ratio via greedy cover (case + file) ---\n const universe = new Set(\n queryAll<{ mutant_id: string }>(db, \"SELECT DISTINCT mutant_id FROM kills\").map(\n (r) => r.mutant_id\n )\n );\n const byTest = new Map<string, Set<string>>();\n for (const r of queryAll<{ test_id: string; mutant_id: string }>(\n db,\n \"SELECT test_id, mutant_id FROM kills\"\n )) {\n const set = byTest.get(r.test_id) ?? new Set<string>();\n byTest.set(r.test_id, set);\n set.add(r.mutant_id);\n }\n const byFile = new Map<string, Set<string>>();\n for (const r of queryAll<{ file: string; mid: string }>(\n db,\n \"SELECT t.file file, k.mutant_id mid FROM kills k JOIN tests t ON t.id=k.test_id\"\n )) {\n const set = byFile.get(r.file) ?? new Set<string>();\n byFile.set(r.file, set);\n set.add(r.mid);\n }\n const caseCover = greedyCover(byTest, universe);\n const fileCover = greedyCover(byFile, universe);\n p(`\\nREDUNDANCY RATIO (tests that kill something ÷ minimal covering set)`);\n p(\n ` case level: ${byTest.size} killing tests → ${caseCover.length} needed (${(byTest.size / Math.max(1, caseCover.length)).toFixed(2)}×, ~${byTest.size - caseCover.length} prunable)`\n );\n p(\n ` file level: ${byFile.size} killing files → ${fileCover.length} needed (${(byFile.size / Math.max(1, fileCover.length)).toFixed(2)}×, ~${byFile.size - fileCover.length} prunable)`\n );\n\n // --- fully subsumed FILES (every mutant they kill is killed elsewhere too) ---\n const subsumedFiles = queryAll<{ file: string; kills: number }>(\n db,\n `\n\t\t\tWITH file_kill AS (SELECT DISTINCT t.file file, k.mutant_id mid FROM kills k JOIN tests t ON t.id=k.test_id),\n\t\t\t owner AS (SELECT mid, count(DISTINCT file) nf, min(file) only_file FROM file_kill GROUP BY mid)\n\t\t\tSELECT fk.file, count(DISTINCT fk.mid) kills,\n\t\t\t sum(CASE WHEN o.nf=1 THEN 1 ELSE 0 END) unique_kills\n\t\t\tFROM file_kill fk JOIN owner o ON o.mid=fk.mid\n\t\t\tGROUP BY fk.file HAVING unique_kills=0 ORDER BY kills DESC`\n );\n p(`\\nSUBSUMED FILES (file-level identity — safe-to-review deletion candidates)`);\n if (subsumedFiles.length === 0)\n p(` none — every test file kills at least one mutant no other file catches`);\n for (const r of subsumedFiles) p(` ${r.file} (${r.kills} kills, 0 unique)`);\n\n // --- fully subsumed CASES (drill-down) ---\n const subsumedCases = queryAll<SubsumedCase>(\n db,\n `\n\t\t\tWITH mk AS (SELECT mutant_id, count(*) c FROM kills GROUP BY mutant_id),\n\t\t\t tk AS (SELECT test_id, count(*) total, sum(CASE WHEN mk.c=1 THEN 1 ELSE 0 END) uniq\n\t\t\t FROM kills JOIN mk USING(mutant_id) GROUP BY test_id)\n\t\t\tSELECT t.file, t.name, tk.total FROM tk JOIN tests t ON t.id=tk.test_id\n\t\t\tWHERE tk.total>0 AND tk.uniq=0 ORDER BY t.file, tk.total DESC`\n );\n const byFileCases = new Map<string, SubsumedCase[]>();\n for (const r of subsumedCases) {\n const rows = byFileCases.get(r.file) ?? [];\n byFileCases.set(r.file, rows);\n rows.push(r);\n }\n p(\n `\\nSUBSUMED CASES (${subsumedCases.length} individual tests whose every kill is caught elsewhere)`\n );\n for (const [file, rows] of byFileCases) {\n p(` ${file}`);\n for (const r of rows) p(` “${r.name}” (${r.total} kills, 0 unique)`);\n }\n } else {\n p(`\\n⚠ KILL MATRIX INCOMPLETE — redundancy/subsumption analysis suppressed.`);\n p(` Every mutant has at most one recorded killer, so \"which tests are redundant\"`);\n p(` cannot be derived. This needs the no-bail patched Bun runner (not shipped with`);\n p(\n ` @fairfox/polly). Run 'polly mutate verify' to diagnose. Score/gaps/theatre below still hold.`\n );\n }\n\n // Under coverageAnalysis \"all\", Stryker classifies a non-killed mutant as\n // NoCoverage (no test runs it — a true gap) or Survived (a test runs it but\n // nothing detects the mutation — theatre). That status split IS the\n // gap/theatre distinction; it requires coverage to be on (see README).\n const srcFile = queryGet<{ file: string }>(db, \"SELECT file FROM mutants LIMIT 1\")?.file;\n\n // --- gaps: code no test even executes ---\n const gaps = queryAll<LineCount>(\n db,\n \"SELECT line, mutator, count(*) n FROM mutants WHERE status='NoCoverage' GROUP BY line, mutator ORDER BY line\"\n );\n const gapTotal = gaps.reduce((a, r) => a + r.n, 0);\n p(`\\nGAPS (NoCoverage — no test executes this code: ${gapTotal})`);\n if (gapTotal === 0) p(` none — every mutable location is reached by some test`);\n for (const r of gaps) p(` ${srcFile}:${r.line} ${r.mutator}${r.n > 1 ? ` ×${r.n}` : \"\"}`);\n\n // --- theatre: covered but survived ---\n const theatre = queryAll<LineCount>(\n db,\n \"SELECT line, mutator, count(*) n FROM mutants WHERE status='Survived' GROUP BY line, mutator ORDER BY line\"\n );\n const theatreTotal = theatre.reduce((a, r) => a + r.n, 0);\n p(`\\nTHEATRE (Survived — code is covered but no test detects the mutation: ${theatreTotal})`);\n if (theatreTotal === 0) p(` none`);\n for (const r of theatre) p(` ${srcFile}:${r.line} ${r.mutator}${r.n > 1 ? ` ×${r.n}` : \"\"}`);\n\n return out.join(\"\\n\");\n}\n\nif (import.meta.main) {\n const reportPath = process.argv[2] ?? \"reports/mutation/mutation.json\";\n const db = buildDb(await loadMutationReport(reportPath), \"reports/test-debt.sqlite\");\n console.log(report(db));\n db.close();\n}\n",
13
13
  "/**\n * Verification artefact for the kill-matrix contract.\n *\n * The whole useless-test analysis rests on one fact: the patched bun runner\n * emits a COMPLETE kill matrix — every test that detects a mutant appears in\n * killedBy, not just the first. That depends on a pinned pair: (Bun version,\n * plugin version + our patch). A Bun upgrade that changes JUnit output, or a\n * patch that stops applying, would silently collapse killedBy to one id each —\n * a green board with the redundancy signal quietly dead (the classic trap).\n *\n * `verifyMatrix` runs the full contract and returns the result; `isMatrixComplete`\n * is the side-effect-free gate the report path consults to decide whether the\n * redundancy/subsumption sections are trustworthy. Run the CLI form after any\n * bump of Bun or the plugin:\n *\n * polly mutate verify # uses the existing report\n * polly mutate verify --run # runs stryker first\n */\nimport { loadMutationReport, type MutationReport } from \"./ingest.ts\";\n\nconst DEFAULT_REPORT = \"reports/mutation/mutation.json\";\n\nexport interface MatrixCheck {\n ok: boolean;\n checks: { name: string; ok: boolean; detail: string }[];\n}\n\n/**\n * Side-effect-free gate: is the kill matrix trustworthy for redundancy /\n * subsumption analysis? True only when\n * (a) some killed mutant has >1 killer — proof the no-bail patched runner\n * recorded EVERY killer, not just the first (verifyMatrix check #4), and\n * (b) coverage was collected — not every mutant is NoCoverage, which would\n * mean the coverage dump broke (verifyMatrix check #5).\n * Without both, REDUNDANCY/SUBSUMED would be computed off a partial matrix and\n * lie, so the report path falls back to score + gaps + theatre only.\n */\nexport function isMatrixComplete(report: MutationReport): boolean {\n const mutants = Object.values(report.files).flatMap((f) => f.mutants);\n if (mutants.length === 0) return false;\n const killed = mutants.filter((m) => m.status === \"Killed\");\n const multiKiller = killed.some((m) => (m.killedBy ?? []).length > 1);\n const noCov = mutants.filter((m) => m.status === \"NoCoverage\").length;\n const coverageCollected = noCov < mutants.length;\n return multiKiller && coverageCollected;\n}\n\n/**\n * Run the full kill-matrix contract (all five checks), optionally running a\n * fresh Stryker pass first. Returns the result rather than exiting, so callers\n * decide what to do with it; the `import.meta.main` wrapper prints and sets the\n * exit code.\n */\nexport async function verifyMatrix(\n opts: { reportPath?: string; run?: boolean; strykerConfig?: string } = {}\n): Promise<MatrixCheck> {\n const reportPath = opts.reportPath ?? DEFAULT_REPORT;\n\n if (opts.run) {\n console.log(\"Running mutation pass (this can take many minutes for a large mutate set)...\");\n const cmd = [\n \"bunx\",\n \"stryker\",\n \"run\",\n ...(opts.strykerConfig ? [\"--configFile\", opts.strykerConfig] : []),\n ];\n const proc = Bun.spawn(cmd, { stdout: \"inherit\", stderr: \"inherit\" });\n const code = await proc.exited;\n if (code !== 0) {\n return { ok: false, checks: [{ name: \"stryker run\", ok: false, detail: `exited ${code}` }] };\n }\n }\n\n if (!(await Bun.file(reportPath).exists())) {\n return {\n ok: false,\n checks: [\n {\n name: \"report exists\",\n ok: false,\n detail: `no report at ${reportPath}. Run with --run, or 'bun run mutation' first.`,\n },\n ],\n };\n }\n\n const report = await loadMutationReport(reportPath);\n const checks: { name: string; ok: boolean; detail: string }[] = [];\n const add = (name: string, ok: boolean, detail: string) => checks.push({ name, ok, detail });\n\n // 1. schema present\n add(\"schema version present\", !!report.schemaVersion, `schemaVersion=${report.schemaVersion}`);\n\n // 2. testFiles keyed by real paths, not the \"\" bucket (file-level identity intact)\n const tfKeys = Object.keys(report.testFiles ?? {});\n const realPaths = tfKeys.filter((k) => k && k !== \"(unknown)\");\n add(\n \"testFiles keyed by real paths\",\n realPaths.length > 0 && !tfKeys.includes(\"\"),\n `${realPaths.length} file(s): ${realPaths.slice(0, 2).join(\", \")}${realPaths.length > 2 ? \"…\" : \"\"}`\n );\n\n // 3. test ids resolve\n const testIds = new Set(\n Object.values(report.testFiles ?? {}).flatMap((tf) => tf.tests.map((t) => t.id))\n );\n const mutants = Object.values(report.files).flatMap((f) => f.mutants);\n const killed = mutants.filter((m) => m.status === \"Killed\");\n const danglingKb = killed.filter((m) => (m.killedBy ?? []).some((id) => !testIds.has(id)));\n add(\n \"every killedBy id resolves to a test\",\n danglingKb.length === 0,\n `${danglingKb.length} dangling`\n );\n\n // 4. THE contract: a complete matrix means some killed mutant has >1 killer.\n // If bail silently re-engaged, every killedBy would have length 1.\n const withKb = killed.filter((m) => (m.killedBy ?? []).length > 0);\n const multi = killed.filter((m) => (m.killedBy ?? []).length > 1);\n add(\n \"killed mutants carry killedBy\",\n killed.length > 0 && withKb.length === killed.length,\n `${withKb.length}/${killed.length}`\n );\n add(\n \"matrix is complete (no-bail): >1 killer exists\",\n multi.length > 0,\n `${multi.length} mutant(s) killed by >1 test — collapses to 0 if bail re-engages`\n );\n\n // 5. coverage extraction works: if the afterAll dump fails, the coverage map is\n // empty and Stryker marks EVERY mutant NoCoverage (theatre/gap split dies).\n const noCov = mutants.filter((m) => m.status === \"NoCoverage\").length;\n add(\n \"coverage collected (not all NoCoverage)\",\n noCov < mutants.length,\n `${noCov}/${mutants.length} NoCoverage — all-NoCoverage means the coverage dump broke`\n );\n\n return { ok: checks.every((c) => c.ok), checks };\n}\n\nif (import.meta.main) {\n const result = await verifyMatrix({ run: process.argv.includes(\"--run\") });\n console.log(\"\\nKill-matrix contract:\");\n for (const c of result.checks) {\n console.log(` ${c.ok ? \"✓\" : \"✗\"} ${c.name} (${c.detail})`);\n }\n if (!result.ok) {\n console.log(\n \"\\n✗ Contract broken. The pinned pair has drifted — re-check Bun version and that the patch applies (bun install).\"\n );\n process.exit(1);\n }\n console.log(\"\\n✓ Kill-matrix contract holds.\");\n}\n",
14
- "#!/usr/bin/env bun\n/**\n * `polly mutate` — run Stryker mutation testing and surface useless/redundant\n * tests (the inverse reading of the kill matrix). Thin dispatcher over the\n * reusable functions in this directory.\n */\nimport { parseMutateArgs } from \"./args.ts\";\nimport { resolveMutateConfig } from \"./config.ts\";\nimport { decide, status } from \"./decisions.ts\";\nimport { buildDb, loadMutationReport } from \"./ingest.ts\";\nimport { initConfig } from \"./init.ts\";\nimport { presetAdvisory, reportFromFile, runStryker } from \"./run.ts\";\nimport { verifyMatrix } from \"./verify-matrix.ts\";\n\nconst HELP = `polly mutate — mutation testing + useless-test detection\n\nUsage:\n polly mutate init [--force] Scaffold a stryker.conf.json for this project\n polly mutate [run] Run Stryker, then print the useless-test report\n polly mutate report Print the report from an existing mutation.json\n polly mutate decisions Review verdicts: needs-review / stale / settled\n polly mutate decisions decide <file> <keep|prune|rewrite|investigate> \"<rationale>\"\n polly mutate verify [--run] Assert the kill-matrix contract (exit 1 on drift)\n polly mutate help Show this help\n\nFlags:\n --config <path> Stryker config (default: auto-discovered)\n --report <path> mutation report JSON (default: reports/mutation/mutation.json)\n --decisions <path> verdict log (default: .polly/test-debt/decisions.jsonl)\n --db <path> intermediate SQLite (default: in-memory)\n --no-report 'run' only — skip the analysis\n -h, --help\n\nThe redundancy/subsumption sections need a COMPLETE kill matrix (the no-bail\npatched Bun runner). Without it the report degrades to score + gaps + theatre;\n'polly mutate verify' diagnoses the matrix.`;\n\nasync function openDb(\n reportPath: string,\n dbPath: string\n): Promise<ReturnType<typeof buildDb> | null> {\n if (!(await Bun.file(reportPath).exists())) {\n console.log(\n `no mutation report at ${reportPath}. Run 'polly mutate run' first, or pass --report <path>.`\n );\n return null;\n }\n return buildDb(await loadMutationReport(reportPath), dbPath);\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: a flat verb dispatcher — the branches are the command surface.\nasync function main(): Promise<number> {\n const args = parseMutateArgs(process.argv.slice(2));\n if (args.help) {\n console.log(HELP);\n return 0;\n }\n\n const cwd = process.cwd();\n const cfg = await resolveMutateConfig(cwd, args);\n\n switch (args.verb) {\n case \"init\": {\n const result = await initConfig(cwd, { force: args.force });\n if (!result.created) {\n console.log(\n `stryker.conf.json already exists at ${result.configPath}. Re-run with --force to overwrite.`\n );\n return 1;\n }\n console.log(`✓ wrote ${result.configPath}`);\n console.log(` plugin: ${result.pluginRef}`);\n console.log(` mutate: ${result.mutate.join(\", \")}`);\n console.log(` testFiles: ${result.testGlob}`);\n for (const w of result.warnings) console.log(` ⚠ ${w}`);\n console.log(\"\\nNext: polly mutate run\");\n return 0;\n }\n\n case \"run\": {\n const tip = await presetAdvisory(cfg);\n if (tip) console.log(`${tip}\\n`);\n const code = await runStryker(cfg);\n if (code !== 0) return code;\n if (args.noReport) return 0;\n console.log(`\\n${await reportFromFile(cfg)}`);\n return 0;\n }\n\n case \"report\": {\n console.log(await reportFromFile(cfg));\n return 0;\n }\n\n case \"decisions\": {\n const db = await openDb(cfg.reportPath, cfg.dbPath);\n if (!db) return 1;\n try {\n if (args.rest[0] === \"decide\") {\n const [, file, verdict, ...r] = args.rest;\n if (!file || !verdict) {\n console.log(\n 'usage: polly mutate decisions decide <file> <keep|prune|rewrite|investigate> \"<rationale>\"'\n );\n return 1;\n }\n await decide(file, verdict, r.join(\" \").replace(/^\"|\"$/g, \"\"), db, cfg.decisionsPath);\n } else {\n console.log(await status(db, cfg.decisionsPath));\n }\n } finally {\n db.close();\n }\n return 0;\n }\n\n case \"verify\": {\n const result = await verifyMatrix({\n reportPath: cfg.reportPath,\n run: args.run,\n strykerConfig: cfg.strykerConfigPath ?? undefined,\n });\n console.log(\"\\nKill-matrix contract:\");\n for (const c of result.checks) console.log(` ${c.ok ? \"✓\" : \"✗\"} ${c.name} (${c.detail})`);\n if (!result.ok) {\n console.log(\n \"\\n✗ Contract broken. The pinned pair has drifted — re-check Bun version and that the patch applies (bun install).\"\n );\n return 1;\n }\n console.log(\"\\n✓ Kill-matrix contract holds.\");\n return 0;\n }\n\n default:\n console.log(`Unknown subcommand: ${args.verb}\\n`);\n console.log(HELP);\n return 1;\n }\n}\n\nmain()\n .then((code) => process.exit(code))\n .catch((err) => {\n console.log(`\\n❌ ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n });\n"
14
+ "#!/usr/bin/env bun\n/**\n * `polly mutate` — run Stryker mutation testing and surface useless/redundant\n * tests (the inverse reading of the kill matrix). Thin dispatcher over the\n * reusable functions in this directory.\n */\nimport { parseMutateArgs } from \"./args.ts\";\nimport { resolveMutateConfig } from \"./config.ts\";\nimport { decide, status } from \"./decisions.ts\";\nimport { buildDb, loadMutationReport } from \"./ingest.ts\";\nimport { initConfig } from \"./init.ts\";\nimport { presetAdvisory, reportFromFile, runStryker } from \"./run.ts\";\nimport { verifyMatrix } from \"./verify-matrix.ts\";\n\nconst HELP = `polly mutate — mutation testing + useless-test detection\n\nMutation testing breaks your code one edit at a time and checks whether a test\nfails; a surviving mutant is a line no test pins down — a truer signal than line\ncoverage, which only proves a line ran. Read the same kill matrix the other way\nand it also finds dead weight: redundant tests (every kill caught elsewhere) and\ntheatre (code a test ran but never actually checked). How the matrix is built:\ntools/mutate/README.md.\n\nUsage:\n polly mutate init [--force] Scaffold a stryker.conf.json for this project\n polly mutate [run] Run Stryker, then print the useless-test report\n polly mutate report Print the report from an existing mutation.json\n polly mutate decisions Review verdicts: needs-review / stale / settled\n polly mutate decisions decide <file> <keep|prune|rewrite|investigate> \"<rationale>\"\n polly mutate verify [--run] Assert the kill-matrix contract (exit 1 on drift)\n polly mutate help Show this help\n\nFlags:\n --config <path> Stryker config (default: auto-discovered)\n --report <path> mutation report JSON (default: reports/mutation/mutation.json)\n --decisions <path> verdict log (default: .polly/test-debt/decisions.jsonl)\n --db <path> intermediate SQLite (default: in-memory)\n --no-report 'run' only — skip the analysis\n -h, --help\n\nThe redundancy/subsumption sections need a COMPLETE kill matrix (the no-bail\npatched Bun runner). Without it the report degrades to score + gaps + theatre;\n'polly mutate verify' diagnoses the matrix.`;\n\nasync function openDb(\n reportPath: string,\n dbPath: string\n): Promise<ReturnType<typeof buildDb> | null> {\n if (!(await Bun.file(reportPath).exists())) {\n console.log(\n `no mutation report at ${reportPath}. Run 'polly mutate run' first, or pass --report <path>.`\n );\n return null;\n }\n return buildDb(await loadMutationReport(reportPath), dbPath);\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: a flat verb dispatcher — the branches are the command surface.\nasync function main(): Promise<number> {\n const args = parseMutateArgs(process.argv.slice(2));\n if (args.help) {\n console.log(HELP);\n return 0;\n }\n\n const cwd = process.cwd();\n const cfg = await resolveMutateConfig(cwd, args);\n\n switch (args.verb) {\n case \"init\": {\n const result = await initConfig(cwd, { force: args.force });\n if (!result.created) {\n console.log(\n `stryker.conf.json already exists at ${result.configPath}. Re-run with --force to overwrite.`\n );\n return 1;\n }\n console.log(`✓ wrote ${result.configPath}`);\n console.log(` plugin: ${result.pluginRef}`);\n console.log(` mutate: ${result.mutate.join(\", \")}`);\n console.log(` testFiles: ${result.testGlob}`);\n for (const w of result.warnings) console.log(` ⚠ ${w}`);\n console.log(\"\\nNext: polly mutate run\");\n return 0;\n }\n\n case \"run\": {\n const tip = await presetAdvisory(cfg);\n if (tip) console.log(`${tip}\\n`);\n const code = await runStryker(cfg);\n if (code !== 0) return code;\n if (args.noReport) return 0;\n console.log(`\\n${await reportFromFile(cfg)}`);\n return 0;\n }\n\n case \"report\": {\n console.log(await reportFromFile(cfg));\n return 0;\n }\n\n case \"decisions\": {\n const db = await openDb(cfg.reportPath, cfg.dbPath);\n if (!db) return 1;\n try {\n if (args.rest[0] === \"decide\") {\n const [, file, verdict, ...r] = args.rest;\n if (!file || !verdict) {\n console.log(\n 'usage: polly mutate decisions decide <file> <keep|prune|rewrite|investigate> \"<rationale>\"'\n );\n return 1;\n }\n await decide(file, verdict, r.join(\" \").replace(/^\"|\"$/g, \"\"), db, cfg.decisionsPath);\n } else {\n console.log(await status(db, cfg.decisionsPath));\n }\n } finally {\n db.close();\n }\n return 0;\n }\n\n case \"verify\": {\n const result = await verifyMatrix({\n reportPath: cfg.reportPath,\n run: args.run,\n strykerConfig: cfg.strykerConfigPath ?? undefined,\n });\n console.log(\"\\nKill-matrix contract:\");\n for (const c of result.checks) console.log(` ${c.ok ? \"✓\" : \"✗\"} ${c.name} (${c.detail})`);\n if (!result.ok) {\n console.log(\n \"\\n✗ Contract broken. The pinned pair has drifted — re-check Bun version and that the patch applies (bun install).\"\n );\n return 1;\n }\n console.log(\"\\n✓ Kill-matrix contract holds.\");\n return 0;\n }\n\n default:\n console.log(`Unknown subcommand: ${args.verb}\\n`);\n console.log(HELP);\n return 1;\n }\n}\n\nmain()\n .then((code) => process.exit(code))\n .catch((err) => {\n console.log(`\\n❌ ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n });\n"
15
15
  ],
16
- "mappings": "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",
17
- "debugId": "768AC36DADFC60B164756E2164756E21",
16
+ "mappings": "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",
17
+ "debugId": "63F5B93A394460DD64756E2164756E21",
18
18
  "names": []
19
19
  }
@@ -298,6 +298,10 @@ function reportMutate(report) {
298
298
  function showHelp() {
299
299
  process.stdout.write(`polly coverage — coverage policy, orphan detection, Stryker target validation
300
300
 
301
+ ` + ` Coverage that a line ran isn't proof anything checks it. This enforces a
302
+ ` + ` per-file floor with explicit, owned exemptions so test debt stays visible,
303
+ ` + ` and flags orphans (source no test imports) and drifted Stryker targets.
304
+
301
305
  ` + ` --strict-orphans fail on source no unit test imports
302
306
  ` + ` --orphans list orphan files
303
307
  ` + ` --no-mutate skip the Stryker mutate/testFiles check
@@ -336,4 +340,4 @@ async function main() {
336
340
  }
337
341
  await main();
338
342
 
339
- //# debugId=7B6414401C7DC44464756E2164756E21
343
+ //# debugId=7C14BCD836C3C95164756E2164756E21
@@ -4,10 +4,10 @@
4
4
  "sourcesContent": [
5
5
  "/**\n * @fairfox/polly/test/coverage — the coverage-policy engine.\n *\n * Parses a `bun test --coverage` table and applies a {@link CoverageConfig}.\n * It fails on four conditions, not just low numbers: a non-exempt file below\n * the floor, an exempt key whose source no longer exists, an exemption whose\n * `claimedBy` test no longer exists, and an exempt file that has climbed back\n * over the floor (promote it). It also reports orphans — source files no unit\n * test imports, the blind spot a coverage table can't show.\n *\n * Everything here is parameterised by the project root, so the same engine\n * backs Polly's own gate and the consumer-facing `polly coverage` command.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { Glob } from \"bun\";\nimport type { CoverageConfig } from \"./types\";\n\nexport interface CoverageRow {\n /** Project-relative, e.g. `src/shared/lib/state.ts`. */\n file: string;\n funcs: number;\n lines: number;\n}\n\nexport interface Violation {\n file: string;\n metric: \"lines\" | \"funcs\";\n observed: number;\n required: number;\n}\n\nexport interface CoverageFindings {\n rowCount: number;\n violations: Violation[];\n staleExempts: string[];\n missingExemptFiles: string[];\n missingClaimedBy: Array<{ file: string; claimedBy: string }>;\n orphans: string[];\n /** True when a floor was configured; false means report-only. */\n enforced: boolean;\n}\n\nconst DEFAULT_SRC = \"src\";\n\n/** `../src/foo.ts` (run from a subdir) → `src/foo.ts` (project-relative). */\nfunction normalizePath(raw: string): string {\n return raw.replace(/^(?:\\.\\.\\/)+/, \"\");\n}\n\n/**\n * Parse the `bun test --coverage` table. Only rows under `srcDir` are\n * policy-bearing; the `All files` summary and test-infra rows are skipped.\n * Column order is `File | % Funcs | % Lines | Uncovered`.\n */\nexport function parseCoverageTable(text: string, srcDir: string): CoverageRow[] {\n const prefix = `${srcDir}/`;\n const rows: CoverageRow[] = [];\n for (const line of text.split(\"\\n\")) {\n if (!line.includes(\"|\")) continue;\n if (line.includes(\"All files\") || line.includes(\"% Funcs\")) continue;\n if (line.trim().startsWith(\"---\")) continue;\n\n const cells = line.split(\"|\").map((c) => c.trim());\n if (cells.length < 3) continue;\n\n const file = normalizePath(cells[0] ?? \"\");\n const funcs = Number(cells[1]);\n const lines = Number(cells[2]);\n if (!file.startsWith(prefix) || Number.isNaN(funcs) || Number.isNaN(lines)) continue;\n\n rows.push({ file, funcs, lines });\n }\n return rows;\n}\n\n/** Run `bun test --coverage` in the configured cwd and return combined output. */\nexport async function runCoverage(root: string, testCwd: string): Promise<string> {\n const proc = Bun.spawn([\"bun\", \"test\", \"--coverage\"], {\n cwd: join(root, testCwd),\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n const [out, err] = await Promise.all([\n new Response(proc.stdout).text(),\n new Response(proc.stderr).text(),\n ]);\n await proc.exited;\n if (proc.exitCode !== 0) {\n throw new Error(`bun test --coverage exited ${proc.exitCode}\\n${err}`);\n }\n return `${out}\\n${err}`;\n}\n\nfunction evaluateRows(\n rows: CoverageRow[],\n config: CoverageConfig\n): { violations: Violation[]; staleExempts: string[] } {\n const t = config.defaultThreshold;\n const exempt = config.exempt ?? {};\n const violations: Violation[] = [];\n const staleExempts: string[] = [];\n if (!t) return { violations, staleExempts };\n\n for (const row of rows) {\n if (exempt[row.file]) {\n if (row.lines >= t.lines && row.funcs >= t.funcs) staleExempts.push(row.file);\n continue;\n }\n if (row.lines < t.lines) {\n violations.push({ file: row.file, metric: \"lines\", observed: row.lines, required: t.lines });\n }\n if (row.funcs < t.funcs) {\n violations.push({ file: row.file, metric: \"funcs\", observed: row.funcs, required: t.funcs });\n }\n }\n return { violations, staleExempts };\n}\n\nfunction validateExemptions(\n root: string,\n config: CoverageConfig\n): { missingExemptFiles: string[]; missingClaimedBy: Array<{ file: string; claimedBy: string }> } {\n const missingExemptFiles: string[] = [];\n const missingClaimedBy: Array<{ file: string; claimedBy: string }> = [];\n for (const [file, entry] of Object.entries(config.exempt ?? {})) {\n if (!existsSync(resolve(root, file))) missingExemptFiles.push(file);\n const claimedBy = entry.claimedBy.trim();\n if (!claimedBy.startsWith(\"n/a\") && !existsSync(resolve(root, claimedBy))) {\n missingClaimedBy.push({ file, claimedBy });\n }\n }\n return { missingExemptFiles, missingClaimedBy };\n}\n\n/** Source files no row covers and no exemption names — the coverage blind spot. */\nasync function findOrphans(\n root: string,\n srcDir: string,\n covered: Set<string>,\n config: CoverageConfig\n): Promise<string[]> {\n const exempt = config.exempt ?? {};\n const orphans: string[] = [];\n const glob = new Glob(`${srcDir}/**/*.{ts,tsx}`);\n for await (const file of glob.scan({ cwd: root, onlyFiles: true })) {\n if (file.endsWith(\".d.ts\") || /\\.test\\.tsx?$/.test(file) || file.includes(\"/__tests__/\")) {\n continue;\n }\n if (covered.has(file) || exempt[file]) continue;\n orphans.push(file);\n }\n return orphans.sort();\n}\n\n/** Apply the policy to a parsed table. Pure — no spawning. */\nexport async function evaluateCoverage(\n root: string,\n rows: CoverageRow[],\n config: CoverageConfig\n): Promise<CoverageFindings> {\n const srcDir = config.srcDir ?? DEFAULT_SRC;\n const { violations, staleExempts } = evaluateRows(rows, config);\n const { missingExemptFiles, missingClaimedBy } = validateExemptions(root, config);\n const orphans = await findOrphans(root, srcDir, new Set(rows.map((r) => r.file)), config);\n return {\n rowCount: rows.length,\n violations,\n staleExempts,\n missingExemptFiles,\n missingClaimedBy,\n orphans,\n enforced: config.defaultThreshold !== undefined,\n };\n}\n\n/** Run the suite under coverage and apply the policy. */\nexport async function enforceCoverage(\n root: string,\n config: CoverageConfig,\n coverageText?: string\n): Promise<CoverageFindings> {\n const srcDir = config.srcDir ?? DEFAULT_SRC;\n const text = coverageText ?? (await runCoverage(root, config.testCwd ?? \".\"));\n const rows = parseCoverageTable(text, srcDir);\n return evaluateCoverage(root, rows, config);\n}\n\n/** True when the findings represent a policy failure (orphans are advisory\n * unless `strictOrphans`). */\nexport function hasFailure(findings: CoverageFindings, strictOrphans: boolean): boolean {\n return (\n findings.violations.length > 0 ||\n findings.staleExempts.length > 0 ||\n findings.missingExemptFiles.length > 0 ||\n findings.missingClaimedBy.length > 0 ||\n (strictOrphans && findings.orphans.length > 0)\n );\n}\n",
6
6
  "/**\n * @fairfox/polly/test/coverage — zero-config loading.\n *\n * `polly coverage` runs without any config: it looks for a `coverage.config.ts`\n * (or `.js`) at the project root, and if there is none it returns an empty\n * config, which the engine treats as report-only — it prints the numbers and\n * the orphan count but never fails the build. A consumer opts into enforcement\n * by adding a `defaultThreshold`, and into legible tiering by adding `exempt`\n * entries. This mirrors how `polly test --tier` discovers tiers by convention.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { isAbsolute, join, resolve } from \"node:path\";\nimport type { CoverageConfig } from \"./types\";\n\nexport interface LoadedConfig {\n config: CoverageConfig;\n /** Absolute path the config was loaded from, or null for the zero-config default. */\n source: string | null;\n}\n\nfunction isCoverageConfig(value: unknown): value is CoverageConfig {\n return typeof value === \"object\" && value !== null;\n}\n\nasync function importConfig(path: string): Promise<CoverageConfig> {\n const mod: Record<string, unknown> = await import(path);\n const candidate = mod[\"config\"] ?? mod[\"default\"];\n if (!isCoverageConfig(candidate)) {\n throw new Error(`${path} must export \\`config\\` (a CoverageConfig object)`);\n }\n return candidate;\n}\n\n/**\n * Resolve the coverage config. With `explicitPath` (Polly's own front-end\n * passes scripts/coverage.config.ts) that file must exist. Otherwise look for\n * coverage.config.{ts,js} at the root; absent → the zero-config report-only\n * default.\n */\nexport async function loadCoverageConfig(\n root: string,\n explicitPath?: string\n): Promise<LoadedConfig> {\n if (explicitPath) {\n const abs = isAbsolute(explicitPath) ? explicitPath : resolve(root, explicitPath);\n if (!existsSync(abs)) throw new Error(`coverage config not found: ${abs}`);\n return { config: await importConfig(abs), source: abs };\n }\n\n for (const name of [\"coverage.config.ts\", \"coverage.config.js\"]) {\n const abs = join(root, name);\n if (existsSync(abs)) return { config: await importConfig(abs), source: abs };\n }\n return { config: {}, source: null };\n}\n",
7
- "#!/usr/bin/env bun\n\n/**\n * @fairfox/polly/test/coverage — consumer-facing `polly coverage`.\n *\n * Zero-config: run it in any Polly project and it reports per-file coverage,\n * orphan source files, and (if a Stryker config is present) dead mutate/test\n * globs. Add a `coverage.config.ts` with a `defaultThreshold` to turn the\n * report into an enforced gate, and `exempt` entries to record which\n * higher-tier test covers a unit-thin file.\n *\n * Usage:\n * polly coverage # report (zero-config) or enforce (with config)\n * polly coverage --strict-orphans # fail on source no unit test imports\n * polly coverage --orphans # list the orphan files\n * polly coverage --no-mutate # skip the Stryker target check\n * polly coverage --config <path> # explicit coverage.config.ts\n * bun test --coverage | polly coverage --stdin\n */\n\nimport { loadCoverageConfig } from \"./discover\";\nimport { type CoverageFindings, enforceCoverage, hasFailure, parseCoverageTable } from \"./enforce\";\nimport { type MutateTargetReport, validateMutateTargets } from \"./mutate-targets\";\n\ninterface Args {\n root: string;\n configPath?: string;\n strictOrphans: boolean;\n listOrphans: boolean;\n stdin: boolean;\n mutate: boolean;\n help: boolean;\n}\n\nfunction parseArgs(argv: string[]): Args {\n const flag = (name: string) => argv.includes(name);\n const argValue = (name: string): string | undefined => {\n const i = argv.indexOf(name);\n return i >= 0 ? argv[i + 1] : undefined;\n };\n const strictOrphans = flag(\"--strict-orphans\");\n return {\n root: process.cwd(),\n configPath: argValue(\"--config\"),\n strictOrphans,\n listOrphans: strictOrphans || flag(\"--orphans\"),\n stdin: flag(\"--stdin\"),\n mutate: !flag(\"--no-mutate\"),\n help: flag(\"--help\") || flag(\"-h\"),\n };\n}\n\nasync function readStdin(): Promise<string> {\n const chunks: string[] = [];\n for await (const chunk of Bun.stdin.stream()) chunks.push(new TextDecoder().decode(chunk));\n return chunks.join(\"\");\n}\n\nfunction reportPolicy(f: CoverageFindings): void {\n for (const m of f.missingExemptFiles) {\n process.stderr.write(`❌ exempt source missing: ${m}\\n`);\n }\n for (const { file, claimedBy } of f.missingClaimedBy) {\n process.stderr.write(`❌ ${file} → claimedBy missing: ${claimedBy}\\n`);\n }\n for (const s of f.staleExempts) {\n process.stderr.write(`❌ exempt file now meets the floor — promote it: ${s}\\n`);\n }\n for (const v of f.violations) {\n process.stderr.write(\n `❌ ${v.file} ${v.metric}=${v.observed.toFixed(2)}% (need ≥ ${v.required}%)\\n`\n );\n }\n}\n\nfunction reportOrphans(f: CoverageFindings, args: Args): void {\n if (f.orphans.length === 0) return;\n process.stderr.write(\n `${args.strictOrphans ? \"❌\" : \"⚠️ \"} ${f.orphans.length} src file(s) no unit test imports\\n`\n );\n if (args.listOrphans) for (const o of f.orphans) process.stderr.write(` ${o}\\n`);\n else process.stderr.write(\" --orphans to list, --strict-orphans to fail\\n\");\n}\n\nfunction reportMutate(report: MutateTargetReport): void {\n if (report.issues.length === 0) return;\n process.stderr.write(`❌ ${report.issues.length} Stryker target(s) resolve to no files:\\n`);\n for (const i of report.issues) {\n process.stderr.write(` ${i.config} [${i.field}] ${i.pattern}\\n`);\n }\n}\n\nfunction showHelp(): void {\n process.stdout.write(\n \"polly coverage — coverage policy, orphan detection, Stryker target validation\\n\\n\" +\n \" --strict-orphans fail on source no unit test imports\\n\" +\n \" --orphans list orphan files\\n\" +\n \" --no-mutate skip the Stryker mutate/testFiles check\\n\" +\n \" --config <path> explicit coverage.config.ts\\n\" +\n \" --stdin read a `bun test --coverage` table from stdin\\n\"\n );\n}\n\nasync function main(): Promise<void> {\n const args = parseArgs(process.argv.slice(2));\n if (args.help) {\n showHelp();\n return;\n }\n\n const { config, source } = await loadCoverageConfig(args.root, args.configPath);\n const srcDir = config.srcDir ?? \"src\";\n\n const findings = args.stdin\n ? await import(\"./enforce\").then(async (m) => {\n const rows = parseCoverageTable(await readStdin(), srcDir);\n return m.evaluateCoverage(args.root, rows, config);\n })\n : await enforceCoverage(args.root, config);\n\n reportPolicy(findings);\n reportOrphans(findings, args);\n\n let mutate: MutateTargetReport = { configs: [], issues: [] };\n if (args.mutate) {\n mutate = await validateMutateTargets(args.root);\n reportMutate(mutate);\n }\n\n const failed = hasFailure(findings, args.strictOrphans) || mutate.issues.length > 0;\n if (!failed) {\n const mode = findings.enforced ? `floor enforced` : \"report-only (no defaultThreshold)\";\n const where = source ? \"\" : \" — zero-config\";\n const orphanNote = findings.orphans.length ? `, ${findings.orphans.length} orphan` : \"\";\n const mutateNote = mutate.configs.length\n ? `, ${mutate.configs.length} stryker config(s) ok`\n : \"\";\n process.stdout.write(\n `✅ coverage ok — ${findings.rowCount} src files, ${mode}${where}${orphanNote}${mutateNote}\\n`\n );\n }\n process.exit(failed ? 1 : 0);\n}\n\nawait main();\n",
7
+ "#!/usr/bin/env bun\n\n/**\n * @fairfox/polly/test/coverage — consumer-facing `polly coverage`.\n *\n * Zero-config: run it in any Polly project and it reports per-file coverage,\n * orphan source files, and (if a Stryker config is present) dead mutate/test\n * globs. Add a `coverage.config.ts` with a `defaultThreshold` to turn the\n * report into an enforced gate, and `exempt` entries to record which\n * higher-tier test covers a unit-thin file.\n *\n * Usage:\n * polly coverage # report (zero-config) or enforce (with config)\n * polly coverage --strict-orphans # fail on source no unit test imports\n * polly coverage --orphans # list the orphan files\n * polly coverage --no-mutate # skip the Stryker target check\n * polly coverage --config <path> # explicit coverage.config.ts\n * bun test --coverage | polly coverage --stdin\n */\n\nimport { loadCoverageConfig } from \"./discover\";\nimport { type CoverageFindings, enforceCoverage, hasFailure, parseCoverageTable } from \"./enforce\";\nimport { type MutateTargetReport, validateMutateTargets } from \"./mutate-targets\";\n\ninterface Args {\n root: string;\n configPath?: string;\n strictOrphans: boolean;\n listOrphans: boolean;\n stdin: boolean;\n mutate: boolean;\n help: boolean;\n}\n\nfunction parseArgs(argv: string[]): Args {\n const flag = (name: string) => argv.includes(name);\n const argValue = (name: string): string | undefined => {\n const i = argv.indexOf(name);\n return i >= 0 ? argv[i + 1] : undefined;\n };\n const strictOrphans = flag(\"--strict-orphans\");\n return {\n root: process.cwd(),\n configPath: argValue(\"--config\"),\n strictOrphans,\n listOrphans: strictOrphans || flag(\"--orphans\"),\n stdin: flag(\"--stdin\"),\n mutate: !flag(\"--no-mutate\"),\n help: flag(\"--help\") || flag(\"-h\"),\n };\n}\n\nasync function readStdin(): Promise<string> {\n const chunks: string[] = [];\n for await (const chunk of Bun.stdin.stream()) chunks.push(new TextDecoder().decode(chunk));\n return chunks.join(\"\");\n}\n\nfunction reportPolicy(f: CoverageFindings): void {\n for (const m of f.missingExemptFiles) {\n process.stderr.write(`❌ exempt source missing: ${m}\\n`);\n }\n for (const { file, claimedBy } of f.missingClaimedBy) {\n process.stderr.write(`❌ ${file} → claimedBy missing: ${claimedBy}\\n`);\n }\n for (const s of f.staleExempts) {\n process.stderr.write(`❌ exempt file now meets the floor — promote it: ${s}\\n`);\n }\n for (const v of f.violations) {\n process.stderr.write(\n `❌ ${v.file} ${v.metric}=${v.observed.toFixed(2)}% (need ≥ ${v.required}%)\\n`\n );\n }\n}\n\nfunction reportOrphans(f: CoverageFindings, args: Args): void {\n if (f.orphans.length === 0) return;\n process.stderr.write(\n `${args.strictOrphans ? \"❌\" : \"⚠️ \"} ${f.orphans.length} src file(s) no unit test imports\\n`\n );\n if (args.listOrphans) for (const o of f.orphans) process.stderr.write(` ${o}\\n`);\n else process.stderr.write(\" --orphans to list, --strict-orphans to fail\\n\");\n}\n\nfunction reportMutate(report: MutateTargetReport): void {\n if (report.issues.length === 0) return;\n process.stderr.write(`❌ ${report.issues.length} Stryker target(s) resolve to no files:\\n`);\n for (const i of report.issues) {\n process.stderr.write(` ${i.config} [${i.field}] ${i.pattern}\\n`);\n }\n}\n\nfunction showHelp(): void {\n process.stdout.write(\n \"polly coverage — coverage policy, orphan detection, Stryker target validation\\n\\n\" +\n \" Coverage that a line ran isn't proof anything checks it. This enforces a\\n\" +\n \" per-file floor with explicit, owned exemptions so test debt stays visible,\\n\" +\n \" and flags orphans (source no test imports) and drifted Stryker targets.\\n\\n\" +\n \" --strict-orphans fail on source no unit test imports\\n\" +\n \" --orphans list orphan files\\n\" +\n \" --no-mutate skip the Stryker mutate/testFiles check\\n\" +\n \" --config <path> explicit coverage.config.ts\\n\" +\n \" --stdin read a `bun test --coverage` table from stdin\\n\"\n );\n}\n\nasync function main(): Promise<void> {\n const args = parseArgs(process.argv.slice(2));\n if (args.help) {\n showHelp();\n return;\n }\n\n const { config, source } = await loadCoverageConfig(args.root, args.configPath);\n const srcDir = config.srcDir ?? \"src\";\n\n const findings = args.stdin\n ? await import(\"./enforce\").then(async (m) => {\n const rows = parseCoverageTable(await readStdin(), srcDir);\n return m.evaluateCoverage(args.root, rows, config);\n })\n : await enforceCoverage(args.root, config);\n\n reportPolicy(findings);\n reportOrphans(findings, args);\n\n let mutate: MutateTargetReport = { configs: [], issues: [] };\n if (args.mutate) {\n mutate = await validateMutateTargets(args.root);\n reportMutate(mutate);\n }\n\n const failed = hasFailure(findings, args.strictOrphans) || mutate.issues.length > 0;\n if (!failed) {\n const mode = findings.enforced ? `floor enforced` : \"report-only (no defaultThreshold)\";\n const where = source ? \"\" : \" — zero-config\";\n const orphanNote = findings.orphans.length ? `, ${findings.orphans.length} orphan` : \"\";\n const mutateNote = mutate.configs.length\n ? `, ${mutate.configs.length} stryker config(s) ok`\n : \"\";\n process.stdout.write(\n `✅ coverage ok — ${findings.rowCount} src files, ${mode}${where}${orphanNote}${mutateNote}\\n`\n );\n }\n process.exit(failed ? 1 : 0);\n}\n\nawait main();\n",
8
8
  "/**\n * @fairfox/polly/test/coverage — Stryker mutate-/test-target validation.\n *\n * A Stryker config's `mutate` and `testFiles` lists are hand-curated. A path\n * that is renamed, or a glob whose directory moves, silently resolves to\n * nothing — Stryker mutates fewer files (or none) and the only signal is a\n * long mutation run whose score quietly drops. This asserts, in milliseconds,\n * that every entry still resolves to at least one file.\n *\n * Discovers configs two ways, covering both layouts in the wild: a single\n * `stryker.conf.json` at the root, and a `stryker/` directory of per-package\n * shards.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { Glob } from \"bun\";\n\ninterface StrykerConfig {\n mutate?: string[];\n testFiles?: string[];\n bun?: { testFiles?: string[] };\n}\n\nexport interface MutateTargetIssue {\n config: string;\n field: \"mutate\" | \"testFiles\";\n pattern: string;\n}\n\nexport interface MutateTargetReport {\n configs: string[];\n issues: MutateTargetIssue[];\n}\n\n/** Locate every Stryker config under the project root. */\nexport async function findStrykerConfigs(root: string): Promise<string[]> {\n const found: string[] = [];\n const single = join(root, \"stryker.conf.json\");\n if (existsSync(single)) found.push(single);\n\n const glob = new Glob(\"stryker/*.{json,conf.json}\");\n for await (const rel of glob.scan({ cwd: root, onlyFiles: true })) {\n found.push(join(root, rel));\n }\n return found.sort();\n}\n\nfunction isGlob(pattern: string): boolean {\n return pattern.includes(\"*\") || pattern.includes(\"?\") || pattern.includes(\"[\");\n}\n\nasync function resolvesToFile(pattern: string, cwd: string): Promise<boolean> {\n if (pattern.startsWith(\"!\")) return true; // negations are filters, not targets\n if (!isGlob(pattern)) return existsSync(resolve(cwd, pattern));\n const glob = new Glob(pattern);\n for await (const _ of glob.scan({ cwd, onlyFiles: true })) return true;\n return false;\n}\n\nasync function checkField(\n configPath: string,\n field: \"mutate\" | \"testFiles\",\n patterns: string[] | undefined,\n cwd: string\n): Promise<MutateTargetIssue[]> {\n const issues: MutateTargetIssue[] = [];\n for (const pattern of patterns ?? []) {\n if (!(await resolvesToFile(pattern, cwd))) {\n issues.push({ config: configPath, field, pattern });\n }\n }\n return issues;\n}\n\n/**\n * Validate every Stryker config under `root`. Paths in a Stryker config are\n * relative to that config's directory; for the monorepo-root configs that is\n * the root, so we resolve globs against `root`.\n */\nexport async function validateMutateTargets(root: string): Promise<MutateTargetReport> {\n const configs = await findStrykerConfigs(root);\n const issues: MutateTargetIssue[] = [];\n for (const configPath of configs) {\n const config = JSON.parse(readFileSync(configPath, \"utf8\")) as unknown as StrykerConfig;\n const testFiles = config.testFiles ?? config.bun?.testFiles;\n issues.push(...(await checkField(configPath, \"mutate\", config.mutate, root)));\n issues.push(...(await checkField(configPath, \"testFiles\", testFiles, root)));\n }\n return { configs, issues };\n}\n"
9
9
  ],
10
- "mappings": "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",
11
- "debugId": "7B6414401C7DC44464756E2164756E21",
10
+ "mappings": "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",
11
+ "debugId": "7C14BCD836C3C95164756E2164756E21",
12
12
  "names": []
13
13
  }
@@ -5,6 +5,7 @@
5
5
  * tools/test/src/tiers/cli.ts) accept the same flags; only their tier *sets*
6
6
  * differ. This keeps the surface identical.
7
7
  */
8
+ import type { CaseOrder } from "./types";
8
9
  export interface TierArgs {
9
10
  /** Explicit tier names (positional or via --tier=a,b). */
10
11
  tiers: string[];
@@ -14,6 +15,10 @@ export interface TierArgs {
14
15
  full: boolean;
15
16
  list: boolean;
16
17
  bail: boolean;
18
+ /** --fail-fast: soft early-stop on the first failing case. */
19
+ failFast: boolean;
20
+ /** --order=fast|cost|default within-tier ordering, or null to leave unset. */
21
+ order: CaseOrder | null;
17
22
  strictNeeds: boolean;
18
23
  /** Path to write JSON results, or null. */
19
24
  json: string | null;
@@ -28,11 +28,45 @@ var BOOL_FLAGS = {
28
28
  "--full": "full",
29
29
  "--list": "list",
30
30
  "--bail": "bail",
31
+ "--fail-fast": "failFast",
31
32
  "--strict-needs": "strictNeeds"
32
33
  };
34
+ function parseOrder(value) {
35
+ if (value === "default" || value === "fast" || value === "cost")
36
+ return value;
37
+ return null;
38
+ }
33
39
  function listValue(arg, name) {
34
40
  return arg.startsWith(name) ? arg.slice(name.length).split(",") : [];
35
41
  }
42
+ function applyValueFlag(args, arg) {
43
+ if (arg === "--json") {
44
+ args.json = DEFAULT_JSON;
45
+ return true;
46
+ }
47
+ if (arg.startsWith("--json=")) {
48
+ args.json = arg.slice("--json=".length);
49
+ return true;
50
+ }
51
+ if (arg.startsWith("--tier=")) {
52
+ args.tiers.push(...listValue(arg, "--tier="));
53
+ return true;
54
+ }
55
+ if (arg.startsWith("--only=")) {
56
+ args.only.push(...listValue(arg, "--only="));
57
+ return true;
58
+ }
59
+ if (arg.startsWith("--order=")) {
60
+ const order = parseOrder(arg.slice("--order=".length));
61
+ if (order === null) {
62
+ console.log("Unknown --order value (expected default, fast, or cost)");
63
+ process.exit(2);
64
+ }
65
+ args.order = order;
66
+ return true;
67
+ }
68
+ return false;
69
+ }
36
70
  function parseTierArgs(argv) {
37
71
  const args = {
38
72
  tiers: [],
@@ -41,6 +75,8 @@ function parseTierArgs(argv) {
41
75
  full: false,
42
76
  list: false,
43
77
  bail: false,
78
+ failFast: false,
79
+ order: null,
44
80
  strictNeeds: false,
45
81
  json: null
46
82
  };
@@ -50,20 +86,7 @@ function parseTierArgs(argv) {
50
86
  args[boolKey] = true;
51
87
  continue;
52
88
  }
53
- if (arg === "--json") {
54
- args.json = DEFAULT_JSON;
55
- continue;
56
- }
57
- if (arg.startsWith("--json=")) {
58
- args.json = arg.slice("--json=".length);
59
- continue;
60
- }
61
- if (arg.startsWith("--tier=")) {
62
- args.tiers.push(...listValue(arg, "--tier="));
63
- continue;
64
- }
65
- if (arg.startsWith("--only=")) {
66
- args.only.push(...listValue(arg, "--only="));
89
+ if (applyValueFlag(args, arg)) {
67
90
  continue;
68
91
  }
69
92
  if (arg.startsWith("-")) {
@@ -211,6 +234,22 @@ async function firstUnmetNeed(needs) {
211
234
  return null;
212
235
  }
213
236
 
237
+ // tools/test/src/tiers/order.ts
238
+ var COST_WEIGHT = {
239
+ light: 0,
240
+ medium: 1,
241
+ heavy: 2
242
+ };
243
+ function weightOf(spec) {
244
+ return COST_WEIGHT[spec.cost ?? "medium"];
245
+ }
246
+ function orderCases(cases, order) {
247
+ if (order === "default")
248
+ return cases;
249
+ const direction = order === "cost" ? -1 : 1;
250
+ return cases.map((spec, index) => ({ spec, index })).sort((a, b) => (weightOf(a.spec) - weightOf(b.spec)) * direction || a.index - b.index).map((entry) => entry.spec);
251
+ }
252
+
214
253
  // tools/test/src/tiers/protocol.ts
215
254
  var SENTINEL = "__TIER_RESULT__";
216
255
 
@@ -349,40 +388,52 @@ async function runOneCase(spec, tier, options, worker) {
349
388
  }
350
389
  async function runTier(tier, options, worker) {
351
390
  const log = options.log ?? ((m) => console.log(m));
352
- const selected = tier.cases.filter((c) => caseMatches(c, options.only));
353
- if (selected.length === 0)
391
+ const matched = tier.cases.filter((c) => caseMatches(c, options.only));
392
+ if (matched.length === 0)
354
393
  return [];
394
+ const selected = orderCases(matched, options.order ?? "default");
355
395
  log(`
356
396
  ▶ ${tier.name}${tier.description ? ` — ${tier.description}` : ""} (${selected.length} case${selected.length === 1 ? "" : "s"})`);
357
397
  const concurrency = Math.max(1, tier.concurrency ?? 1);
398
+ const failFast = options.failFast ?? false;
358
399
  const reports = new Array(selected.length);
359
400
  let next = 0;
401
+ let aborted = false;
360
402
  async function worker_loop() {
361
- while (true) {
403
+ while (!aborted) {
362
404
  const i = next++;
363
405
  const spec = selected[i];
364
406
  if (!spec)
365
407
  return;
366
- reports[i] = await runOneCase(spec, tier, options, worker);
408
+ const report = await runOneCase(spec, tier, options, worker);
409
+ reports[i] = report;
410
+ if (failFast && (report.outcome === "fail" || report.outcome === "timeout")) {
411
+ aborted = true;
412
+ }
367
413
  }
368
414
  }
369
415
  await Promise.all(Array.from({ length: Math.min(concurrency, selected.length) }, worker_loop));
370
- return reports;
416
+ const done = reports.filter((r) => r !== undefined);
417
+ if (aborted && done.length < selected.length) {
418
+ log(` ⏹ fail-fast: stopped after a failure — ${selected.length - done.length} case(s) not run`);
419
+ }
420
+ return done;
371
421
  }
372
422
  async function runPlan(plan, options = {}) {
373
423
  const log = options.log ?? ((m) => console.log(m));
374
424
  const worker = await workerPath();
375
425
  const wanted = options.tiers && options.tiers.length > 0 ? new Set(options.tiers) : null;
376
426
  const started = performance.now();
427
+ const stopOnFail = Boolean(options.bail || options.failFast);
377
428
  const all = [];
378
429
  for (const tier of plan.tiers) {
379
430
  if (wanted && !wanted.has(tier.name))
380
431
  continue;
381
432
  const reports = await runTier(tier, options, worker);
382
433
  all.push(...reports);
383
- if (options.bail && reports.some((r) => r.outcome === "fail" || r.outcome === "timeout")) {
434
+ if (stopOnFail && reports.some((r) => r.outcome === "fail" || r.outcome === "timeout")) {
384
435
  log(`
385
- bailing after failing tier "${tier.name}"`);
436
+ ${options.failFast ? "fail-fast" : "bail"}: stopping after failing tier "${tier.name}"`);
386
437
  break;
387
438
  }
388
439
  }
@@ -427,7 +478,8 @@ function formatPlan(plan) {
427
478
  lines.push(`${tier.name}${conc}${tier.description ? ` — ${tier.description}` : ""}`);
428
479
  for (const c of tier.cases) {
429
480
  const needs = c.needs && c.needs.length > 0 ? ` (needs ${c.needs.join(", ")})` : "";
430
- lines.push(` ${c.id}${needs}`);
481
+ const cost = c.cost ? ` [${c.cost}]` : "";
482
+ lines.push(` ${c.id}${cost}${needs}`);
431
483
  }
432
484
  lines.push("");
433
485
  }
@@ -471,7 +523,9 @@ async function main() {
471
523
  const report = await runPlan(plan, {
472
524
  tiers,
473
525
  only: args.only,
526
+ order: args.order ?? (args.failFast ? "fast" : "default"),
474
527
  bail: args.bail,
528
+ failFast: args.failFast,
475
529
  strictNeeds: args.strictNeeds,
476
530
  cwd: root,
477
531
  log: (m) => console.log(m)
@@ -487,4 +541,4 @@ wrote ${args.json}`);
487
541
  }
488
542
  await main();
489
543
 
490
- //# debugId=170074AB01C8CBEF64756E2164756E21
544
+ //# debugId=CD4A2E88C15B8A6864756E2164756E21