@fairfox/polly 0.40.0 → 0.47.0

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../tools/quality/src/check-shared-components.ts", "../tools/quality/src/css/shared.ts", "../tools/quality/src/logger.ts", "../tools/quality/src/css/check-layout.ts", "../tools/quality/src/css/check-quality.ts", "../tools/quality/src/css/check-unused.ts", "../tools/quality/src/css/check-vars.ts", "../tools/quality/src/no-as-casting.ts", "../tools/quality/src/no-require.ts", "../tools/quality/src/secrets.ts", "../tools/quality/src/cli.ts"],
3
+ "sources": ["../tools/quality/src/check-shared-components.ts", "../tools/quality/src/css/shared.ts", "../tools/quality/src/logger.ts", "../tools/quality/src/css/check-layout.ts", "../tools/quality/src/css/check-quality.ts", "../tools/quality/src/css/check-unused.ts", "../tools/quality/src/css/check-vars.ts", "../tools/quality/src/no-as-casting.ts", "../tools/quality/src/no-require.ts", "../tools/quality/src/secrets.ts", "../tools/quality/src/attest.ts", "../tools/quality/src/cache.ts", "../tools/quality/src/host.ts", "../tools/quality/src/config.ts", "../tools/quality/src/plugins/core.ts", "../tools/quality/src/plugins/core-checks.ts", "../tools/quality/src/plugins/extra-checks.ts", "../tools/quality/src/plugins/import-checks.ts", "../tools/quality/src/plugins/polly-ui.ts", "../tools/quality/src/cli.ts"],
4
4
  "sourcesContent": [
5
5
  "/**\n * Ban raw native interactive HTML elements in app source.\n *\n * Applications that consume `@fairfox/polly/ui` are expected to use\n * the shared primitives (`<Button>`, `<ActionInput>`, `<Layout>`,\n * `<Modal>`, `<ActionForm>`, `<Select>`) rather than writing raw\n * `<button>`, `<input>`, `<select>`, `<textarea>`, `<form>`, or\n * `<dialog>` elements. The primitives enforce data-action delegation,\n * typed CSS-module classNames, accessibility attributes, and the\n * layouting ban.\n *\n * This module exposes a programmatic check — `checkSharedComponents`\n * — that walks a directory, scans every .tsx / .jsx file, and\n * returns every violation it finds. Consumers typically wire it into\n * a `bun check` script and set `exemptPackages` / `allowPaths` for\n * legacy code that can't migrate yet.\n *\n * @example\n * ```ts\n * import { checkSharedComponents } from \"@fairfox/polly/quality\";\n *\n * const result = await checkSharedComponents({\n * root: process.cwd(),\n * scanRoot: \"packages\",\n * exemptPackages: new Set([\"struggle\", \"todo\"]),\n * });\n * if (result.violations.length > 0) {\n * result.print(console.error);\n * process.exit(1);\n * }\n * ```\n */\n\nimport type { Dirent } from \"node:fs\";\nimport { readdir } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\n\n/** One raw-element rule. Each rule flags a native element and\n * suggests the polly primitive that replaces it. */\nexport interface SharedComponentRule {\n /** Regular expression that matches the opening tag, e.g. /<button[\\s>]/. */\n pattern: RegExp;\n /** Human-readable element marker, e.g. \"<button>\". */\n element: string;\n /** Suggested replacement, e.g. \"<Button>\". */\n replacement: string;\n /** Optional predicate; when it returns true the match is skipped.\n * Used for legitimate raw usages (e.g. `<input type=\"hidden\">`)\n * that have no primitive analogue. */\n skip?: (line: string) => boolean;\n}\n\n/** Default rule set. Covers every native element that has a\n * direct `@fairfox/polly/ui` replacement. Consumers may extend\n * through the `additionalRules` option. */\nexport const DEFAULT_SHARED_COMPONENT_RULES: SharedComponentRule[] = [\n { pattern: /<button[\\s>]/, element: \"<button>\", replacement: \"<Button>\" },\n {\n pattern: /<input[\\s>/]/,\n element: \"<input>\",\n replacement: \"<ActionInput> or <TextInput>\",\n // `<input type=\"hidden\">` has no primitive analogue and is a\n // legitimate way to carry form data.\n skip: (line) => /type=[\"']hidden[\"']/.test(line),\n },\n {\n pattern: /<textarea[\\s>]/,\n element: \"<textarea>\",\n replacement: '<ActionInput variant=\"multi\">',\n },\n { pattern: /<select[\\s>]/, element: \"<select>\", replacement: \"<Select>\" },\n { pattern: /<form[\\s>]/, element: \"<form>\", replacement: \"<ActionForm>\" },\n { pattern: /<dialog[\\s>]/, element: \"<dialog>\", replacement: \"<Modal>\" },\n];\n\n/** One violation: a raw element found in an app source file. */\nexport interface SharedComponentViolation {\n /** Path relative to `root`. */\n file: string;\n /** 1-based line number. */\n line: number;\n /** Element marker, e.g. \"<button>\". */\n element: string;\n /** Suggested replacement. */\n replacement: string;\n /** Trimmed offending line for context. */\n content: string;\n}\n\nexport interface CheckSharedComponentsOptions {\n /** Repository root. Violation file paths are reported relative to\n * this directory. */\n root: string;\n /** Directory under `root` to scan. Defaults to \"packages\". */\n scanRoot?: string;\n /** Directory names to skip entirely during traversal. Defaults to\n * node_modules / .git / dist / build / tests. */\n skipDirs?: Set<string>;\n /** Workspace package names (the directory names immediately under\n * `scanRoot`) to exempt. Useful for legacy packages that can't\n * migrate to the primitives yet. */\n exemptPackages?: Set<string>;\n /** Additional rules appended to {@link DEFAULT_SHARED_COMPONENT_RULES}. */\n additionalRules?: SharedComponentRule[];\n /** Override the default rule set entirely. If set,\n * `additionalRules` is ignored. */\n rules?: SharedComponentRule[];\n}\n\nconst DEFAULT_SKIP_DIRS = new Set([\"node_modules\", \".git\", \"dist\", \"build\", \"tests\"]);\n\nexport interface SharedComponentsCheckResult {\n violations: SharedComponentViolation[];\n print(log: (msg: string) => void): void;\n}\n\n/** Walk the configured directory, returning every violation found. */\nexport async function checkSharedComponents(\n options: CheckSharedComponentsOptions\n): Promise<SharedComponentsCheckResult> {\n const rules = options.rules ?? [\n ...DEFAULT_SHARED_COMPONENT_RULES,\n ...(options.additionalRules ?? []),\n ];\n const skipDirs = options.skipDirs ?? DEFAULT_SKIP_DIRS;\n const scanRoot = options.scanRoot ?? \"packages\";\n const exemptPackages = options.exemptPackages ?? new Set<string>();\n const packagesPath = join(options.root, scanRoot);\n const violations: SharedComponentViolation[] = [];\n\n await scanDirectory(packagesPath, {\n root: options.root,\n packagesPath,\n skipDirs,\n exemptPackages,\n rules,\n violations,\n });\n\n return {\n violations,\n print(log) {\n if (violations.length === 0) {\n log(\"[shared-components] ok\");\n return;\n }\n log(`[shared-components] ${violations.length} violation(s) found:\\n`);\n for (const v of violations) {\n log(` ${v.file}:${v.line} — ${v.element} → use ${v.replacement}`);\n log(` ${v.content}\\n`);\n }\n log(\"[shared-components] Use @fairfox/polly/ui primitives instead of native HTML elements.\");\n },\n };\n}\n\ninterface ScanState {\n root: string;\n packagesPath: string;\n skipDirs: Set<string>;\n exemptPackages: Set<string>;\n rules: SharedComponentRule[];\n violations: SharedComponentViolation[];\n}\n\nasync function scanDirectory(dir: string, state: ScanState): Promise<void> {\n let entries: Dirent[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n if (state.skipDirs.has(entry.name)) {\n continue;\n }\n if (dir === state.packagesPath && state.exemptPackages.has(entry.name)) {\n continue;\n }\n await scanDirectory(fullPath, state);\n } else if (entry.isFile() && (entry.name.endsWith(\".tsx\") || entry.name.endsWith(\".jsx\"))) {\n await scanFile(fullPath, state);\n }\n }\n}\n\nasync function scanFile(filePath: string, state: ScanState): Promise<void> {\n const text = await Bun.file(filePath).text();\n const lines = text.split(\"\\n\");\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (!line) continue;\n const trimmed = line.trim();\n if (isCommentLine(trimmed)) continue;\n for (const rule of state.rules) {\n if (!matchesRule(line, rule)) continue;\n state.violations.push({\n file: relative(state.root, filePath),\n line: i + 1,\n element: rule.element,\n replacement: rule.replacement,\n content: trimmed,\n });\n }\n }\n}\n\nfunction isCommentLine(trimmed: string): boolean {\n return trimmed.startsWith(\"//\") || trimmed.startsWith(\"*\") || trimmed.startsWith(\"/*\");\n}\n\nfunction matchesRule(line: string, rule: SharedComponentRule): boolean {\n if (!rule.pattern.test(line)) return false;\n const commentIndex = line.indexOf(\"//\");\n const elementIndex = line.search(rule.pattern);\n if (commentIndex !== -1 && commentIndex < elementIndex) return false;\n if (rule.skip?.(line)) return false;\n return true;\n}\n",
6
6
  "/**\n * Shared plumbing for CSS conformance checks.\n *\n * File discovery, violation printing, and common scanner options live\n * here so each check (`quality`, `layout`, `vars`, `unused`) can stay\n * focused on its own rule set.\n */\n\nimport type { Dirent } from \"node:fs\";\nimport { readdir } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport { logger } from \"../logger.ts\";\n\nexport type CssViolation = {\n file: string;\n line: number;\n rule: string;\n content: string;\n suggestion: string;\n};\n\nexport type CssCheckResult = {\n violations: CssViolation[];\n print: () => void;\n};\n\nexport type CssScanOptions = {\n rootDir: string;\n /** Directory names (not paths) to skip during recursion. */\n skipDirs?: string[];\n /** File names (not paths) to skip entirely. */\n skipFiles?: string[];\n};\n\nexport const DEFAULT_SKIP_DIRS = [\"node_modules\", \".git\", \"dist\", \"dist-test\", \"build\", \"coverage\"];\n\nexport async function walkDirectory(\n dir: string,\n visit: (filePath: string, relPath: string) => Promise<void>,\n opts: CssScanOptions\n): Promise<void> {\n const skipDirs = new Set(opts.skipDirs ?? DEFAULT_SKIP_DIRS);\n const skipFiles = new Set(opts.skipFiles ?? []);\n const rootDir = opts.rootDir;\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: recursive walk with skip sets is inherently branchy.\n async function walk(current: string): Promise<void> {\n let entries: Dirent[];\n try {\n entries = await readdir(current, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n const full = join(current, entry.name);\n if (entry.isDirectory()) {\n if (skipDirs.has(entry.name)) continue;\n await walk(full);\n } else if (entry.isFile()) {\n if (skipFiles.has(entry.name)) continue;\n const rel = relative(rootDir, full);\n await visit(full, rel);\n }\n }\n }\n\n await walk(dir);\n}\n\nexport function formatViolations(\n kind: string,\n violations: CssViolation[],\n rootDir: string\n): string[] {\n const lines: string[] = [];\n if (violations.length === 0) {\n lines.push(`✅ ${kind}: no violations`);\n return lines;\n }\n lines.push(`❌ ${kind}: ${violations.length} violation(s)`);\n const byFile = new Map<string, CssViolation[]>();\n for (const v of violations) {\n const bucket = byFile.get(v.file) ?? [];\n bucket.push(v);\n byFile.set(v.file, bucket);\n }\n for (const [file, fileViolations] of byFile) {\n lines.push(` ${relative(rootDir, file)}`);\n for (const v of fileViolations) {\n lines.push(` L${v.line}: ${v.content}`);\n lines.push(` → ${v.suggestion} [${v.rule}]`);\n }\n }\n return lines;\n}\n\nexport function makeResult(\n kind: string,\n rootDir: string,\n violations: CssViolation[]\n): CssCheckResult {\n return {\n violations,\n print() {\n for (const line of formatViolations(kind, violations, rootDir)) {\n if (line.startsWith(\"❌\")) {\n logger.error(line);\n } else {\n logger.log(line);\n }\n }\n },\n };\n}\n\n/** True when the line is a CSS comment (standalone or continuation). */\nexport function isInsideComment(line: string): boolean {\n const trimmed = line.trim();\n return trimmed.startsWith(\"/*\") || trimmed.startsWith(\"*\") || trimmed.startsWith(\"//\");\n}\n\n/** Heuristic: true when the given line number falls inside an @keyframes block. */\nexport function isInsideKeyframes(lineNum: number, allLines: readonly string[]): boolean {\n for (let i = lineNum - 1; i >= 0; i -= 1) {\n const l = allLines[i]?.trim() ?? \"\";\n if (l.startsWith(\"@keyframes\")) return true;\n if (l === \"}\" && i < lineNum - 1) return false;\n }\n return false;\n}\n",
@@ -12,9 +12,18 @@
12
12
  "/**\n * No-as-casting conformance check.\n *\n * Bans all TypeScript type assertions (`as Type`) except the allowed\n * patterns: `as const` (literal narrowing), `as unknown as` (explicit\n * escape hatch), import/export renames, and `as` inside strings or\n * comments. Violations include pattern-specific fix advice.\n *\n * This module exports the check logic as a library so consuming\n * applications can import it from `@fairfox/polly/quality` and run it\n * programmatically. Polly's own `scripts/check-no-as-casting.ts` is a\n * thin CLI wrapper around these exports.\n */\n\nimport { readFileSync } from \"node:fs\";\nimport { Glob } from \"bun\";\nimport { logger } from \"./logger\";\n\nexport interface Violation {\n file: string;\n line: number;\n content: string;\n advice?: string;\n}\n\nexport interface CheckResult {\n violations: Violation[];\n print: () => void;\n}\n\nexport interface CheckOptions {\n rootDir: string;\n exclude?: string[];\n excludePackages?: string[];\n excludeFiles?: string[];\n filePatterns?: string;\n}\n\n/**\n * Check whether a line contains a forbidden `as` type assertion.\n * Returns true if the line is clean (no violation), false if it violates.\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Source-text scanning with many skip rules is inherently branchy.\nexport function isLineClean(line: string): boolean {\n if (!line.includes(\" as \")) return true;\n\n const trimmed = line.trim();\n\n // Full-line comments\n if (trimmed.startsWith(\"//\") || trimmed.startsWith(\"*\") || trimmed.startsWith(\"/*\")) {\n return true;\n }\n\n // as const (literal narrowing)\n if (line.match(/\\bas const\\b/)) {\n const withoutAsConst = line.replace(/\\bas const\\b/g, \"\");\n if (!withoutAsConst.includes(\" as \")) return true;\n }\n\n // as unknown as (explicit escape hatch)\n if (line.includes(\" as unknown as \") || line.trimEnd().endsWith(\"as unknown as\")) {\n const withoutEscapeHatch = line.replace(/\\bas unknown as\\b/g, \"\");\n if (!withoutEscapeHatch.includes(\" as \")) return true;\n }\n\n // Import/export renames\n if (\n line.match(/\\b(import|export)\\s+.*\\s+as\\s+\\w+/) ||\n line.match(/\\b(import|export)\\s+\\*\\s+as\\s+\\w+/) ||\n line.match(/\\b(import|export)\\s+type\\s+.*\\s+as\\s+\\w+/) ||\n line.match(/^\\s*\\w+\\s+as\\s+\\w+,?\\s*$/) ||\n line.match(/^\\s*type\\s+\\w+\\s+as\\s+\\w+,?\\s*$/)\n ) {\n return true;\n }\n\n // Property declarations: as= or as: or as,\n if (line.match(/\\bas\\s*[=:,]/)) return true;\n\n // String literal detection: count quotes before each ` as ` occurrence.\n // If any quote type has an odd count, the ` as ` is inside a string.\n if (everyAsInsideString(line)) return true;\n\n // JSX text: ` as ` between > and < with no code syntax around it\n if (isJsxText(trimmed)) return true;\n\n // Plain text heuristic: indented line with no code syntax characters\n // before ` as ` — catches multiline JSX text and template literal bodies.\n if (isPlainText(trimmed)) return true;\n\n // Inline comment: ` as ` appears only after //\n const commentIdx = line.indexOf(\"//\");\n if (commentIdx >= 0 && line.indexOf(\" as \", commentIdx) >= 0) {\n const beforeComment = line.substring(0, commentIdx);\n if (!beforeComment.includes(\" as \")) return true;\n }\n\n // SQL alias: `) as column_name`\n if (line.match(/\"\\)\\s+as\\s+\\w+\"/)) return true;\n\n if (line.includes(\" satisfies \")) return true;\n\n return false;\n}\n\n/**\n * Returns true when every ` as ` occurrence in the line falls inside a\n * string literal (single-quoted, double-quoted, or backtick).\n */\nfunction everyAsInsideString(line: string): boolean {\n let searchFrom = 0;\n while (true) {\n const idx = line.indexOf(\" as \", searchFrom);\n if (idx < 0) return true; // no more ` as ` to check\n const before = line.substring(0, idx);\n const singleQuotes = (before.match(/'/g) ?? []).length;\n const doubleQuotes = (before.match(/\"/g) ?? []).length;\n const backticks = (before.match(/`/g) ?? []).length;\n if (singleQuotes % 2 === 0 && doubleQuotes % 2 === 0 && backticks % 2 === 0) {\n return false; // this ` as ` is outside any string\n }\n searchFrom = idx + 4;\n }\n}\n\n/**\n * Detects JSX text content — ` as ` appearing between > and < with no\n * code-like syntax around it (no braces, semicolons, equals signs).\n */\nfunction isJsxText(trimmed: string): boolean {\n // Classic JSX text: starts after > or is plain text ending before <\n if (trimmed.match(/^[^{};=()]*\\bas\\b[^{};=()]*$/)) {\n // No code syntax at all — could be JSX text or template literal body.\n // Reject if it looks like a type assertion (word ` as ` TypeName pattern\n // where TypeName starts with uppercase, or is a known TS type).\n if (\n !trimmed.match(/\\bas\\s+[A-Z]\\w*/) &&\n !trimmed.match(/\\bas\\s+(string|number|boolean|any|unknown|never)\\b/)\n ) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Heuristic for plain text in template literals or JSX: the line has no\n * code-like characters before ` as ` — no `=`, `{`, `}`, `:`, `;`, `(`.\n */\nfunction isPlainText(trimmed: string): boolean {\n const idx = trimmed.indexOf(\" as \");\n if (idx < 0) return false;\n const before = trimmed.substring(0, idx);\n // If nothing before ` as ` looks like code, it's probably prose.\n return (\n !before.match(/[={}:;(]/) &&\n !before.match(/\\b(const|let|var|type|interface|function|return|await)\\b/)\n );\n}\n\n/**\n * Suggest a concrete fix for a specific violation pattern.\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Pattern-matching advice is a linear chain of if-returns.\nexport function suggestFix(line: string): string | undefined {\n if (line.includes(\"JSON.parse\")) {\n return \"Use a validation function or type guard to parse and validate the result.\";\n }\n if (\n line.includes(\"as HTMLInputElement\") ||\n line.includes(\"as HTMLTextAreaElement\") ||\n line.includes(\"as HTMLButtonElement\")\n ) {\n return \"Use instanceof: if (el instanceof HTMLInputElement) { el.value ... }\";\n }\n if (line.includes(\"as HTMLElement\") || line.includes(\"as Element\")) {\n return \"Use instanceof: if (el instanceof HTMLElement) { ... }\";\n }\n if (line.includes(\".doc()\") && line.includes(\"as \")) {\n return \"Type the DocHandle generic: repo.find<MyType>(id) returns DocHandle<MyType>.\";\n }\n if (\n line.includes(\"Record<string, unknown>\") &&\n (line.includes(\"window\") || line.includes(\"globalThis\"))\n ) {\n return \"Extract a type guard: function getGlobalProp(name: string): unknown { ... }\";\n }\n if (line.includes(\"Record<string, unknown>\")) {\n return \"Use a type guard function that narrows the unknown value to the target shape.\";\n }\n if (line.includes(\"as PeerId\") || line.includes(\"as DocumentId\")) {\n return \"Use the library's branded-type constructor if available, or centralise the cast in a factory.\";\n }\n if (line.includes(\"as string\") || line.includes(\"as number\") || line.includes(\"as boolean\")) {\n return \"Narrow with typeof: if (typeof x === 'string') { ... }\";\n }\n if (line.includes(\"as any\")) {\n return \"Replace 'any' with 'unknown' and add a type guard or validation at the boundary.\";\n }\n return undefined;\n}\n\nfunction isFileExcluded(\n relative: string,\n excludeDirs: Set<string>,\n excludePackages: Set<string>,\n excludeFiles: Set<string>\n): boolean {\n const segments = relative.split(\"/\");\n if (segments.some((s) => excludeDirs.has(s))) return true;\n if (excludePackages.size > 0 && segments.some((s) => excludePackages.has(s))) return true;\n const basename = segments[segments.length - 1] ?? \"\";\n return excludeFiles.has(basename) || excludeFiles.has(relative);\n}\n\nfunction findViolations(relative: string, content: string): Violation[] {\n const results: Violation[] = [];\n const lines = content.split(\"\\n\");\n let insideTemplate = false;\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? \"\";\n const backticks = (line.match(/`/g) ?? []).length;\n const startedInTemplate = insideTemplate;\n if (backticks % 2 === 1) insideTemplate = !insideTemplate;\n\n // Line is entirely inside a multi-line template literal and has no\n // interpolation — treat as string content (e.g. SQL column aliases).\n if (startedInTemplate && backticks === 0 && !line.includes(\"${\")) continue;\n\n if (!isLineClean(line)) {\n results.push({\n file: relative,\n line: i + 1,\n content: line.trim(),\n advice: suggestFix(line.trim()),\n });\n }\n }\n return results;\n}\n\nfunction printViolations(violations: Violation[]): void {\n if (violations.length === 0) {\n logger.log(\"[no-as-casting] ✅ No violations found.\");\n return;\n }\n logger.log(`[no-as-casting] ❌ ${violations.length} violation(s) found:\\n`);\n for (const v of violations) {\n logger.log(` ${v.file}:${v.line}`);\n logger.log(` ${v.content}`);\n if (v.advice) logger.log(` 💡 ${v.advice}`);\n logger.log(\"\");\n }\n logger.log(\"[no-as-casting] Use type guards, validation, or fix the types at the source.\");\n logger.log('[no-as-casting] Only \"as const\" and \"as unknown as\" are allowed.');\n}\n\n/**\n * Run the no-as-casting check against a directory. Returns a result\n * object with the violations and a print function for CLI output.\n */\nexport async function checkNoAsCasting(options: CheckOptions): Promise<CheckResult> {\n const rootDir = options.rootDir;\n const excludeDirs = new Set(options.exclude ?? [\"node_modules\", \"dist\", \".git\", \".bun\"]);\n const excludePackages = new Set(options.excludePackages ?? []);\n const excludeFiles = new Set(options.excludeFiles ?? []);\n const pattern = options.filePatterns ?? \"**/*.{ts,tsx}\";\n const glob = new Glob(pattern);\n const violations: Violation[] = [];\n\n for await (const file of glob.scan({ cwd: rootDir, absolute: true })) {\n const relative = file.replace(`${rootDir}/`, \"\");\n if (isFileExcluded(relative, excludeDirs, excludePackages, excludeFiles)) continue;\n const content = readFileSync(file, \"utf-8\");\n violations.push(...findViolations(relative, content));\n }\n\n return { violations, print: () => printViolations(violations) };\n}\n",
13
13
  "/**\n * No-require conformance check.\n *\n * Bans `require(...)` calls in TypeScript source. Inline CommonJS\n * escapes defeat bundler static analysis, hide cross-module\n * dependencies, and quietly opt a module out of ESM semantics that\n * the rest of the codebase depends on. The motivating incident was a\n * consumer app that shipped\n *\n * const { renameSync } = require(\"node:fs\") as typeof import(\"node:fs\");\n *\n * wedged mid-function — the `as` cast alone violated no-as-casting,\n * but the underlying sin was the require call. Static ES imports\n * round-trip through every bundler and every IDE; `require` does\n * neither.\n *\n * Allowed: `import` / `export` syntax of any flavour, `import(...)`\n * dynamic imports (they're ESM), `require.resolve(...)` (sometimes\n * load-bearing for runtime path resolution), and occurrences inside\n * strings or comments.\n */\n\nimport { readFileSync } from \"node:fs\";\nimport { Glob } from \"bun\";\nimport { logger } from \"./logger\";\n\nexport interface NoRequireViolation {\n file: string;\n line: number;\n content: string;\n}\n\nexport interface NoRequireCheckResult {\n violations: NoRequireViolation[];\n print: () => void;\n}\n\nexport interface NoRequireCheckOptions {\n rootDir: string;\n exclude?: string[];\n /** Glob of files to scan. Defaults to `**` /`*.{ts,tsx}`. */\n filePatterns?: string;\n}\n\n/**\n * Returns true when the line contains no forbidden `require(` call.\n * Mirrors the shape of `isLineClean` in no-as-casting for\n * consistency; the two rules compose cleanly when both run against\n * the same file.\n */\nexport function isLineRequireClean(line: string): boolean {\n if (!line.includes(\"require\")) {\n return true;\n }\n const trimmed = line.trim();\n if (trimmed.startsWith(\"//\") || trimmed.startsWith(\"*\") || trimmed.startsWith(\"/*\")) {\n return true;\n }\n const match = line.match(/\\brequire\\s*\\(/);\n if (!match || match.index === undefined) {\n return true;\n }\n // Allow `require.resolve(...)` — a legitimate runtime-path helper\n // that preserves static analysis for the referenced module.\n if (line.slice(0, match.index + 8).endsWith(\"require.resolve(\")) {\n return true;\n }\n // String literal detection: odd number of unescaped quotes before\n // the match means we're mid-string.\n const before = line.slice(0, match.index);\n const singles = (before.match(/(?<!\\\\)'/g) ?? []).length;\n const doubles = (before.match(/(?<!\\\\)\"/g) ?? []).length;\n const backticks = (before.match(/(?<!\\\\)`/g) ?? []).length;\n if (singles % 2 === 1 || doubles % 2 === 1 || backticks % 2 === 1) {\n return true;\n }\n // Inline comment: `require(` appears only after `//`.\n const commentIdx = line.indexOf(\"//\");\n if (commentIdx >= 0 && match.index > commentIdx) {\n return true;\n }\n return false;\n}\n\nfunction findRequireViolations(relative: string, content: string): NoRequireViolation[] {\n const results: NoRequireViolation[] = [];\n const lines = content.split(\"\\n\");\n let insideTemplate = false;\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? \"\";\n const backticks = (line.match(/`/g) ?? []).length;\n const startedInTemplate = insideTemplate;\n if (backticks % 2 === 1) {\n insideTemplate = !insideTemplate;\n }\n // Skip lines that are entirely inside a multi-line template\n // literal (e.g. an embedded code example in a doc comment).\n if (startedInTemplate && backticks === 0 && !line.includes(\"${\")) {\n continue;\n }\n if (!isLineRequireClean(line)) {\n results.push({ file: relative, line: i + 1, content: line.trim() });\n }\n }\n return results;\n}\n\nfunction printRequireViolations(violations: NoRequireViolation[]): void {\n if (violations.length === 0) {\n logger.log(\"[no-require] ✅ No violations found.\");\n return;\n }\n logger.log(`[no-require] ❌ ${violations.length} violation(s) found:\\n`);\n for (const v of violations) {\n logger.log(` ${v.file}:${v.line}`);\n logger.log(` ${v.content}`);\n logger.log(\"\");\n }\n logger.log(\"[no-require] Replace with static ES imports or `await import(...)` for lazy ESM.\");\n}\n\nexport async function checkNoRequire(\n options: NoRequireCheckOptions\n): Promise<NoRequireCheckResult> {\n const rootDir = options.rootDir;\n const excludeDirs = new Set(options.exclude ?? [\"node_modules\", \"dist\", \".git\", \".bun\"]);\n const pattern = options.filePatterns ?? \"**/*.{ts,tsx}\";\n const glob = new Glob(pattern);\n const violations: NoRequireViolation[] = [];\n\n for await (const file of glob.scan({ cwd: rootDir, absolute: true })) {\n const relative = file.replace(`${rootDir}/`, \"\");\n const segments = relative.split(\"/\");\n if (segments.some((s) => excludeDirs.has(s))) {\n continue;\n }\n const content = readFileSync(file, \"utf-8\");\n violations.push(...findRequireViolations(relative, content));\n }\n\n return {\n violations,\n print: () => printRequireViolations(violations),\n };\n}\n",
14
14
  "/**\n * Secret-scanning conformance checks.\n *\n * Two paired checks that protect a repository from accidentally\n * committing credentials:\n *\n * - `checkSecrets` spawns `gitleaks detect` against the working\n * tree and returns the exit code + stdout. Consumers are\n * expected to have `gitleaks` on PATH (via `brew install\n * gitleaks` or equivalent); the check reports a clear failure\n * when the binary is missing.\n *\n * - `checkGitignoreCoversAllowlist` parses a `.gitleaks.toml`\n * config, pulls out the path patterns that sit in an allowlist\n * *section* marked as \"gitignored files\" (via comment\n * markers), and verifies each one is actually covered by\n * `.gitignore`. This catches the footgun where a repo\n * allowlists `.env` in gitleaks config but forgets to add it\n * to `.gitignore`, so the allowlist entry silently lets a real\n * secret slip through.\n *\n * Adapted from the devctl `check` command in the Lingua project.\n *\n * @example\n * ```typescript\n * import {\n * checkSecrets,\n * checkGitignoreCoversAllowlist,\n * } from \"@fairfox/polly/quality\";\n *\n * const scan = await checkSecrets({ root: process.cwd() });\n * if (scan.exitCode !== 0) process.exit(scan.exitCode);\n *\n * const cover = await checkGitignoreCoversAllowlist({\n * root: process.cwd(),\n * });\n * if (cover.missing.length > 0) {\n * cover.print();\n * process.exit(1);\n * }\n * ```\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { logger } from \"./logger\";\n\nconst defaultWrite = (msg: string): void => logger.error(msg);\n\nexport interface CheckSecretsOptions {\n /** Repository root to scan. */\n root: string;\n /** Path to a gitleaks TOML config, relative to `root`. Defaults\n * to `.gitleaks.toml`. */\n configPath?: string;\n /** Scan the working tree (`--no-git`) or the git history.\n * Defaults to true (working tree only — faster, and what most\n * pre-commit / CI flows want). */\n noGit?: boolean;\n}\n\nexport interface SecretsCheckResult {\n /** Whether `gitleaks` was found on PATH at all. */\n binaryFound: boolean;\n /** `gitleaks detect` exit code, or null when the binary was\n * missing. 0 = clean, 1 = secrets found, other = gitleaks\n * error. */\n exitCode: number | null;\n /** Streamed gitleaks stdout + stderr. Empty when the scan was\n * skipped. */\n output: string;\n print: (write?: (msg: string) => void) => void;\n}\n\n/**\n * Run gitleaks against the working tree. Returns `binaryFound:\n * false` if the binary isn't on PATH — callers typically treat\n * that as a hard failure with an install hint.\n */\nexport async function checkSecrets(options: CheckSecretsOptions): Promise<SecretsCheckResult> {\n const which = Bun.spawn([\"which\", \"gitleaks\"], {\n stdout: \"ignore\",\n stderr: \"ignore\",\n });\n await which.exited;\n if (which.exitCode !== 0) {\n return {\n binaryFound: false,\n exitCode: null,\n output: \"\",\n print: (write = defaultWrite) => {\n write(\n \"gitleaks is not on PATH. Install with `brew install gitleaks` (macOS) or from https://github.com/gitleaks/gitleaks/releases.\"\n );\n },\n };\n }\n\n const args = [\"gitleaks\", \"detect\", \"--source\", options.root ?? \".\"];\n if (options.noGit !== false) {\n args.push(\"--no-git\");\n }\n if (options.configPath) {\n args.push(\"-c\", options.configPath);\n }\n\n const proc = Bun.spawn(args, {\n cwd: options.root,\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n const [stdout, stderr] = await Promise.all([\n new Response(proc.stdout).text(),\n new Response(proc.stderr).text(),\n ]);\n await proc.exited;\n const output = `${stdout}${stderr}`;\n return {\n binaryFound: true,\n exitCode: proc.exitCode,\n output,\n print: (write = defaultWrite) => {\n if (output) {\n write(output);\n }\n },\n };\n}\n\nexport interface CheckGitignoreOptions {\n /** Repository root. */\n root: string;\n /** Path to the gitleaks TOML config, relative to `root`. Defaults\n * to `.gitleaks.toml`. */\n tomlPath?: string;\n /** Path to the gitignore file, relative to `root`. Defaults to\n * `.gitignore`. */\n gitignorePath?: string;\n /** Strings that, when seen in a comment line of the TOML, mark\n * the start of a \"must be gitignored\" section. Defaults cover\n * \"Gitignored files\" and \"Local dev TLS certs\". */\n sectionStartMarkers?: string[];\n /** Strings that close a must-be-gitignored section. Defaults to\n * \"Test fixtures\" so the common lingua-style layout works\n * unchanged. */\n sectionEndMarkers?: string[];\n}\n\nexport interface GitignoreCheckResult {\n /** TOML-listed allowlisted paths that `.gitignore` does NOT\n * cover. Each string is the derived plain filename (e.g.\n * `.env`, `certs/key.pem`). */\n missing: string[];\n /** All paths the TOML required to be gitignored, whether or not\n * .gitignore covers them. Useful for audits. */\n required: string[];\n print: (write?: (msg: string) => void) => void;\n}\n\n/**\n * Parse a gitleaks TOML config and verify every allowlisted path\n * that the config marks as \"this file should be gitignored\" is in\n * fact present in `.gitignore`. Returns the list of allowlisted\n * paths that are NOT gitignored.\n *\n * The check trusts section markers in the TOML comments to decide\n * which allowlist entries apply. By default:\n *\n * - \"Gitignored files\" and \"Local dev TLS certs\" open a\n * must-be-gitignored section.\n * - \"Test fixtures\" closes it.\n *\n * Entries outside those sections (e.g. test-fixture paths) are\n * ignored by this check.\n */\nfunction parseRequiredPaths(toml: string, starts: string[], ends: string[]): string[] {\n const required: string[] = [];\n let inSection = false;\n for (const line of toml.split(\"\\n\")) {\n if (starts.some((m) => line.includes(m))) {\n inSection = true;\n continue;\n }\n if (ends.some((m) => line.includes(m))) {\n inSection = false;\n continue;\n }\n if (!inSection) {\n continue;\n }\n const match = line.match(/'''(.+?)'''/);\n if (!match?.[1]) {\n continue;\n }\n // Convert gitleaks regex to plain filename (strip backslash\n // escapes and trailing anchors) for a gitignore-style lookup.\n required.push(match[1].replace(/\\\\\\./g, \".\").replace(/\\$$/, \"\"));\n }\n return required;\n}\n\nfunction gitignoreLineCovers(giLine: string, filename: string): boolean {\n if (!giLine || giLine.startsWith(\"#\")) {\n return false;\n }\n if (giLine === filename) {\n return true;\n }\n const dirMatch = giLine.match(/^\\*?\\*?\\/?(.+)\\/$/);\n if (dirMatch?.[1] && filename.startsWith(dirMatch[1])) {\n return true;\n }\n if (giLine.endsWith(\"/\") && filename.startsWith(giLine)) {\n return true;\n }\n return false;\n}\n\nconst emptyGitignoreResult: GitignoreCheckResult = {\n missing: [],\n required: [],\n print: () => {\n // No TOML means nothing to enforce; callers typically treat\n // this as \"skipped\" and print their own hint. Leaving the\n // printer a no-op keeps the API uniform without emitting\n // spurious output.\n },\n};\n\nexport async function checkGitignoreCoversAllowlist(\n options: CheckGitignoreOptions\n): Promise<GitignoreCheckResult> {\n const tomlPath = join(options.root, options.tomlPath ?? \".gitleaks.toml\");\n const gitignorePath = join(options.root, options.gitignorePath ?? \".gitignore\");\n const starts = options.sectionStartMarkers ?? [\"Gitignored files\", \"Local dev TLS certs\"];\n const ends = options.sectionEndMarkers ?? [\"Test fixtures\"];\n\n let toml: string;\n try {\n toml = await readFile(tomlPath, \"utf8\");\n } catch {\n return emptyGitignoreResult;\n }\n let gitignore: string;\n try {\n gitignore = await readFile(gitignorePath, \"utf8\");\n } catch {\n gitignore = \"\";\n }\n\n const required = parseRequiredPaths(toml, starts, ends);\n const gitignoreLines = gitignore.split(\"\\n\").map((l) => l.trim());\n const missing = required.filter(\n (filename) => !gitignoreLines.some((gi) => gitignoreLineCovers(gi, filename))\n );\n\n return {\n missing,\n required,\n print: (write = defaultWrite) => {\n if (missing.length === 0) {\n return;\n }\n write(\"Paths allowed by .gitleaks.toml are NOT covered by .gitignore:\");\n for (const f of missing) {\n write(` ${f}`);\n }\n write(\n \"These files may contain secrets. Add them to .gitignore so the allowlist entry doesn't become a hiding place.\"\n );\n },\n };\n}\n",
15
- "#!/usr/bin/env bun\n\n/**\n * CLI entry point for Polly quality checks.\n *\n * polly quality # run every check\n * polly quality no-as-casting # only the TS casting check\n * polly quality no-require # ban require(...) calls\n * polly quality css # all CSS checks\n * polly quality css-quality # only hardcoded-values check\n * polly quality css-layout # only Layout-usage check\n * polly quality css-vars # only undefined-variable check\n * polly quality css-unused # only unused-selector check (advisory)\n *\n * Shared flags:\n * --root <dir> # defaults to process.cwd()\n * --exclude <a,b,c> # comma-separated dir names\n * --exclude-packages <a,b> # no-as-casting only\n * --exclude-files <a,b> # no-as-casting only\n * --pattern <glob> # no-as-casting / no-require\n */\n\nimport {\n checkCssLayout,\n checkCssQuality,\n checkCssUnused,\n checkCssVars,\n checkNoAsCasting,\n checkNoRequire,\n} from \"./index\";\nimport { logger } from \"./logger\";\n\nconst args = process.argv.slice(2);\n\nfunction getFlag(name: string): string | undefined {\n const idx = args.indexOf(`--${name}`);\n return idx >= 0 ? args[idx + 1] : undefined;\n}\n\nfunction getSubcommand(): string {\n for (const arg of args) {\n if (!arg.startsWith(\"--\")) return arg;\n }\n return \"all\";\n}\n\nconst subcommand = getSubcommand();\nconst rootDir = getFlag(\"root\") ?? process.cwd();\nconst exclude = getFlag(\"exclude\")?.split(\",\") ?? [\n \"node_modules\",\n \"dist\",\n \".git\",\n \".bun\",\n \"dist-test\",\n \"build\",\n \"coverage\",\n];\nconst excludePackages = getFlag(\"exclude-packages\")?.split(\",\");\nconst excludeFiles = getFlag(\"exclude-files\")?.split(\",\");\nconst filePatterns = getFlag(\"pattern\");\n\nasync function runNoAsCasting(): Promise<number> {\n const result = await checkNoAsCasting({\n rootDir,\n exclude,\n ...(excludePackages ? { excludePackages } : {}),\n ...(excludeFiles ? { excludeFiles } : {}),\n ...(filePatterns ? { filePatterns } : {}),\n });\n result.print();\n return result.violations.length > 0 ? 1 : 0;\n}\n\nasync function runNoRequire(): Promise<number> {\n const result = await checkNoRequire({\n rootDir,\n exclude,\n ...(filePatterns ? { filePatterns } : {}),\n });\n result.print();\n return result.violations.length > 0 ? 1 : 0;\n}\n\nasync function runCssQuality(): Promise<number> {\n const r = await checkCssQuality({ rootDir, skipDirs: exclude });\n r.print();\n return r.violations.length > 0 ? 1 : 0;\n}\n\nasync function runCssLayout(): Promise<number> {\n const r = await checkCssLayout({ rootDir, skipDirs: exclude });\n r.print();\n return r.violations.length > 0 ? 1 : 0;\n}\n\nasync function runCssVars(): Promise<number> {\n const r = await checkCssVars({ rootDir, skipDirs: exclude });\n r.print();\n return r.violations.length > 0 ? 1 : 0;\n}\n\nasync function runCssUnused(): Promise<number> {\n const r = await checkCssUnused({ rootDir, skipDirs: exclude });\n r.print();\n return 0;\n}\n\nasync function runCssAll(): Promise<number> {\n const results = [\n await runCssQuality(),\n await runCssLayout(),\n await runCssVars(),\n await runCssUnused(),\n ];\n return results.some((code) => code !== 0) ? 1 : 0;\n}\n\nasync function runAll(): Promise<number> {\n const results = [await runNoAsCasting(), await runNoRequire(), await runCssAll()];\n return results.some((code) => code !== 0) ? 1 : 0;\n}\n\nlet exitCode = 0;\nswitch (subcommand) {\n case \"no-as-casting\":\n exitCode = await runNoAsCasting();\n break;\n case \"no-require\":\n exitCode = await runNoRequire();\n break;\n case \"css\":\n exitCode = await runCssAll();\n break;\n case \"css-quality\":\n exitCode = await runCssQuality();\n break;\n case \"css-layout\":\n exitCode = await runCssLayout();\n break;\n case \"css-vars\":\n exitCode = await runCssVars();\n break;\n case \"css-unused\":\n exitCode = await runCssUnused();\n break;\n case \"all\":\n exitCode = await runAll();\n break;\n default:\n logger.error(`Unknown quality subcommand: ${subcommand}`);\n logger.error(\n \"Expected one of: no-as-casting, no-require, css, css-quality, css-layout, css-vars, css-unused\"\n );\n exitCode = 2;\n}\n\nprocess.exit(exitCode);\n"
15
+ "/**\n * `polly quality attest` sign a passing run and post a GitHub commit status.\n *\n * The flow:\n * 1. Refuse on a dirty working tree (porcelain non-empty).\n * 2. Resolve the current commit sha and the gh user.\n * 3. Run every registered check via the cache. A red result aborts\n * with no status posted.\n * 4. Compute a digest of the commit sha plus a sorted summary of\n * check results.\n * 5. Post a GitHub commit status named `polly/attested/<user>` to\n * that sha via the local `gh` CLI (which carries the user's\n * existing authentication).\n * 6. Cache the signed entry at\n * `.cache/polly-quality/attest/<commit>.json` so a re-invocation\n * on the same commit short-circuits to a status refresh.\n *\n * Auth lives in the user's `gh` CLI install rather than a `GITHUB_TOKEN`\n * env var: every contributor running `polly quality attest` already\n * authenticated `gh` for issue and PR work, and shelling out keeps the\n * dependency surface zero.\n */\n\nimport { createHash } from \"node:crypto\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { type RegisteredCheck, runChecks } from \"./host\";\nimport type { CheckRunResult, QualityRunConfig, RunReport } from \"./types\";\n\nexport type AttestOptions = {\n rootDir: string;\n registry: Map<string, RegisteredCheck>;\n runConfig: QualityRunConfig;\n /**\n * When set, the deploy preflight command (read from\n * `runConfig.attestDeploy`) runs before the post and the status\n * name becomes `polly/deploy-attested/<user>`.\n */\n deploy?: boolean;\n /** Override for the `polly` segment of the status context. */\n contextPrefix?: string;\n};\n\nexport type AttestResult = {\n ok: boolean;\n /** Posted (or would-have-posted) status context. */\n context: string;\n /** Commit sha the status was attached to. */\n sha: string;\n /** Fingerprint of the run. */\n digest: string;\n /** Summary lines for the CLI reporter. */\n messages: string[];\n /** When non-empty, attest aborted before posting. */\n error?: string;\n /** Underlying check report for downstream display. */\n report?: RunReport;\n};\n\nasync function spawnText(args: string[], cwd: string): Promise<{ ok: boolean; out: string }> {\n const proc = Bun.spawn(args, { cwd, stdout: \"pipe\", stderr: \"pipe\" });\n const [stdout, stderr] = await Promise.all([\n new Response(proc.stdout).text(),\n new Response(proc.stderr).text(),\n ]);\n await proc.exited;\n return { ok: proc.exitCode === 0, out: `${stdout}${stderr}` };\n}\n\nasync function workingTreeIsClean(rootDir: string): Promise<boolean> {\n const r = await spawnText([\"git\", \"status\", \"--porcelain\"], rootDir);\n if (!r.ok) return false;\n return r.out.trim().length === 0;\n}\n\nasync function currentCommit(rootDir: string): Promise<string | null> {\n const r = await spawnText([\"git\", \"rev-parse\", \"HEAD\"], rootDir);\n if (!r.ok) return null;\n const sha = r.out.trim();\n if (!/^[0-9a-f]{40}$/.test(sha)) return null;\n return sha;\n}\n\nasync function ghUser(rootDir: string): Promise<string | null> {\n const r = await spawnText([\"gh\", \"api\", \"user\", \"--jq\", \".login\"], rootDir);\n if (!r.ok) return null;\n const login = r.out.trim();\n return login.length > 0 ? login : null;\n}\n\nasync function ghRepoSlug(rootDir: string): Promise<string | null> {\n const r = await spawnText(\n [\"gh\", \"repo\", \"view\", \"--json\", \"nameWithOwner\", \"--jq\", \".nameWithOwner\"],\n rootDir\n );\n if (!r.ok) return null;\n const slug = r.out.trim();\n if (!slug.includes(\"/\")) return null;\n return slug;\n}\n\nexport function summariseRunReport(report: RunReport): string {\n const passed = report.results.filter((r) => r.ok).length;\n const total = report.results.length;\n return `${passed}/${total} checks passed`;\n}\n\nexport function digestRun(sha: string, results: CheckRunResult[]): string {\n // Stable per-id ordering plus the run-relevant fields. We deliberately\n // exclude durationMs and cached so a cache-warmed re-attest produces the\n // same digest as the original.\n const stable = results\n .slice()\n .sort((a, b) => a.id.localeCompare(b.id))\n .map((r) => ({ id: r.id, ok: r.ok, messages: r.messages }));\n const payload = JSON.stringify({ sha, results: stable });\n return createHash(\"sha256\").update(payload).digest(\"hex\");\n}\n\nfunction attestCachePath(rootDir: string, sha: string): string {\n return join(rootDir, \".cache\", \"polly-quality\", \"attest\", `${sha}.json`);\n}\n\nasync function readPriorAttestation(rootDir: string, sha: string): Promise<string | null> {\n try {\n const raw = await readFile(attestCachePath(rootDir, sha), \"utf8\");\n const parsed = JSON.parse(raw) as unknown as { digest?: string };\n return parsed.digest ?? null;\n } catch {\n return null;\n }\n}\n\nasync function writeAttestation(\n rootDir: string,\n sha: string,\n context: string,\n digest: string\n): Promise<void> {\n const path = attestCachePath(rootDir, sha);\n await mkdir(join(path, \"..\"), { recursive: true });\n const entry = {\n sha,\n context,\n digest,\n attestedAt: new Date().toISOString(),\n };\n await writeFile(path, JSON.stringify(entry, null, 2));\n}\n\nasync function postCommitStatus(\n rootDir: string,\n slug: string,\n sha: string,\n context: string,\n description: string\n): Promise<{ ok: boolean; output: string }> {\n const r = await spawnText(\n [\n \"gh\",\n \"api\",\n \"-X\",\n \"POST\",\n `repos/${slug}/statuses/${sha}`,\n \"-f\",\n \"state=success\",\n \"-f\",\n `context=${context}`,\n \"-f\",\n `description=${description}`,\n ],\n rootDir\n );\n return { ok: r.ok, output: r.out };\n}\n\nasync function preflightOk(\n rootDir: string\n): Promise<{ ok: boolean; reason?: string; sha?: string }> {\n if (!(await workingTreeIsClean(rootDir))) {\n return { ok: false, reason: \"Working tree is dirty; commit or stash before attesting.\" };\n }\n const sha = await currentCommit(rootDir);\n if (!sha) return { ok: false, reason: \"Could not resolve current commit (is this a git repo?)\" };\n return { ok: true, sha };\n}\n\nasync function resolveContext(\n rootDir: string,\n deploy: boolean,\n contextPrefix: string\n): Promise<{ ok: boolean; reason?: string; context?: string; user?: string }> {\n const user = await ghUser(rootDir);\n if (!user) return { ok: false, reason: \"gh CLI is not authenticated; run `gh auth login`.\" };\n const action = deploy ? \"deploy-attested\" : \"attested\";\n return { ok: true, user, context: `${contextPrefix}/${action}/${user}` };\n}\n\nexport async function runAttest(opts: AttestOptions): Promise<AttestResult> {\n const contextPrefix = opts.contextPrefix ?? \"polly\";\n const pre = await preflightOk(opts.rootDir);\n if (!pre.ok || !pre.sha) {\n return {\n ok: false,\n context: \"\",\n sha: \"\",\n digest: \"\",\n messages: [],\n error: pre.reason,\n };\n }\n const sha = pre.sha;\n\n const ctx = await resolveContext(opts.rootDir, opts.deploy === true, contextPrefix);\n if (!ctx.ok || !ctx.context) {\n return { ok: false, context: \"\", sha, digest: \"\", messages: [], error: ctx.reason };\n }\n\n const slug = await ghRepoSlug(opts.rootDir);\n if (!slug) {\n return {\n ok: false,\n context: ctx.context,\n sha,\n digest: \"\",\n messages: [],\n error: \"Could not resolve GitHub repo slug; is `gh` configured for this repo?\",\n };\n }\n\n const report = await runChecks(opts.registry, opts.runConfig, undefined, {\n rootDir: opts.rootDir,\n });\n if (!report.ok) {\n return {\n ok: false,\n context: ctx.context,\n sha,\n digest: \"\",\n messages: [\n `attest aborted: ${summariseRunReport(report)}`,\n ...report.results.filter((r) => !r.ok).map((r) => ` ${r.id}`),\n ],\n error: \"one or more checks failed\",\n report,\n };\n }\n\n const digest = digestRun(sha, report.results);\n const prior = await readPriorAttestation(opts.rootDir, sha);\n const description = `${summariseRunReport(report)} · ${digest.slice(0, 12)}`;\n const post = await postCommitStatus(opts.rootDir, slug, sha, ctx.context, description);\n if (!post.ok) {\n return {\n ok: false,\n context: ctx.context,\n sha,\n digest,\n messages: [post.output.trim()],\n error: \"GitHub status post failed\",\n report,\n };\n }\n\n await writeAttestation(opts.rootDir, sha, ctx.context, digest);\n\n const replayNote = prior === digest ? \"replay (cached digest)\" : \"fresh attestation\";\n return {\n ok: true,\n context: ctx.context,\n sha,\n digest,\n messages: [`${ctx.context} → ${sha.slice(0, 12)} (${replayNote})`, ` ${description}`],\n report,\n };\n}\n",
16
+ "/**\n * Content-hash cache for the quality plugin host.\n *\n * Each check declares the files and extras that determine its result.\n * The cache hashes those into a key, looks up `.cache/polly-quality/<id>.json`,\n * and returns the prior result on hit. A miss re-runs the check body and\n * writes a fresh entry.\n *\n * Files that are missing on disk hash as the literal string `<absent>`\n * so removing a declared input invalidates the entry deterministically.\n * Atomic writes go through a temp file + rename so a process crashing\n * mid-write cannot leave a partial JSON behind that later parses to a\n * malformed entry. A corrupt entry is treated as a miss with a warning;\n * the check re-runs and overwrites it.\n */\n\nimport { createHash } from \"node:crypto\";\nimport { mkdir, readFile, rename, writeFile } from \"node:fs/promises\";\nimport { dirname, isAbsolute, join, resolve } from \"node:path\";\nimport type { CheckOutcome } from \"./types\";\n\nexport type CacheInputs = {\n files: string[];\n extras?: Record<string, string>;\n};\n\nexport type CacheEntry = {\n hash: string;\n outcome: CheckOutcome;\n /** Wall-clock time the entry was written; useful for debugging stale caches. */\n writtenAt: string;\n};\n\nconst ABSENT_MARKER = \"<absent>\";\n\nasync function hashFile(path: string): Promise<string> {\n try {\n const buf = await readFile(path);\n const h = createHash(\"sha256\");\n h.update(buf);\n return h.digest(\"hex\");\n } catch {\n return ABSENT_MARKER;\n }\n}\n\n/**\n * Compute a deterministic SHA-256 over (sorted file paths + content hashes\n * + sorted extras). Identical inputs in any order produce the same hash;\n * adding, removing, renaming, or modifying any input changes it.\n */\nexport async function computeInputsHash(inputs: CacheInputs, rootDir: string): Promise<string> {\n const filePairs: Array<{ path: string; hash: string }> = [];\n for (const f of inputs.files) {\n const abs = isAbsolute(f) ? f : resolve(rootDir, f);\n const hash = await hashFile(abs);\n // Store the relative-to-root form so caches survive a checkout move.\n const rel = abs.startsWith(`${rootDir}/`) ? abs.slice(rootDir.length + 1) : abs;\n filePairs.push({ path: rel, hash });\n }\n filePairs.sort((a, b) => a.path.localeCompare(b.path));\n\n const extras = inputs.extras ?? {};\n const extrasPairs = Object.keys(extras)\n .sort()\n .map((k) => ({ key: k, value: extras[k] ?? \"\" }));\n\n const payload = JSON.stringify({ files: filePairs, extras: extrasPairs });\n return createHash(\"sha256\").update(payload).digest(\"hex\");\n}\n\nfunction cachePath(rootDir: string, checkId: string): string {\n // Replace `:` with `__` so `polly:no-as-casting` becomes a valid filename\n // on every platform.\n const safe = checkId.replace(/:/g, \"__\");\n return join(rootDir, \".cache\", \"polly-quality\", `${safe}.json`);\n}\n\nexport async function getCachedOutcome(\n rootDir: string,\n checkId: string,\n hash: string\n): Promise<CheckOutcome | null> {\n const path = cachePath(rootDir, checkId);\n let raw: string;\n try {\n raw = await readFile(path, \"utf8\");\n } catch {\n return null;\n }\n let parsed: CacheEntry;\n try {\n parsed = JSON.parse(raw) as unknown as CacheEntry;\n } catch {\n // Treat corrupt entries as misses; the check will re-run and the next\n // write replaces the bad file. We deliberately don't throw — a busted\n // cache should not block a CI run.\n return null;\n }\n if (parsed.hash !== hash) return null;\n if (typeof parsed.outcome?.ok !== \"boolean\" || !Array.isArray(parsed.outcome?.messages)) {\n return null;\n }\n return parsed.outcome;\n}\n\nexport async function setCachedOutcome(\n rootDir: string,\n checkId: string,\n hash: string,\n outcome: CheckOutcome\n): Promise<void> {\n const path = cachePath(rootDir, checkId);\n await mkdir(dirname(path), { recursive: true });\n const entry: CacheEntry = { hash, outcome, writtenAt: new Date().toISOString() };\n const tmp = `${path}.tmp-${process.pid}-${Date.now()}`;\n await writeFile(tmp, JSON.stringify(entry, null, 2));\n await rename(tmp, path);\n}\n",
17
+ "/**\n * Plugin host for `@fairfox/polly/quality`.\n *\n * Loads plugins, validates check ids and per-check config, and runs\n * checks in parallel against a `rootDir`. Each check goes through the\n * cache layer first: a content-hash hit returns the prior outcome\n * without invoking the body; a miss runs and persists the result.\n *\n * Errors thrown inside a check are caught and reported as a failed\n * `CheckRunResult` so one broken plugin does not abort the whole run.\n */\n\nimport { computeInputsHash, getCachedOutcome, setCachedOutcome } from \"./cache\";\nimport type {\n Check,\n CheckOutcome,\n CheckRunResult,\n QualityPlugin,\n QualityRunConfig,\n RunReport,\n} from \"./types\";\n\nexport type RegisteredCheck = {\n check: Check<unknown>;\n plugin: QualityPlugin;\n};\n\n/**\n * Build a flat id-keyed registry from the configured plugins. Throws on\n * plugin name collision or check id collision (within or across\n * plugins) so misconfiguration fails at load time, not at run time.\n */\nexport function registerPlugins(plugins: QualityPlugin[]): Map<string, RegisteredCheck> {\n const registry = new Map<string, RegisteredCheck>();\n const pluginNames = new Set<string>();\n for (const plugin of plugins) {\n if (pluginNames.has(plugin.name)) {\n throw new Error(`Quality plugin name collision: \"${plugin.name}\" registered twice`);\n }\n pluginNames.add(plugin.name);\n for (const check of plugin.checks) {\n if (!check.id.startsWith(`${plugin.name}:`)) {\n throw new Error(\n `Check \"${check.id}\" is registered under plugin \"${plugin.name}\" but its id does not begin with \"${plugin.name}:\"`\n );\n }\n if (registry.has(check.id)) {\n const prior = registry.get(check.id)?.plugin.name ?? \"<unknown>\";\n throw new Error(\n `Check id collision: \"${check.id}\" registered by plugins \"${prior}\" and \"${plugin.name}\"`\n );\n }\n registry.set(check.id, { check, plugin });\n }\n }\n return registry;\n}\n\n/**\n * Validate that every per-check config block in the run config is\n * accepted by the corresponding check's `validate` function. Surfaces all\n * errors at once rather than aborting on the first.\n */\nexport function validateRunConfig(\n registry: Map<string, RegisteredCheck>,\n runConfig: QualityRunConfig\n): string[] {\n const errors: string[] = [];\n const checks = runConfig.checks ?? {};\n for (const [id, cfg] of Object.entries(checks)) {\n const entry = registry.get(id);\n if (!entry) {\n errors.push(`Configuration references unknown check id \"${id}\"`);\n continue;\n }\n if (!entry.check.validate) continue;\n const result = entry.check.validate(cfg);\n if (result === null) continue;\n for (const msg of result) {\n errors.push(`[${id}] ${msg}`);\n }\n }\n return errors;\n}\n\nexport type RunOptions = {\n rootDir: string;\n /** When set, skip cache reads and writes. */\n noCache?: boolean;\n /** Concurrency cap; defaults to the number of registered checks. */\n concurrency?: number;\n signal?: AbortSignal;\n};\n\nasync function resolveCacheHash(\n check: Check<unknown>,\n config: unknown,\n opts: RunOptions\n): Promise<string | null> {\n if (opts.noCache || !check.filesRead) return null;\n try {\n const files = await check.filesRead(config, opts.rootDir);\n const extras = check.cacheKeyExtras?.(config);\n return computeInputsHash({ files, ...(extras ? { extras } : {}) }, opts.rootDir);\n } catch {\n // Cache-input collection failures fall through to a non-cached run.\n return null;\n }\n}\n\nasync function executeBody(\n check: Check<unknown>,\n config: unknown,\n opts: RunOptions\n): Promise<CheckOutcome | { error: string }> {\n try {\n return await check.run({\n rootDir: opts.rootDir,\n config,\n ...(opts.signal ? { signal: opts.signal } : {}),\n });\n } catch (err) {\n return { error: err instanceof Error ? err.message : String(err) };\n }\n}\n\nasync function runOne(\n entry: RegisteredCheck,\n config: unknown,\n opts: RunOptions\n): Promise<CheckRunResult> {\n const { check } = entry;\n const start = Date.now();\n\n const cacheHash = await resolveCacheHash(check, config, opts);\n if (cacheHash) {\n const cached = await getCachedOutcome(opts.rootDir, check.id, cacheHash);\n if (cached) {\n return {\n id: check.id,\n ok: cached.ok,\n durationMs: Date.now() - start,\n cached: true,\n messages: cached.messages,\n };\n }\n }\n\n const result = await executeBody(check, config, opts);\n if (\"error\" in result) {\n return {\n id: check.id,\n ok: false,\n durationMs: Date.now() - start,\n cached: false,\n messages: [],\n error: result.error,\n };\n }\n\n if (cacheHash && result.ok) {\n // Only cache passing outcomes — a cached failure could mask a fix\n // until the next input change, which is surprising in CI.\n try {\n await setCachedOutcome(opts.rootDir, check.id, cacheHash, result);\n } catch {\n // Cache-write failures are non-fatal; the next run just re-executes.\n }\n }\n\n return {\n id: check.id,\n ok: result.ok,\n durationMs: Date.now() - start,\n cached: false,\n messages: result.messages,\n };\n}\n\nasync function runWithConcurrency<T, R>(\n items: T[],\n limit: number,\n worker: (item: T) => Promise<R>\n): Promise<R[]> {\n if (items.length === 0) return [];\n const results: R[] = new Array(items.length);\n let cursor = 0;\n const workers = Array.from({ length: Math.max(1, Math.min(limit, items.length)) }, async () => {\n while (true) {\n const i = cursor++;\n if (i >= items.length) return;\n const item = items[i];\n if (item === undefined) return;\n results[i] = await worker(item);\n }\n });\n await Promise.all(workers);\n return results;\n}\n\n/**\n * Run a set of checks. If `ids` is undefined, runs every registered check.\n * Returns a `RunReport` with per-check results plus an aggregate `ok`.\n */\nexport async function runChecks(\n registry: Map<string, RegisteredCheck>,\n runConfig: QualityRunConfig,\n ids: string[] | undefined,\n opts: RunOptions\n): Promise<RunReport> {\n const start = Date.now();\n const targets: RegisteredCheck[] = [];\n if (ids === undefined) {\n targets.push(...registry.values());\n } else {\n for (const id of ids) {\n const entry = registry.get(id);\n if (!entry) {\n throw new Error(`Unknown check id: \"${id}\"`);\n }\n targets.push(entry);\n }\n }\n\n const checks = runConfig.checks ?? {};\n const limit = opts.concurrency ?? targets.length;\n const results = await runWithConcurrency(targets, limit, (entry) =>\n runOne(entry, checks[entry.check.id], opts)\n );\n\n return {\n ok: results.every((r) => r.ok),\n results,\n totalDurationMs: Date.now() - start,\n };\n}\n\nexport function listChecks(registry: Map<string, RegisteredCheck>): Array<{\n id: string;\n description: string;\n plugin: string;\n}> {\n return Array.from(registry.values())\n .map(({ check, plugin }) => ({\n id: check.id,\n description: check.description,\n plugin: plugin.name,\n }))\n .sort((a, b) => a.id.localeCompare(b.id));\n}\n",
18
+ "/**\n * Loader for the `quality` block of `polly.config.ts`.\n *\n * Consumers express their plugin set as\n *\n * export default {\n * quality: {\n * plugins: [pollyCorePlugin, pollyUiPlugin, localPlugin],\n * checks: { \"polly:no-as-casting\": { exclude: [\"build\"] } },\n * },\n * };\n *\n * If no config is found, the loader returns `pollyCorePlugin` only —\n * that's the minimum useful default and matches the surface every\n * polly consumer already gets.\n */\n\nimport { join } from \"node:path\";\nimport { pollyCorePlugin } from \"./plugins/core\";\nimport type { QualityRunConfig } from \"./types\";\n\nconst DEFAULT_PATHS = [\"polly.config.ts\", \"polly.config.js\", \"polly.config.mjs\"];\n\nexport async function loadQualityConfig(\n rootDir: string,\n explicitPath?: string\n): Promise<QualityRunConfig> {\n const candidates = explicitPath ? [explicitPath] : DEFAULT_PATHS.map((p) => join(rootDir, p));\n\n for (const path of candidates) {\n if (!(await Bun.file(path).exists())) continue;\n const mod = (await import(path)) as unknown as { default?: { quality?: QualityRunConfig } };\n const config = mod.default?.quality;\n if (!config) continue;\n if (!Array.isArray(config.plugins) || config.plugins.length === 0) {\n throw new Error(`${path}: \\`quality.plugins\\` must be a non-empty array`);\n }\n return config;\n }\n\n return { plugins: [pollyCorePlugin] };\n}\n",
19
+ "/**\n * `pollyCorePlugin` — the polly-provided core plugin.\n *\n * Wraps the four checks polly already ships in `@fairfox/polly/quality`\n * into the new `Check` contract. The wrapping is purely adaptive: each\n * underlying function (`checkNoAsCasting`, `checkNoRequire`,\n * `checkSecrets`, `checkGitignoreCoversAllowlist`) keeps its existing\n * exports unchanged, so consumers wiring those up by hand continue to\n * work. The plugin path is the new way; the function path stays the\n * same.\n *\n * The CSS family and shared-components live in a separate `polly-ui`\n * plugin (#92–#94) because they belong to the styled-component\n * contract polly-ui owns. Issue #98's scope is the four core checks.\n */\n\nimport { join } from \"node:path\";\nimport { Glob } from \"bun\";\nimport { checkNoAsCasting } from \"../no-as-casting\";\nimport { checkNoRequire } from \"../no-require\";\nimport { checkGitignoreCoversAllowlist, checkSecrets } from \"../secrets\";\nimport type { Check, QualityPlugin } from \"../types\";\nimport { additionalCoreChecks } from \"./core-checks\";\nimport { extraCoreChecks } from \"./extra-checks\";\nimport { importCoreChecks } from \"./import-checks\";\n\nconst DEFAULT_EXCLUDES = [\"node_modules\", \"dist\", \".git\", \".bun\", \"dist-test\", \"build\", \"coverage\"];\n\ntype ScanConfig = {\n exclude?: string[];\n excludePackages?: string[];\n excludeFiles?: string[];\n filePatterns?: string;\n};\n\nasync function scanFiles(rootDir: string, cfg: ScanConfig): Promise<string[]> {\n const excludeDirs = new Set(cfg.exclude ?? DEFAULT_EXCLUDES);\n const excludePackages = new Set(cfg.excludePackages ?? []);\n const excludeFiles = new Set(cfg.excludeFiles ?? []);\n const pattern = cfg.filePatterns ?? \"**/*.{ts,tsx}\";\n const glob = new Glob(pattern);\n const out: string[] = [];\n for await (const file of glob.scan({ cwd: rootDir, absolute: true })) {\n const rel = file.replace(`${rootDir}/`, \"\");\n const segments = rel.split(\"/\");\n if (segments.some((s) => excludeDirs.has(s))) continue;\n if (excludePackages.size > 0 && segments.some((s) => excludePackages.has(s))) continue;\n const basename = segments[segments.length - 1] ?? \"\";\n if (excludeFiles.has(basename) || excludeFiles.has(rel)) continue;\n out.push(file);\n }\n return out;\n}\n\nfunction resolveScanConfig(config: ScanConfig | undefined): ScanConfig {\n return config ?? {};\n}\n\nconst noAsCasting: Check<ScanConfig | undefined> = {\n id: \"polly:no-as-casting\",\n description: \"Ban TypeScript `as` type assertions outside the allowed forms\",\n filesRead: (cfg, root) => scanFiles(root, resolveScanConfig(cfg)),\n run: async ({ rootDir, config }) => {\n const cfg = resolveScanConfig(config);\n const result = await checkNoAsCasting({\n rootDir,\n exclude: cfg.exclude ?? DEFAULT_EXCLUDES,\n ...(cfg.excludePackages ? { excludePackages: cfg.excludePackages } : {}),\n ...(cfg.excludeFiles ? { excludeFiles: cfg.excludeFiles } : {}),\n ...(cfg.filePatterns ? { filePatterns: cfg.filePatterns } : {}),\n });\n return {\n ok: result.violations.length === 0,\n messages: result.violations.map(\n (v) => `${v.file}:${v.line}: ${v.content}${v.advice ? ` — ${v.advice}` : \"\"}`\n ),\n };\n },\n};\n\nconst noRequire: Check<ScanConfig | undefined> = {\n id: \"polly:no-require\",\n description: \"Ban CommonJS `require(...)` calls in TypeScript source\",\n filesRead: (cfg, root) => scanFiles(root, resolveScanConfig(cfg)),\n run: async ({ rootDir, config }) => {\n const cfg = resolveScanConfig(config);\n const result = await checkNoRequire({\n rootDir,\n exclude: cfg.exclude ?? DEFAULT_EXCLUDES,\n ...(cfg.filePatterns ? { filePatterns: cfg.filePatterns } : {}),\n });\n return {\n ok: result.violations.length === 0,\n messages: result.violations.map((v) => `${v.file}:${v.line}: ${v.content}`),\n };\n },\n};\n\ntype SecretsConfig = {\n configPath?: string;\n noGit?: boolean;\n};\n\nconst secrets: Check<SecretsConfig | undefined> = {\n id: \"polly:secrets\",\n description: \"Run `gitleaks detect` against the working tree\",\n // gitleaks scans the working tree on disk; we declare the config file as\n // the only file input. Tool-version is captured via cacheKeyExtras so a\n // new gitleaks release re-scans even on identical config + tree.\n filesRead: async (cfg, root) => {\n const c = cfg ?? {};\n if (!c.configPath) return [];\n return [join(root, c.configPath)];\n },\n cacheKeyExtras: (cfg) => ({\n noGit: (cfg ?? {}).noGit === false ? \"false\" : \"true\",\n }),\n run: async ({ rootDir, config }) => {\n const cfg = config ?? {};\n const result = await checkSecrets({\n root: rootDir,\n ...(cfg.configPath ? { configPath: cfg.configPath } : {}),\n ...(typeof cfg.noGit === \"boolean\" ? { noGit: cfg.noGit } : {}),\n });\n if (!result.binaryFound) {\n return {\n ok: false,\n messages: [\n \"gitleaks is not on PATH. Install with `brew install gitleaks` (macOS) or from https://github.com/gitleaks/gitleaks/releases.\",\n ],\n };\n }\n return {\n ok: result.exitCode === 0,\n messages:\n result.exitCode === 0 ? [] : [result.output.trim() || `gitleaks exited ${result.exitCode}`],\n };\n },\n};\n\ntype GitignoreConfig = {\n tomlPath?: string;\n gitignorePath?: string;\n sectionStartMarkers?: string[];\n sectionEndMarkers?: string[];\n};\n\nconst gitignoreCrossCheck: Check<GitignoreConfig | undefined> = {\n id: \"polly:gitignore-cross-check\",\n description:\n \"Verify every gitleaks allowlist entry marked as gitignored is actually covered by .gitignore\",\n filesRead: (cfg, root) => {\n const c = cfg ?? {};\n return [\n join(root, c.tomlPath ?? \".gitleaks.toml\"),\n join(root, c.gitignorePath ?? \".gitignore\"),\n ];\n },\n run: async ({ rootDir, config }) => {\n const cfg = config ?? {};\n const result = await checkGitignoreCoversAllowlist({\n root: rootDir,\n ...(cfg.tomlPath ? { tomlPath: cfg.tomlPath } : {}),\n ...(cfg.gitignorePath ? { gitignorePath: cfg.gitignorePath } : {}),\n ...(cfg.sectionStartMarkers ? { sectionStartMarkers: cfg.sectionStartMarkers } : {}),\n ...(cfg.sectionEndMarkers ? { sectionEndMarkers: cfg.sectionEndMarkers } : {}),\n });\n return {\n ok: result.missing.length === 0,\n messages:\n result.missing.length === 0\n ? []\n : [\n \"Paths allowed by .gitleaks.toml are NOT covered by .gitignore:\",\n ...result.missing.map((f) => ` ${f}`),\n ],\n };\n },\n};\n\nexport const POLLY_CORE_VERSION = \"0.45.0\";\n\nexport const pollyCorePlugin: QualityPlugin = {\n name: \"polly\",\n version: POLLY_CORE_VERSION,\n checks: [\n noAsCasting as Check<unknown>,\n noRequire as Check<unknown>,\n secrets as Check<unknown>,\n gitignoreCrossCheck as Check<unknown>,\n ...additionalCoreChecks,\n ...extraCoreChecks,\n ...importCoreChecks,\n ],\n};\n",
20
+ "/**\n * Additional checks bundled into `pollyCorePlugin`.\n *\n * Each check here is a port of an existing `scripts/check-*.ts` script\n * from polly's repo into the plugin contract. The original scripts\n * remain on disk for back-compat with the existing pre-commit\n * orchestrator (`scripts/check.ts`); the plugin path is the new way\n * for downstream consumers (lingua, fairfox, warehouse-experiments)\n * who do not want to copy the script verbatim.\n *\n * Out of scope for this release:\n * - `polly:boundaries` issue text describes a workspace-dependency\n * model (each package may only import from packages it lists in\n * its `dependencies`). Polly itself is a single-package repo and\n * uses directional zone bans (`src/` cannot import `tools/`,\n * etc.); that model is what ships here. The workspace-dep model\n * can be layered on as an additional configuration mode later.\n */\n\nimport { readdir } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport type { Check } from \"../types\";\n\n// ─────────────────────────────────────────────────────────────────\n// polly:security — semgrep SAST wrapper\n// ─────────────────────────────────────────────────────────────────\n\ntype SecurityConfig = {\n /** Override the semgrep ruleset; defaults to `auto`. */\n config?: string;\n /** Severity floors passed to `--severity`; defaults to ERROR + WARNING. */\n severities?: string[];\n /** Glob excludes appended after the severities. */\n exclude?: string[];\n};\n\nasync function semgrepInstalled(): Promise<boolean> {\n const which = Bun.spawn([\"which\", \"semgrep\"], { stdout: \"ignore\", stderr: \"ignore\" });\n await which.exited;\n return which.exitCode === 0;\n}\n\nconst security: Check<SecurityConfig | undefined> = {\n id: \"polly:security\",\n description: \"Run `semgrep scan` against the working tree (SAST)\",\n // semgrep walks the tree on disk; we use cacheKeyExtras to capture\n // the ruleset name so a config flip re-scans even on identical files.\n // filesRead is intentionally empty: the tree-walking surface is wider\n // than any glob we'd hand-write here, and semgrep's own incremental\n // model is what consumers should rely on inside CI. Cache invalidation\n // on tool version + ruleset is enough to make repeat invocations cheap.\n cacheKeyExtras: (cfg) => {\n const c = cfg ?? {};\n return {\n config: c.config ?? \"auto\",\n severities: (c.severities ?? [\"ERROR\", \"WARNING\"]).slice().sort().join(\",\"),\n exclude: (c.exclude ?? []).slice().sort().join(\",\"),\n };\n },\n run: async ({ rootDir, config }) => {\n if (!(await semgrepInstalled())) {\n return {\n ok: false,\n messages: [\n \"semgrep is not on PATH. Install with `brew install semgrep` (macOS) or `pip install semgrep`.\",\n ],\n };\n }\n const cfg = config ?? {};\n const args = [\"semgrep\", \"scan\", \"--config\", cfg.config ?? \"auto\", \"--quiet\", \"--error\"];\n for (const sev of cfg.severities ?? [\"ERROR\", \"WARNING\"]) {\n args.push(\"--severity\", sev);\n }\n for (const exc of cfg.exclude ?? [\"Dockerfile*\", \"docker-compose*\"]) {\n args.push(`--exclude=${exc}`);\n }\n const proc = Bun.spawn(args, { cwd: rootDir, stdout: \"pipe\", stderr: \"pipe\" });\n const [stdout, stderr] = await Promise.all([\n new Response(proc.stdout).text(),\n new Response(proc.stderr).text(),\n ]);\n await proc.exited;\n const output = `${stdout}${stderr}`.trim();\n return {\n ok: proc.exitCode === 0,\n messages: proc.exitCode === 0 ? [] : [output || `semgrep exited ${proc.exitCode}`],\n };\n },\n};\n\n// ─────────────────────────────────────────────────────────────────\n// polly:boundaries — directional zone-ban import check\n// ─────────────────────────────────────────────────────────────────\n\ntype BoundariesConfig = {\n /** From-zone → list of zone path prefixes that zone may not import from. */\n bans?: Record<string, string[]>;\n /** Zone names to scan; entries map to subdirectories of rootDir. */\n zones?: string[];\n /** Directories whose names cause a recursive scan to skip. */\n skipDirs?: string[];\n};\n\nconst DEFAULT_BOUNDARIES: BoundariesConfig = {\n bans: { src: [\"tools/\", \"cli/\", \"scripts/\"], tools: [\"cli/\", \"scripts/\"] },\n zones: [\"src\", \"tools\", \"cli\", \"scripts\"],\n skipDirs: [\"node_modules\", \".git\", \"dist\", \".bun\", \".cache\"],\n};\n\nconst IMPORT_REGEX =\n /(?:import|export)\\s+.*?from\\s+['\"]([^'\"]+)['\"]|require\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g;\n\nfunction isTestFile(rel: string): boolean {\n return (\n rel.includes(\"__tests__\") ||\n rel.includes(\".test.\") ||\n rel.includes(\".spec.\") ||\n rel.startsWith(\"tests/\")\n );\n}\n\nfunction resolveTargetZone(specifier: string, fromFile: string, rootDir: string): string | null {\n if (!specifier.startsWith(\".\") && !specifier.startsWith(\"/\")) return null;\n const fromDir = relative(rootDir, fromFile).split(\"/\").slice(0, -1).join(\"/\");\n const segments = `${fromDir}/${specifier}`.split(\"/\");\n const resolved: string[] = [];\n for (const seg of segments) {\n if (seg === \"\" || seg === \".\") continue;\n if (seg === \"..\") {\n resolved.pop();\n continue;\n }\n resolved.push(seg);\n }\n return resolved.join(\"/\");\n}\n\nasync function collectScannableFiles(\n dir: string,\n skipDirs: Set<string>,\n out: string[]\n): Promise<void> {\n let entries: import(\"node:fs\").Dirent[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n if (!skipDirs.has(entry.name)) await collectScannableFiles(fullPath, skipDirs, out);\n } else if (entry.isFile() && (entry.name.endsWith(\".ts\") || entry.name.endsWith(\".tsx\"))) {\n out.push(fullPath);\n }\n }\n}\n\nfunction violationsForBoundarySpecifier(\n specifier: string,\n ctx: {\n filePath: string;\n rootDir: string;\n zone: string;\n bans: string[];\n rel: string;\n line: number;\n }\n): Array<{ file: string; line: number; rule: string }> {\n const target = resolveTargetZone(specifier, ctx.filePath, ctx.rootDir);\n if (!target) return [];\n const out: Array<{ file: string; line: number; rule: string }> = [];\n for (const banned of ctx.bans) {\n if (target.startsWith(banned)) {\n out.push({\n file: ctx.rel,\n line: ctx.line,\n rule: `\"${ctx.zone}/\" cannot import from \"${banned}\" (resolved: ${target})`,\n });\n }\n }\n return out;\n}\n\nfunction scanLineForBoundary(\n line: string,\n ctx: {\n filePath: string;\n rootDir: string;\n zone: string;\n bans: string[];\n rel: string;\n lineNumber: number;\n }\n): Array<{ file: string; line: number; rule: string }> {\n const trimmed = line.trim();\n if (trimmed.startsWith(\"//\") || trimmed.startsWith(\"*\") || trimmed.startsWith(\"/*\")) return [];\n const out: Array<{ file: string; line: number; rule: string }> = [];\n IMPORT_REGEX.lastIndex = 0;\n let match = IMPORT_REGEX.exec(line);\n while (match !== null) {\n const specifier = match[1] || match[2];\n if (specifier) {\n out.push(...violationsForBoundarySpecifier(specifier, { ...ctx, line: ctx.lineNumber }));\n }\n match = IMPORT_REGEX.exec(line);\n }\n return out;\n}\n\nfunction scanFileForBoundaryViolations(\n filePath: string,\n content: string,\n rootDir: string,\n zone: string,\n bans: string[]\n): Array<{ file: string; line: number; rule: string }> {\n const rel = relative(rootDir, filePath);\n const lines = content.split(\"\\n\");\n const out: Array<{ file: string; line: number; rule: string }> = [];\n for (let i = 0; i < lines.length; i++) {\n out.push(\n ...scanLineForBoundary(lines[i] ?? \"\", {\n filePath,\n rootDir,\n zone,\n bans,\n rel,\n lineNumber: i + 1,\n })\n );\n }\n return out;\n}\n\nconst boundaries: Check<BoundariesConfig | undefined> = {\n id: \"polly:boundaries\",\n description: \"Enforce directional import bans between top-level zones (src/tools/cli/scripts)\",\n filesRead: async (cfg, root) => {\n const c = { ...DEFAULT_BOUNDARIES, ...(cfg ?? {}) };\n const skipDirs = new Set(c.skipDirs ?? DEFAULT_BOUNDARIES.skipDirs ?? []);\n const out: string[] = [];\n for (const zone of c.zones ?? DEFAULT_BOUNDARIES.zones ?? []) {\n await collectScannableFiles(join(root, zone), skipDirs, out);\n }\n return out.filter((p) => !isTestFile(relative(root, p)));\n },\n run: async ({ rootDir, config }) => {\n const c = { ...DEFAULT_BOUNDARIES, ...(config ?? {}) };\n const bans = c.bans ?? {};\n const zones = c.zones ?? [];\n const skipDirs = new Set(c.skipDirs ?? []);\n const all: Array<{ file: string; line: number; rule: string }> = [];\n for (const zone of zones) {\n const files: string[] = [];\n await collectScannableFiles(join(rootDir, zone), skipDirs, files);\n const fromBans = bans[zone] ?? [];\n if (fromBans.length === 0) continue;\n for (const filePath of files) {\n if (isTestFile(relative(rootDir, filePath))) continue;\n const content = await Bun.file(filePath).text();\n all.push(...scanFileForBoundaryViolations(filePath, content, rootDir, zone, fromBans));\n }\n }\n return {\n ok: all.length === 0,\n messages: all.map((v) => `${v.file}:${v.line}: ${v.rule}`),\n };\n },\n};\n\n// ─────────────────────────────────────────────────────────────────\n// polly:server-imports — ban node:* / bun:* in browser packages\n// ─────────────────────────────────────────────────────────────────\n\ntype ServerImportsConfig = {\n /** Path prefixes that are browser-targeting; their files cannot import banned specifiers. */\n browserPaths?: string[];\n /** Module specifiers that are server-only. */\n bannedSpecifiers?: string[];\n /** Files (relative to rootDir) excluded from the rule. */\n allowFiles?: string[];\n skipDirs?: string[];\n};\n\nconst DEFAULT_SERVER_IMPORTS: Required<Omit<ServerImportsConfig, \"allowFiles\">> = {\n browserPaths: [\n \"src/popup\",\n \"src/content\",\n \"src/devtools\",\n \"src/options\",\n \"src/offscreen\",\n \"src/page\",\n \"src/ui\",\n \"src/polly-ui\",\n \"tools/test/src/browser\",\n ],\n bannedSpecifiers: [\n \"bun:sqlite\",\n \"bun:ffi\",\n \"bun:jsc\",\n \"node:fs\",\n \"node:fs/promises\",\n \"node:path\",\n \"node:child_process\",\n \"node:net\",\n \"node:os\",\n \"node:http\",\n \"node:https\",\n \"node:stream\",\n \"node:worker_threads\",\n \"node:cluster\",\n \"node:tls\",\n \"node:dns\",\n \"better-sqlite3\",\n \"sqlite3\",\n \"ws\",\n ],\n skipDirs: [\"node_modules\", \"dist\", \".cache\"],\n};\n\nfunction buildBannedRegex(specs: string[]): RegExp {\n // Each specifier is regex-escaped so user-supplied names cannot inject\n // metacharacters into the compiled pattern. The output regex is a fixed\n // shape with the escaped alternation embedded; the only dynamic input is\n // the alternation list, and every entry has been quoted.\n const escaped = specs.map((s) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")).join(\"|\");\n // nosemgrep: javascript.lang.security.audit.detect-non-literal-regexp.detect-non-literal-regexp\n return new RegExp(\n `(?:import|export)\\\\s+.*?from\\\\s+['\"](?:${escaped})(?:/[^'\"]*)?['\"]|require\\\\(\\\\s*['\"](?:${escaped})(?:/[^'\"]*)?['\"]\\\\s*\\\\)`\n );\n}\n\nfunction isExcludedFromServerCheck(rel: string, allow: Set<string>): boolean {\n if (allow.has(rel)) return true;\n return rel.includes(\"__tests__\") || rel.includes(\".test.\") || rel.includes(\".spec.\");\n}\n\nfunction scanFileForServerImports(rel: string, content: string, bannedRegex: RegExp): string[] {\n const violations: string[] = [];\n const lines = content.split(\"\\n\");\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? \"\";\n const trimmed = line.trim();\n if (trimmed.startsWith(\"//\") || trimmed.startsWith(\"*\") || trimmed.startsWith(\"/*\")) continue;\n if (bannedRegex.test(line)) {\n violations.push(`${rel}:${i + 1}: ${trimmed}`);\n }\n }\n return violations;\n}\n\nconst serverImports: Check<ServerImportsConfig | undefined> = {\n id: \"polly:server-imports\",\n description: \"Ban node:* / bun:* imports inside browser-targeting packages\",\n filesRead: async (cfg, root) => {\n const c = cfg ?? {};\n const skipDirs = new Set(c.skipDirs ?? DEFAULT_SERVER_IMPORTS.skipDirs);\n const allow = new Set(c.allowFiles ?? []);\n const out: string[] = [];\n for (const p of c.browserPaths ?? DEFAULT_SERVER_IMPORTS.browserPaths) {\n await collectScannableFiles(join(root, p), skipDirs, out);\n }\n return out.filter((p) => !isExcludedFromServerCheck(relative(root, p), allow));\n },\n run: async ({ rootDir, config }) => {\n const c = config ?? {};\n const skipDirs = new Set(c.skipDirs ?? DEFAULT_SERVER_IMPORTS.skipDirs);\n const bannedRegex = buildBannedRegex(\n c.bannedSpecifiers ?? DEFAULT_SERVER_IMPORTS.bannedSpecifiers\n );\n const allow = new Set(c.allowFiles ?? []);\n const violations: string[] = [];\n for (const p of c.browserPaths ?? DEFAULT_SERVER_IMPORTS.browserPaths) {\n const files: string[] = [];\n await collectScannableFiles(join(rootDir, p), skipDirs, files);\n for (const filePath of files) {\n const rel = relative(rootDir, filePath);\n if (isExcludedFromServerCheck(rel, allow)) continue;\n const content = await Bun.file(filePath).text();\n violations.push(...scanFileForServerImports(rel, content, bannedRegex));\n }\n }\n return { ok: violations.length === 0, messages: violations };\n },\n};\n\nexport const additionalCoreChecks: Check<unknown>[] = [\n security as Check<unknown>,\n boundaries as Check<unknown>,\n serverImports as Check<unknown>,\n];\n",
21
+ "/**\n * Three more checks bundled into `pollyCorePlugin`:\n *\n * - polly:forbidden-deps — import-graph ban list (#87)\n * - polly:no-state-hooks — ban useState/useReducer/useSignal (#99)\n * - polly:typographic-quotes — opt-in straight-vs-curly enforcement (#88)\n *\n * Each check is parameterised: defaults match polly's own pre-commit\n * surface; consumers override via `polly.config.ts`. Test files are\n * excluded by default for the import-walking checks since mocks and\n * fixtures legitimately reference banned packages.\n */\n\nimport { readdir } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport { Glob } from \"bun\";\nimport type { Check } from \"../types\";\n\nconst SKIP_DIRS_DEFAULT = [\"node_modules\", \".git\", \"dist\", \".bun\", \".cache\"];\n\nfunction isCommentLine(trimmed: string): boolean {\n return trimmed.startsWith(\"//\") || trimmed.startsWith(\"*\") || trimmed.startsWith(\"/*\");\n}\n\nfunction isTestFile(rel: string): boolean {\n return (\n rel.includes(\"__tests__\") ||\n rel.includes(\".test.\") ||\n rel.includes(\".spec.\") ||\n rel.startsWith(\"tests/\")\n );\n}\n\nasync function walkScannableFiles(\n dir: string,\n skipDirs: Set<string>,\n out: string[]\n): Promise<void> {\n let entries: import(\"node:fs\").Dirent[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n if (!skipDirs.has(entry.name)) await walkScannableFiles(fullPath, skipDirs, out);\n } else if (entry.isFile() && (entry.name.endsWith(\".ts\") || entry.name.endsWith(\".tsx\"))) {\n out.push(fullPath);\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────────\n// polly:forbidden-deps — import-graph ban list\n// ─────────────────────────────────────────────────────────────────\n\ntype ForbiddenDepsConfig = {\n /** Map of category description → list of banned package prefixes. */\n banned?: Record<string, string[]>;\n /** Top-level zones to scan. */\n zones?: string[];\n /** Directories to skip. */\n skipDirs?: string[];\n};\n\nconst DEFAULT_FORBIDDEN: Required<ForbiddenDepsConfig> = {\n banned: {\n \"Alternative test runners (we use bun:test)\": [\n \"vitest\",\n \"jest\",\n \"@jest/globals\",\n \"mocha\",\n \"ava\",\n \"tape\",\n \"tap\",\n \"uvu\",\n ],\n \"Alternative linters/formatters (we use biome)\": [\n \"eslint\",\n \"@eslint\",\n \"prettier\",\n \"@prettier\",\n \"tslint\",\n ],\n \"Deprecated HTTP libraries (use fetch)\": [\n \"request\",\n \"request-promise\",\n \"request-promise-native\",\n ],\n \"Date-handling libraries (use Date or built-ins)\": [\"moment\", \"moment-timezone\"],\n },\n zones: [\"src\", \"tools\", \"cli\", \"scripts\"],\n skipDirs: SKIP_DIRS_DEFAULT,\n};\n\nconst IMPORT_REGEX =\n /(?:import|export)\\s+.*?from\\s+['\"]([^'\"]+)['\"]|require\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g;\n\nfunction lookupBanned(\n specifier: string,\n banned: Record<string, string[]>\n): { category: string } | null {\n for (const [category, prefixes] of Object.entries(banned)) {\n for (const p of prefixes) {\n if (specifier === p || specifier.startsWith(`${p}/`)) return { category };\n }\n }\n return null;\n}\n\nfunction scanLineForBanned(\n line: string,\n banned: Record<string, string[]>,\n rel: string,\n lineNumber: number\n): Array<{ file: string; line: number; content: string; category: string }> {\n const trimmed = line.trim();\n if (isCommentLine(trimmed)) return [];\n const out: Array<{ file: string; line: number; content: string; category: string }> = [];\n IMPORT_REGEX.lastIndex = 0;\n let match = IMPORT_REGEX.exec(line);\n while (match !== null) {\n const specifier = match[1] || match[2];\n const hit = specifier ? lookupBanned(specifier, banned) : null;\n if (hit) {\n out.push({ file: rel, line: lineNumber, content: trimmed, category: hit.category });\n }\n match = IMPORT_REGEX.exec(line);\n }\n return out;\n}\n\nasync function scanFileForForbidden(\n filePath: string,\n rel: string,\n banned: Record<string, string[]>\n): Promise<string[]> {\n const content = await Bun.file(filePath).text();\n const lines = content.split(\"\\n\");\n const out: string[] = [];\n for (let i = 0; i < lines.length; i++) {\n for (const v of scanLineForBanned(lines[i] ?? \"\", banned, rel, i + 1)) {\n out.push(`[${v.category}] ${v.file}:${v.line}: ${v.content}`);\n }\n }\n return out;\n}\n\nconst forbiddenDeps: Check<ForbiddenDepsConfig | undefined> = {\n id: \"polly:forbidden-deps\",\n description:\n \"Ban imports from a configured list of packages (alternative tools, deprecated libs)\",\n filesRead: async (cfg, root) => {\n const c = cfg ?? {};\n const skipDirs = new Set(c.skipDirs ?? DEFAULT_FORBIDDEN.skipDirs);\n const out: string[] = [];\n for (const z of c.zones ?? DEFAULT_FORBIDDEN.zones) {\n await walkScannableFiles(join(root, z), skipDirs, out);\n }\n return out.filter((p) => !isTestFile(relative(root, p)));\n },\n run: async ({ rootDir, config }) => {\n const c = config ?? {};\n const banned = c.banned ?? DEFAULT_FORBIDDEN.banned;\n const skipDirs = new Set(c.skipDirs ?? DEFAULT_FORBIDDEN.skipDirs);\n const violations: string[] = [];\n for (const z of c.zones ?? DEFAULT_FORBIDDEN.zones) {\n const files: string[] = [];\n await walkScannableFiles(join(rootDir, z), skipDirs, files);\n for (const filePath of files) {\n const rel = relative(rootDir, filePath);\n if (isTestFile(rel)) continue;\n violations.push(...(await scanFileForForbidden(filePath, rel, banned)));\n }\n }\n return { ok: violations.length === 0, messages: violations };\n },\n};\n\n// ─────────────────────────────────────────────────────────────────\n// polly:no-state-hooks — ban local-state hooks (signals-first)\n// ─────────────────────────────────────────────────────────────────\n\ntype NoStateHooksConfig = {\n /** Hook names to ban; defaults match polly's signals-first stance. */\n banned?: string[];\n /** Glob (relative to rootDir) of files exempt from the rule. */\n allowedFiles?: string[];\n zones?: string[];\n skipDirs?: string[];\n};\n\nconst DEFAULT_NO_STATE_HOOKS: Required<NoStateHooksConfig> = {\n banned: [\"useState\", \"useReducer\", \"useSignal\"],\n allowedFiles: [],\n zones: [\"src\", \"tools\", \"cli\", \"scripts\"],\n skipDirs: SKIP_DIRS_DEFAULT,\n};\n\nfunction escapeForAlternation(name: string): string {\n return name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction buildHookRegex(banned: string[]): RegExp {\n // Match either `import { useState[, …] } from …` or a call site `useState(`.\n const alts = banned.map(escapeForAlternation).join(\"|\");\n // nosemgrep: javascript.lang.security.audit.detect-non-literal-regexp.detect-non-literal-regexp\n return new RegExp(`\\\\b(${alts})\\\\b`);\n}\n\nfunction isAllowedByGlob(rel: string, allowedFiles: string[]): boolean {\n for (const pattern of allowedFiles) {\n if (new Glob(pattern).match(rel)) return true;\n }\n return false;\n}\n\nconst noStateHooks: Check<NoStateHooksConfig | undefined> = {\n id: \"polly:no-state-hooks\",\n description: \"Ban useState/useReducer/useSignal — polly is signals-first\",\n filesRead: async (cfg, root) => {\n const c = cfg ?? {};\n const skipDirs = new Set(c.skipDirs ?? DEFAULT_NO_STATE_HOOKS.skipDirs);\n const allowed = c.allowedFiles ?? DEFAULT_NO_STATE_HOOKS.allowedFiles;\n const out: string[] = [];\n for (const z of c.zones ?? DEFAULT_NO_STATE_HOOKS.zones) {\n await walkScannableFiles(join(root, z), skipDirs, out);\n }\n return out.filter((p) => {\n const rel = relative(root, p);\n return !isTestFile(rel) && !isAllowedByGlob(rel, allowed);\n });\n },\n run: async ({ rootDir, config }) => {\n const c = config ?? {};\n const banned = c.banned ?? DEFAULT_NO_STATE_HOOKS.banned;\n if (banned.length === 0) return { ok: true, messages: [] };\n const skipDirs = new Set(c.skipDirs ?? DEFAULT_NO_STATE_HOOKS.skipDirs);\n const allowed = c.allowedFiles ?? DEFAULT_NO_STATE_HOOKS.allowedFiles;\n const regex = buildHookRegex(banned);\n const violations: string[] = [];\n for (const z of c.zones ?? DEFAULT_NO_STATE_HOOKS.zones) {\n const files: string[] = [];\n await walkScannableFiles(join(rootDir, z), skipDirs, files);\n for (const filePath of files) {\n const rel = relative(rootDir, filePath);\n if (isTestFile(rel) || isAllowedByGlob(rel, allowed)) continue;\n violations.push(...(await scanFileForHookCalls(filePath, rel, regex)));\n }\n }\n return { ok: violations.length === 0, messages: violations };\n },\n};\n\nasync function scanFileForHookCalls(\n filePath: string,\n rel: string,\n regex: RegExp\n): Promise<string[]> {\n const content = await Bun.file(filePath).text();\n const lines = content.split(\"\\n\");\n const out: string[] = [];\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? \"\";\n if (isCommentLine(line.trim())) continue;\n if (regex.test(line)) out.push(`${rel}:${i + 1}: ${line.trim()}`);\n }\n return out;\n}\n\n// ─────────────────────────────────────────────────────────────────\n// polly:typographic-quotes — opt-in straight-vs-curly enforcement\n// ─────────────────────────────────────────────────────────────────\n\ntype TypographicQuotesConfig = {\n /** Files matched by these globs must use typographic (curly) quotes. */\n typographicZone?: string[];\n /** Files matched by these globs must use straight quotes. */\n straightZone?: string[];\n zones?: string[];\n skipDirs?: string[];\n};\n\nconst STRAIGHT_PATTERN = /[\"']/;\nconst TYPOGRAPHIC_PATTERN = /[‘’“”]/;\n\nconst DEFAULT_TYPOGRAPHIC: Required<TypographicQuotesConfig> = {\n // Empty defaults: the rule is no-op until a consumer configures zones.\n typographicZone: [],\n straightZone: [],\n zones: [\"src\", \"tools\", \"cli\", \"scripts\"],\n skipDirs: SKIP_DIRS_DEFAULT,\n};\n\nfunction fileMatchesAnyGlob(rel: string, globs: string[]): boolean {\n for (const g of globs) {\n if (new Glob(g).match(rel)) return true;\n }\n return false;\n}\n\nconst typographicQuotes: Check<TypographicQuotesConfig | undefined> = {\n id: \"polly:typographic-quotes\",\n description:\n \"Enforce typographic quotes inside configured zones, straight quotes outside (opt-in)\",\n filesRead: async (cfg, root) => {\n const c = cfg ?? {};\n const skipDirs = new Set(c.skipDirs ?? DEFAULT_TYPOGRAPHIC.skipDirs);\n const out: string[] = [];\n for (const z of c.zones ?? DEFAULT_TYPOGRAPHIC.zones) {\n await walkScannableFiles(join(root, z), skipDirs, out);\n }\n return out;\n },\n run: async ({ rootDir, config }) => {\n const c = config ?? {};\n const tz = c.typographicZone ?? DEFAULT_TYPOGRAPHIC.typographicZone;\n const sz = c.straightZone ?? DEFAULT_TYPOGRAPHIC.straightZone;\n if (tz.length === 0 && sz.length === 0) return { ok: true, messages: [] };\n return runTypographicScan(rootDir, c, tz, sz);\n },\n};\n\nasync function scanFileForQuoteViolations(\n filePath: string,\n rel: string,\n inTypographicZone: boolean,\n inStraightZone: boolean\n): Promise<string[]> {\n const content = await Bun.file(filePath).text();\n const lines = content.split(\"\\n\");\n const out: string[] = [];\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? \"\";\n if (inTypographicZone && STRAIGHT_PATTERN.test(line)) {\n out.push(`${rel}:${i + 1}: straight quote in typographic zone — ${line.trim()}`);\n }\n if (inStraightZone && TYPOGRAPHIC_PATTERN.test(line)) {\n out.push(`${rel}:${i + 1}: typographic quote in straight zone — ${line.trim()}`);\n }\n }\n return out;\n}\n\nasync function runTypographicScan(\n rootDir: string,\n c: TypographicQuotesConfig,\n tz: string[],\n sz: string[]\n): Promise<{ ok: boolean; messages: string[] }> {\n const skipDirs = new Set(c.skipDirs ?? DEFAULT_TYPOGRAPHIC.skipDirs);\n const violations: string[] = [];\n for (const z of c.zones ?? DEFAULT_TYPOGRAPHIC.zones) {\n const files: string[] = [];\n await walkScannableFiles(join(rootDir, z), skipDirs, files);\n for (const filePath of files) {\n const rel = relative(rootDir, filePath);\n const inT = fileMatchesAnyGlob(rel, tz);\n const inS = fileMatchesAnyGlob(rel, sz);\n if (!inT && !inS) continue;\n violations.push(...(await scanFileForQuoteViolations(filePath, rel, inT, inS)));\n }\n }\n return { ok: violations.length === 0, messages: violations };\n}\n\nexport const extraCoreChecks: Check<unknown>[] = [\n forbiddenDeps as Check<unknown>,\n noStateHooks as Check<unknown>,\n typographicQuotes as Check<unknown>,\n];\n",
22
+ "/**\n * Import-graph checks for `pollyCorePlugin`:\n *\n * - polly:relative-imports — ban `../` imports beyond a depth threshold (#84)\n * - polly:tsconfig-paths — ban `compilerOptions.paths` aliases (#84)\n * - polly:no-raw-http — force HTTP through a canonical client (#86)\n * - polly:types — multi-package tsc --noEmit orchestrator (#85)\n *\n * All four are parameterised. Defaults are silent or zero-impact unless a\n * consumer opts in via `polly.config.ts`. Polly's own pre-commit pipeline\n * does not currently run these — they exist primarily for downstream\n * consumers (lingua, fairfox, warehouse-experiments) and ship under the\n * core plugin namespace so adoption is one config-block change away.\n */\n\nimport { readdir } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport { Glob } from \"bun\";\nimport type { Check } from \"../types\";\n\nconst SKIP_DIRS_DEFAULT = [\"node_modules\", \".git\", \"dist\", \".bun\", \".cache\"];\n\nfunction isCommentLine(trimmed: string): boolean {\n return trimmed.startsWith(\"//\") || trimmed.startsWith(\"*\") || trimmed.startsWith(\"/*\");\n}\n\nfunction isTestFile(rel: string): boolean {\n return (\n rel.includes(\"__tests__\") ||\n rel.includes(\".test.\") ||\n rel.includes(\".spec.\") ||\n rel.startsWith(\"tests/\")\n );\n}\n\nasync function walkScannableFiles(\n dir: string,\n skipDirs: Set<string>,\n out: string[]\n): Promise<void> {\n let entries: import(\"node:fs\").Dirent[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n if (!skipDirs.has(entry.name)) await walkScannableFiles(fullPath, skipDirs, out);\n } else if (entry.isFile() && (entry.name.endsWith(\".ts\") || entry.name.endsWith(\".tsx\"))) {\n out.push(fullPath);\n }\n }\n}\n\nfunction isAllowedByGlob(rel: string, globs: string[]): boolean {\n for (const g of globs) {\n if (new Glob(g).match(rel)) return true;\n }\n return false;\n}\n\nconst IMPORT_REGEX =\n /(?:import|export)\\s+.*?from\\s+['\"]([^'\"]+)['\"]|require\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g;\n\nfunction specifiersInLine(line: string): string[] {\n const out: string[] = [];\n IMPORT_REGEX.lastIndex = 0;\n let match = IMPORT_REGEX.exec(line);\n while (match !== null) {\n const s = match[1] || match[2];\n if (s) out.push(s);\n match = IMPORT_REGEX.exec(line);\n }\n return out;\n}\n\n// ─────────────────────────────────────────────────────────────────\n// polly:relative-imports — ban deep `../` imports\n// ─────────────────────────────────────────────────────────────────\n\ntype RelativeImportsConfig = {\n /** Maximum depth of `../` traversal allowed; default 1. */\n maxDepth?: number;\n allowedFiles?: string[];\n zones?: string[];\n skipDirs?: string[];\n};\n\nconst DEFAULT_RELATIVE: Required<RelativeImportsConfig> = {\n maxDepth: 1,\n allowedFiles: [],\n zones: [\"src\", \"tools\", \"cli\", \"scripts\"],\n skipDirs: SKIP_DIRS_DEFAULT,\n};\n\nfunction relativeDepth(specifier: string): number {\n if (!specifier.startsWith(\"..\")) return 0;\n let depth = 0;\n for (const segment of specifier.split(\"/\")) {\n if (segment === \"..\") depth++;\n else break;\n }\n return depth;\n}\n\nasync function scanFileForRelativeViolations(\n filePath: string,\n rel: string,\n maxDepth: number\n): Promise<string[]> {\n const content = await Bun.file(filePath).text();\n const lines = content.split(\"\\n\");\n const out: string[] = [];\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? \"\";\n if (isCommentLine(line.trim())) continue;\n for (const specifier of specifiersInLine(line)) {\n if (relativeDepth(specifier) > maxDepth) {\n out.push(`${rel}:${i + 1}: import \"${specifier}\" exceeds maxDepth ${maxDepth}`);\n }\n }\n }\n return out;\n}\n\nconst relativeImports: Check<RelativeImportsConfig | undefined> = {\n id: \"polly:relative-imports\",\n description: \"Ban `../` imports deeper than a configured threshold\",\n filesRead: async (cfg, root) => {\n const c = cfg ?? {};\n const skipDirs = new Set(c.skipDirs ?? DEFAULT_RELATIVE.skipDirs);\n const allowed = c.allowedFiles ?? DEFAULT_RELATIVE.allowedFiles;\n const out: string[] = [];\n for (const z of c.zones ?? DEFAULT_RELATIVE.zones) {\n await walkScannableFiles(join(root, z), skipDirs, out);\n }\n return out.filter((p) => {\n const rel = relative(root, p);\n return !isTestFile(rel) && !isAllowedByGlob(rel, allowed);\n });\n },\n run: async ({ rootDir, config }) => {\n const c = config ?? {};\n const maxDepth = c.maxDepth ?? DEFAULT_RELATIVE.maxDepth;\n const skipDirs = new Set(c.skipDirs ?? DEFAULT_RELATIVE.skipDirs);\n const allowed = c.allowedFiles ?? DEFAULT_RELATIVE.allowedFiles;\n const violations: string[] = [];\n for (const z of c.zones ?? DEFAULT_RELATIVE.zones) {\n const files: string[] = [];\n await walkScannableFiles(join(rootDir, z), skipDirs, files);\n for (const filePath of files) {\n const rel = relative(rootDir, filePath);\n if (isTestFile(rel) || isAllowedByGlob(rel, allowed)) continue;\n violations.push(...(await scanFileForRelativeViolations(filePath, rel, maxDepth)));\n }\n }\n return { ok: violations.length === 0, messages: violations };\n },\n};\n\n// ─────────────────────────────────────────────────────────────────\n// polly:tsconfig-paths — ban `compilerOptions.paths` aliases\n// ─────────────────────────────────────────────────────────────────\n\ntype TsconfigPathsConfig = {\n /** Filenames to scan; defaults to tsconfig.json variants. */\n files?: string[];\n /** Allowed alias patterns to keep (e.g. [\"@/*\"] for opt-in alias use). */\n allowedAliases?: string[];\n};\n\nconst DEFAULT_TSCONFIG_PATHS: Required<TsconfigPathsConfig> = {\n files: [\"tsconfig.json\", \"tsconfig.base.json\"],\n allowedAliases: [],\n};\n\nasync function findTsconfigs(rootDir: string, names: string[]): Promise<string[]> {\n const out: string[] = [];\n const skipDirs = new Set(SKIP_DIRS_DEFAULT);\n async function walk(dir: string): Promise<void> {\n let entries: import(\"node:fs\").Dirent[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n if (!skipDirs.has(entry.name)) await walk(fullPath);\n } else if (entry.isFile() && names.includes(entry.name)) {\n out.push(fullPath);\n }\n }\n }\n await walk(rootDir);\n return out;\n}\n\nconst tsconfigPaths: Check<TsconfigPathsConfig | undefined> = {\n id: \"polly:tsconfig-paths\",\n description: \"Flag `compilerOptions.paths` entries (use package.json subpath imports instead)\",\n filesRead: async (cfg, root) => findTsconfigs(root, cfg?.files ?? DEFAULT_TSCONFIG_PATHS.files),\n run: async ({ rootDir, config }) => {\n const c = config ?? {};\n const files = c.files ?? DEFAULT_TSCONFIG_PATHS.files;\n const allowed = new Set(c.allowedAliases ?? DEFAULT_TSCONFIG_PATHS.allowedAliases);\n const violations: string[] = [];\n for (const tsconfigPath of await findTsconfigs(rootDir, files)) {\n const raw = await Bun.file(tsconfigPath).text();\n const stripped = raw.replace(/\\/\\/[^\\n]*\\n/g, \"\\n\").replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\");\n let parsed: { compilerOptions?: { paths?: Record<string, unknown> } };\n try {\n parsed = JSON.parse(stripped) as unknown as {\n compilerOptions?: { paths?: Record<string, unknown> };\n };\n } catch {\n violations.push(`${relative(rootDir, tsconfigPath)}: failed to parse as JSON`);\n continue;\n }\n const paths = parsed.compilerOptions?.paths ?? {};\n for (const alias of Object.keys(paths)) {\n if (allowed.has(alias)) continue;\n violations.push(`${relative(rootDir, tsconfigPath)}: paths[\"${alias}\"] is set`);\n }\n }\n return { ok: violations.length === 0, messages: violations };\n },\n};\n\n// ─────────────────────────────────────────────────────────────────\n// polly:no-raw-http — force HTTP through a canonical client\n// ─────────────────────────────────────────────────────────────────\n\ntype NoRawHttpConfig = {\n /** Specifier for the canonical client (e.g. `#src/api/client`). Required. */\n canonicalClient?: string;\n banned?: string[];\n allowedFiles?: string[];\n zones?: string[];\n skipDirs?: string[];\n};\n\nconst DEFAULT_NO_RAW_HTTP: Omit<Required<NoRawHttpConfig>, \"canonicalClient\"> = {\n banned: [\"fetch\", \"XMLHttpRequest\", \"axios\"],\n allowedFiles: [],\n zones: [\"src\"],\n skipDirs: SKIP_DIRS_DEFAULT,\n};\n\nfunction buildBannedCallRegex(banned: string[]): RegExp {\n const alts = banned.map((s) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")).join(\"|\");\n // nosemgrep: javascript.lang.security.audit.detect-non-literal-regexp.detect-non-literal-regexp\n return new RegExp(`\\\\b(${alts})\\\\s*[\\\\(.]`);\n}\n\nasync function scanFileForRawHttp(\n filePath: string,\n rel: string,\n canonicalClient: string,\n bannedRegex: RegExp\n): Promise<string[]> {\n const content = await Bun.file(filePath).text();\n const lines = content.split(\"\\n\");\n const out: string[] = [];\n // The canonical-client implementation file legitimately uses the banned\n // identifiers — that's where the wrapping happens. We detect it\n // structurally by checking for an `export ... from \"<canonicalClient>\"`\n // re-export line. A simple substring test is enough; the canonical\n // client is a fixed module specifier the consumer configured, not an\n // arbitrary regex.\n const isCanonicalImpl = lines.some(\n (l) => l.includes(`from \"${canonicalClient}\"`) || l.includes(`from '${canonicalClient}'`)\n );\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? \"\";\n const trimmed = line.trim();\n if (isCommentLine(trimmed)) continue;\n if (bannedRegex.test(line) && !isCanonicalImpl) {\n out.push(`${rel}:${i + 1}: ${trimmed}`);\n }\n }\n return out;\n}\n\nconst noRawHttp: Check<NoRawHttpConfig | undefined> = {\n id: \"polly:no-raw-http\",\n description: \"Force HTTP calls through a configured canonical client (opt-in)\",\n filesRead: async (cfg, root) => {\n if (!cfg?.canonicalClient) return [];\n const skipDirs = new Set(cfg.skipDirs ?? DEFAULT_NO_RAW_HTTP.skipDirs);\n const allowed = cfg.allowedFiles ?? DEFAULT_NO_RAW_HTTP.allowedFiles;\n const out: string[] = [];\n for (const z of cfg.zones ?? DEFAULT_NO_RAW_HTTP.zones) {\n await walkScannableFiles(join(root, z), skipDirs, out);\n }\n return out.filter((p) => {\n const rel = relative(root, p);\n return !isTestFile(rel) && !isAllowedByGlob(rel, allowed);\n });\n },\n run: async ({ rootDir, config }) => {\n const c = config ?? {};\n if (!c.canonicalClient) {\n // No canonical client configured: rule is no-op. The umbrella's\n // \"fail loud\" stance applies when the user has half-configured it,\n // not when they haven't engaged with the rule at all.\n return { ok: true, messages: [] };\n }\n const banned = c.banned ?? DEFAULT_NO_RAW_HTTP.banned;\n const skipDirs = new Set(c.skipDirs ?? DEFAULT_NO_RAW_HTTP.skipDirs);\n const allowed = c.allowedFiles ?? DEFAULT_NO_RAW_HTTP.allowedFiles;\n const bannedRegex = buildBannedCallRegex(banned);\n const violations: string[] = [];\n for (const z of c.zones ?? DEFAULT_NO_RAW_HTTP.zones) {\n const files: string[] = [];\n await walkScannableFiles(join(rootDir, z), skipDirs, files);\n for (const filePath of files) {\n const rel = relative(rootDir, filePath);\n if (isTestFile(rel) || isAllowedByGlob(rel, allowed)) continue;\n violations.push(\n ...(await scanFileForRawHttp(filePath, rel, c.canonicalClient, bannedRegex))\n );\n }\n }\n return { ok: violations.length === 0, messages: violations };\n },\n};\n\n// ─────────────────────────────────────────────────────────────────\n// polly:types — multi-package tsc --noEmit orchestrator\n// ─────────────────────────────────────────────────────────────────\n\ntype TypesConfig = {\n /** Workspace globs to discover packages. */\n workspaces?: string[];\n /** Concurrency cap; defaults to os.cpus().length capped at workspace count. */\n concurrency?: number;\n};\n\nasync function runTscFor(\n packagePath: string,\n rootDir: string\n): Promise<{ ok: boolean; output: string }> {\n const proc = Bun.spawn([\"bunx\", \"tsc\", \"--noEmit\", \"-p\", packagePath], {\n cwd: rootDir,\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n const [stdout, stderr] = await Promise.all([\n new Response(proc.stdout).text(),\n new Response(proc.stderr).text(),\n ]);\n await proc.exited;\n return { ok: proc.exitCode === 0, output: `${stdout}${stderr}` };\n}\n\nasync function findWorkspaces(rootDir: string, patterns: string[]): Promise<string[]> {\n const out: string[] = [];\n for (const pattern of patterns) {\n const glob = new Glob(`${pattern}/tsconfig.json`);\n for await (const file of glob.scan({ cwd: rootDir, absolute: true })) {\n // Trim the trailing /tsconfig.json to get the package directory.\n out.push(file.replace(/\\/tsconfig\\.json$/, \"\"));\n }\n }\n return [...new Set(out)];\n}\n\nconst types: Check<TypesConfig | undefined> = {\n id: \"polly:types\",\n description: \"Run `tsc --noEmit` against each workspace package in parallel\",\n filesRead: async () => {\n // The TypeScript compiler walks the entire dependency graph from\n // tsconfig.json out, which is far wider than what we can easily\n // declare here. We keep filesRead empty so the cache always misses\n // for this check; tsc has its own incremental cache and that is the\n // right place for that complexity to live.\n return [];\n },\n run: async ({ rootDir, config }) => {\n const patterns = (config ?? {}).workspaces ?? [\"packages/*\", \".\"];\n const packages = await findWorkspaces(rootDir, patterns);\n if (packages.length === 0) return { ok: true, messages: [\"no workspace packages found\"] };\n const results = await Promise.all(packages.map((p) => runTscFor(p, rootDir)));\n return aggregateTypesResults(packages, results, rootDir);\n },\n};\n\nfunction appendTscFailure(messages: string[], relPkg: string, output: string): void {\n messages.push(`${relPkg}: tsc --noEmit failed`);\n const trimmed = output.trim();\n if (!trimmed) return;\n for (const ln of trimmed.split(\"\\n\").slice(0, 30)) messages.push(` ${ln}`);\n}\n\nfunction aggregateTypesResults(\n packages: string[],\n results: Array<{ ok: boolean; output: string }>,\n rootDir: string\n): { ok: boolean; messages: string[] } {\n const messages: string[] = [];\n let ok = true;\n for (let i = 0; i < packages.length; i++) {\n const pkg = packages[i];\n const r = results[i];\n if (!pkg || !r || r.ok) continue;\n ok = false;\n appendTscFailure(messages, relative(rootDir, pkg) || \".\", r.output);\n }\n return { ok, messages };\n}\n\nexport const importCoreChecks: Check<unknown>[] = [\n relativeImports as Check<unknown>,\n tsconfigPaths as Check<unknown>,\n noRawHttp as Check<unknown>,\n types as Check<unknown>,\n];\n",
23
+ "/**\n * `pollyUiPlugin` — the polly-ui-provided plugin (#89, #90, #91–#94).\n *\n * Re-homes the CSS conformance family and shared-components ban under a\n * dedicated `polly-ui` namespace, and adds a new `no-inline-handlers`\n * check for JSX event handlers. Every wrap reuses the underlying\n * function from `tools/quality/src/css/*` and\n * `tools/quality/src/check-shared-components.ts` so behaviour is\n * identical to the pre-host invocation; only the integration surface\n * changes.\n *\n * Out of scope for this release:\n * - The data-action dispatcher *runtime* described in #90. The check\n * ships here so a project can ban inline handlers today; the\n * dispatcher needs a real Preact implementation that mounts near\n * <OverlayRoot> and registers a delegated event listener, and that\n * work belongs in `src/polly-ui/actions.tsx` rather than under the\n * quality plugin host. The check on its own is useful — it forces\n * the consumer to pick an alternative — and the runtime can land\n * in a follow-up release without changing the check's id.\n * - Registry-driven CSS validation. The four CSS checks currently\n * parse polly-ui's CSS at scan time. The new\n * `@fairfox/polly/ui/registry` (introduced alongside this plugin)\n * exposes the canonical token + component lists as data, and a\n * follow-up can swap the parse-time discovery for a registry\n * lookup. The shape of the wraps does not change when that\n * happens; only the inner implementation does.\n */\n\nimport { readdir } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport { Glob } from \"bun\";\nimport { checkSharedComponents } from \"../check-shared-components\";\nimport { checkCssLayout } from \"../css/check-layout\";\nimport { checkCssQuality } from \"../css/check-quality\";\nimport { checkCssUnused } from \"../css/check-unused\";\nimport { checkCssVars } from \"../css/check-vars\";\nimport type { Check, QualityPlugin } from \"../types\";\n\nconst SKIP_DIRS_DEFAULT = [\"node_modules\", \".git\", \"dist\", \".bun\", \".cache\"];\n\nfunction isCommentLine(trimmed: string): boolean {\n return trimmed.startsWith(\"//\") || trimmed.startsWith(\"*\") || trimmed.startsWith(\"/*\");\n}\n\nfunction isAllowedByGlob(rel: string, globs: string[]): boolean {\n for (const g of globs) {\n if (new Glob(g).match(rel)) return true;\n }\n return false;\n}\n\nasync function walkScannableFiles(\n dir: string,\n skipDirs: Set<string>,\n exts: string[],\n out: string[]\n): Promise<void> {\n let entries: import(\"node:fs\").Dirent[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n if (!skipDirs.has(entry.name)) await walkScannableFiles(fullPath, skipDirs, exts, out);\n } else if (entry.isFile() && exts.some((e) => entry.name.endsWith(e))) {\n out.push(fullPath);\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────────\n// polly-ui:css-layout (#91)\n// ─────────────────────────────────────────────────────────────────\n\ntype CssCheckConfig = {\n rootDir?: string;\n skipDirs?: string[];\n};\n\nconst cssLayout: Check<CssCheckConfig | undefined> = {\n id: \"polly-ui:css-layout\",\n description: \"Enforce that layout values come from the <Layout> primitive, not ad-hoc CSS\",\n run: async ({ rootDir, config }) => {\n const r = await checkCssLayout({\n rootDir,\n ...(config?.skipDirs ? { skipDirs: config.skipDirs } : {}),\n });\n return {\n ok: r.violations.length === 0,\n messages: r.violations.map((v) => `${v.file}:${v.line}: ${v.rule}`),\n };\n },\n};\n\nconst cssQuality: Check<CssCheckConfig | undefined> = {\n id: \"polly-ui:css-quality\",\n description: \"Enforce that styled values come from semantic tokens, not literals\",\n run: async ({ rootDir, config }) => {\n const r = await checkCssQuality({\n rootDir,\n ...(config?.skipDirs ? { skipDirs: config.skipDirs } : {}),\n });\n return {\n ok: r.violations.length === 0,\n messages: r.violations.map((v) => `${v.file}:${v.line}: ${v.rule}`),\n };\n },\n};\n\nconst cssVars: Check<CssCheckConfig | undefined> = {\n id: \"polly-ui:css-vars\",\n description: \"Flag `var(--name)` references that resolve to no `--name:` definition\",\n run: async ({ rootDir, config }) => {\n const r = await checkCssVars({\n rootDir,\n ...(config?.skipDirs ? { skipDirs: config.skipDirs } : {}),\n });\n return {\n ok: r.violations.length === 0,\n messages: r.violations.map((v) => `${v.file}:${v.line}: ${v.rule}`),\n };\n },\n};\n\nconst cssUnused: Check<CssCheckConfig | undefined> = {\n id: \"polly-ui:css-unused\",\n description: \"Surface CSS-module selectors that are never referenced from JS/TSX (advisory)\",\n run: async ({ rootDir, config }) => {\n const r = await checkCssUnused({\n rootDir,\n ...(config?.skipDirs ? { skipDirs: config.skipDirs } : {}),\n });\n return {\n // Advisory: never fails the run, just reports.\n ok: true,\n messages: r.violations.map((v) => `${v.file}:${v.line}: ${v.rule}`),\n };\n },\n};\n\n// ─────────────────────────────────────────────────────────────────\n// polly-ui:shared-components (#92)\n// ─────────────────────────────────────────────────────────────────\n\ntype SharedComponentsConfig = {\n scanRoot?: string;\n skipDirs?: string[];\n exemptPackages?: string[];\n};\n\nconst sharedComponents: Check<SharedComponentsConfig | undefined> = {\n id: \"polly-ui:shared-components\",\n description:\n \"Ban native interactive HTML elements; require the polly-ui primitive (<Button>, <Modal>, etc.)\",\n run: async ({ rootDir, config }) => {\n const c = config ?? {};\n const r = await checkSharedComponents({\n root: rootDir,\n ...(c.scanRoot ? { scanRoot: c.scanRoot } : {}),\n ...(c.skipDirs ? { skipDirs: new Set(c.skipDirs) } : {}),\n ...(c.exemptPackages ? { exemptPackages: new Set(c.exemptPackages) } : {}),\n });\n return {\n ok: r.violations.length === 0,\n messages: r.violations.map(\n (v) => `${v.file}:${v.line}: ${v.element} → ${v.replacement} — ${v.content}`\n ),\n };\n },\n};\n\n// ─────────────────────────────────────────────────────────────────\n// polly-ui:no-inline-handlers (#90, check-only — runtime is a follow-up)\n// ─────────────────────────────────────────────────────────────────\n\ntype NoInlineHandlersConfig = {\n banned?: string[];\n allowedFiles?: string[];\n zones?: string[];\n skipDirs?: string[];\n};\n\nconst DEFAULT_NO_INLINE_HANDLERS: Required<NoInlineHandlersConfig> = {\n banned: [\n \"onClick\",\n \"onSubmit\",\n \"onChange\",\n \"onInput\",\n \"onFocus\",\n \"onBlur\",\n \"onKeyDown\",\n \"onKeyUp\",\n \"onMouseDown\",\n \"onMouseUp\",\n \"onMouseEnter\",\n \"onMouseLeave\",\n ],\n allowedFiles: [],\n zones: [\"src\"],\n skipDirs: SKIP_DIRS_DEFAULT,\n};\n\nfunction escapeRegex(name: string): string {\n return name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction buildHandlerRegex(banned: string[]): RegExp {\n const alts = banned.map(escapeRegex).join(\"|\");\n // Match `onClick={…}` and `onClick=\"…\"` and `onClick='…'` opening forms.\n // nosemgrep: javascript.lang.security.audit.detect-non-literal-regexp.detect-non-literal-regexp\n return new RegExp(`\\\\b(${alts})\\\\s*=\\\\s*\\\\{`);\n}\n\nfunction isTestFile(rel: string): boolean {\n return (\n rel.includes(\"__tests__\") ||\n rel.includes(\".test.\") ||\n rel.includes(\".spec.\") ||\n rel.startsWith(\"tests/\")\n );\n}\n\nasync function scanFileForInlineHandlers(\n filePath: string,\n rel: string,\n regex: RegExp\n): Promise<string[]> {\n const content = await Bun.file(filePath).text();\n const lines = content.split(\"\\n\");\n const out: string[] = [];\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? \"\";\n if (isCommentLine(line.trim())) continue;\n if (regex.test(line)) {\n out.push(`${rel}:${i + 1}: ${line.trim()}`);\n }\n }\n return out;\n}\n\nconst noInlineHandlers: Check<NoInlineHandlersConfig | undefined> = {\n id: \"polly-ui:no-inline-handlers\",\n description:\n \"Ban inline JSX event handlers (use data-action delegation instead — see polly-ui actions runtime)\",\n filesRead: async (cfg, root) => {\n const c = cfg ?? {};\n const skipDirs = new Set(c.skipDirs ?? DEFAULT_NO_INLINE_HANDLERS.skipDirs);\n const allowed = c.allowedFiles ?? DEFAULT_NO_INLINE_HANDLERS.allowedFiles;\n const out: string[] = [];\n for (const z of c.zones ?? DEFAULT_NO_INLINE_HANDLERS.zones) {\n await walkScannableFiles(join(root, z), skipDirs, [\".tsx\"], out);\n }\n return out.filter((p) => {\n const rel = relative(root, p);\n return !isTestFile(rel) && !isAllowedByGlob(rel, allowed);\n });\n },\n run: async ({ rootDir, config }) => {\n const c = config ?? {};\n const banned = c.banned ?? DEFAULT_NO_INLINE_HANDLERS.banned;\n if (banned.length === 0) return { ok: true, messages: [] };\n const skipDirs = new Set(c.skipDirs ?? DEFAULT_NO_INLINE_HANDLERS.skipDirs);\n const allowed = c.allowedFiles ?? DEFAULT_NO_INLINE_HANDLERS.allowedFiles;\n const regex = buildHandlerRegex(banned);\n const violations: string[] = [];\n for (const z of c.zones ?? DEFAULT_NO_INLINE_HANDLERS.zones) {\n const files: string[] = [];\n await walkScannableFiles(join(rootDir, z), skipDirs, [\".tsx\"], files);\n for (const filePath of files) {\n const rel = relative(rootDir, filePath);\n if (isTestFile(rel) || isAllowedByGlob(rel, allowed)) continue;\n violations.push(...(await scanFileForInlineHandlers(filePath, rel, regex)));\n }\n }\n return { ok: violations.length === 0, messages: violations };\n },\n};\n\n// ─────────────────────────────────────────────────────────────────\n\nexport const POLLY_UI_PLUGIN_VERSION = \"0.46.0\";\n\nexport const pollyUiPlugin: QualityPlugin = {\n name: \"polly-ui\",\n version: POLLY_UI_PLUGIN_VERSION,\n checks: [\n cssLayout as Check<unknown>,\n cssQuality as Check<unknown>,\n cssVars as Check<unknown>,\n cssUnused as Check<unknown>,\n sharedComponents as Check<unknown>,\n noInlineHandlers as Check<unknown>,\n ],\n};\n",
24
+ "#!/usr/bin/env bun\n\n/**\n * CLI entry point for Polly quality checks.\n *\n * Plugin-host subcommands (preferred):\n * polly quality list # list registered checks\n * polly quality run # run every registered check\n * polly quality run polly:no-as-casting # run a specific id (or several)\n * polly quality run all # alias for `run`\n *\n * Legacy subcommands (back-compat with the pre-host CLI):\n * polly quality no-as-casting # only the TS casting check\n * polly quality no-require # ban require(...) calls\n * polly quality css # all CSS checks\n * polly quality css-quality # only hardcoded-values check\n * polly quality css-layout # only Layout-usage check\n * polly quality css-vars # only undefined-variable check\n * polly quality css-unused # only unused-selector check (advisory)\n *\n * Shared flags:\n * --root <dir> # defaults to process.cwd()\n * --config <path> # explicit polly.config.ts path\n * --no-cache # bypass the on-disk cache\n * --exclude <a,b,c> # legacy: comma-separated dir names\n * --exclude-packages <a,b> # legacy: no-as-casting only\n * --exclude-files <a,b> # legacy: no-as-casting only\n * --pattern <glob> # legacy: no-as-casting / no-require\n */\n\nimport {\n checkCssLayout,\n checkCssQuality,\n checkCssUnused,\n checkCssVars,\n checkNoAsCasting,\n checkNoRequire,\n listChecks,\n loadQualityConfig,\n registerPlugins,\n runAttest,\n runChecks,\n validateRunConfig,\n} from \"./index\";\nimport { logger } from \"./logger\";\n\nconst args = process.argv.slice(2);\n\nfunction getFlag(name: string): string | undefined {\n const idx = args.indexOf(`--${name}`);\n return idx >= 0 ? args[idx + 1] : undefined;\n}\n\nfunction getSubcommand(): string {\n for (const arg of args) {\n if (!arg.startsWith(\"--\")) return arg;\n }\n return \"all\";\n}\n\nconst subcommand = getSubcommand();\nconst rootDir = getFlag(\"root\") ?? process.cwd();\nconst exclude = getFlag(\"exclude\")?.split(\",\") ?? [\n \"node_modules\",\n \"dist\",\n \".git\",\n \".bun\",\n \"dist-test\",\n \"build\",\n \"coverage\",\n];\nconst excludePackages = getFlag(\"exclude-packages\")?.split(\",\");\nconst excludeFiles = getFlag(\"exclude-files\")?.split(\",\");\nconst filePatterns = getFlag(\"pattern\");\n\nasync function runNoAsCasting(): Promise<number> {\n const result = await checkNoAsCasting({\n rootDir,\n exclude,\n ...(excludePackages ? { excludePackages } : {}),\n ...(excludeFiles ? { excludeFiles } : {}),\n ...(filePatterns ? { filePatterns } : {}),\n });\n result.print();\n return result.violations.length > 0 ? 1 : 0;\n}\n\nasync function runNoRequire(): Promise<number> {\n const result = await checkNoRequire({\n rootDir,\n exclude,\n ...(filePatterns ? { filePatterns } : {}),\n });\n result.print();\n return result.violations.length > 0 ? 1 : 0;\n}\n\nasync function runCssQuality(): Promise<number> {\n const r = await checkCssQuality({ rootDir, skipDirs: exclude });\n r.print();\n return r.violations.length > 0 ? 1 : 0;\n}\n\nasync function runCssLayout(): Promise<number> {\n const r = await checkCssLayout({ rootDir, skipDirs: exclude });\n r.print();\n return r.violations.length > 0 ? 1 : 0;\n}\n\nasync function runCssVars(): Promise<number> {\n const r = await checkCssVars({ rootDir, skipDirs: exclude });\n r.print();\n return r.violations.length > 0 ? 1 : 0;\n}\n\nasync function runCssUnused(): Promise<number> {\n const r = await checkCssUnused({ rootDir, skipDirs: exclude });\n r.print();\n return 0;\n}\n\nasync function runCssAll(): Promise<number> {\n const results = [\n await runCssQuality(),\n await runCssLayout(),\n await runCssVars(),\n await runCssUnused(),\n ];\n return results.some((code) => code !== 0) ? 1 : 0;\n}\n\nasync function runAll(): Promise<number> {\n const results = [await runNoAsCasting(), await runNoRequire(), await runCssAll()];\n return results.some((code) => code !== 0) ? 1 : 0;\n}\n\nasync function runHostList(): Promise<number> {\n const config = await loadQualityConfig(rootDir, getFlag(\"config\"));\n const registry = registerPlugins(config.plugins);\n for (const c of listChecks(registry)) {\n logger.log(` ${c.id.padEnd(40)} ${c.description}`);\n }\n return 0;\n}\n\nconst VALUE_FLAGS = new Set([\n \"root\",\n \"config\",\n \"exclude\",\n \"exclude-packages\",\n \"exclude-files\",\n \"pattern\",\n]);\n\nfunction collectRunPositionals(): string[] {\n // Positional args after the `run` subcommand are the requested ids.\n const runIdx = args.indexOf(\"run\");\n const out: string[] = [];\n for (let i = runIdx + 1; i < args.length; i++) {\n const a = args[i];\n if (!a) continue;\n if (a.startsWith(\"--\")) {\n if (VALUE_FLAGS.has(a.slice(2))) i++;\n continue;\n }\n out.push(a);\n }\n return out;\n}\n\nfunction reportRunResult(r: {\n id: string;\n ok: boolean;\n cached: boolean;\n durationMs: number;\n messages: string[];\n error?: string;\n}): void {\n const tag = r.cached ? \"cached \" : \" \";\n if (r.ok) {\n logger.log(` ✓ ${tag}${r.id} (${r.durationMs}ms)`);\n return;\n }\n logger.log(` ✗ ${tag}${r.id} (${r.durationMs}ms)`);\n if (r.error) logger.error(` error: ${r.error}`);\n for (const m of r.messages) logger.log(` ${m}`);\n}\n\nasync function runHostAttest(): Promise<number> {\n const config = await loadQualityConfig(rootDir, getFlag(\"config\"));\n const registry = registerPlugins(config.plugins);\n const validationErrors = validateRunConfig(registry, config);\n if (validationErrors.length > 0) {\n for (const err of validationErrors) logger.error(err);\n return 2;\n }\n const positional = collectAttestPositionals();\n const deploy = positional[0] === \"deploy\";\n const result = await runAttest({\n rootDir,\n registry,\n runConfig: config,\n deploy,\n });\n if (result.error) {\n logger.error(result.error);\n for (const m of result.messages) logger.log(` ${m}`);\n return 1;\n }\n for (const m of result.messages) logger.log(m);\n return 0;\n}\n\nfunction collectAttestPositionals(): string[] {\n const idx = args.indexOf(\"attest\");\n const out: string[] = [];\n for (let i = idx + 1; i < args.length; i++) {\n const a = args[i];\n if (!a) continue;\n if (a.startsWith(\"--\")) {\n if (VALUE_FLAGS.has(a.slice(2))) i++;\n continue;\n }\n out.push(a);\n }\n return out;\n}\n\nasync function runHostRun(): Promise<number> {\n const config = await loadQualityConfig(rootDir, getFlag(\"config\"));\n const registry = registerPlugins(config.plugins);\n const validationErrors = validateRunConfig(registry, config);\n if (validationErrors.length > 0) {\n for (const err of validationErrors) logger.error(err);\n return 2;\n }\n const positional = collectRunPositionals();\n const ids =\n positional.length === 0 || (positional.length === 1 && positional[0] === \"all\")\n ? undefined\n : positional;\n const report = await runChecks(registry, config, ids, {\n rootDir,\n noCache: args.includes(\"--no-cache\"),\n });\n for (const r of report.results) reportRunResult(r);\n return report.ok ? 0 : 1;\n}\n\nlet exitCode = 0;\nswitch (subcommand) {\n case \"list\":\n exitCode = await runHostList();\n break;\n case \"run\":\n exitCode = await runHostRun();\n break;\n case \"attest\":\n exitCode = await runHostAttest();\n break;\n case \"no-as-casting\":\n exitCode = await runNoAsCasting();\n break;\n case \"no-require\":\n exitCode = await runNoRequire();\n break;\n case \"css\":\n exitCode = await runCssAll();\n break;\n case \"css-quality\":\n exitCode = await runCssQuality();\n break;\n case \"css-layout\":\n exitCode = await runCssLayout();\n break;\n case \"css-vars\":\n exitCode = await runCssVars();\n break;\n case \"css-unused\":\n exitCode = await runCssUnused();\n break;\n case \"all\":\n exitCode = await runAll();\n break;\n default:\n logger.error(`Unknown quality subcommand: ${subcommand}`);\n logger.error(\n \"Expected one of: list, run, attest, no-as-casting, no-require, css, css-quality, css-layout, css-vars, css-unused\"\n );\n exitCode = 2;\n}\n\nprocess.exit(exitCode);\n"
16
25
  ],
17
- "mappings": "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",
18
- "debugId": "886844E82815890D64756E2164756E21",
26
+ "mappings": "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",
27
+ "debugId": "AB9249A5A8AE0E9164756E2164756E21",
19
28
  "names": []
20
29
  }