sickbay 1.16.0 → 1.16.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/README.md +1 -1
  2. package/dist/DiffApp-DeNEtlY7.js +181 -0
  3. package/dist/DiffApp-DeNEtlY7.js.map +1 -0
  4. package/dist/DoctorApp-CaiqnhHH.js +415 -0
  5. package/dist/DoctorApp-CaiqnhHH.js.map +1 -0
  6. package/dist/FixApp-MWXohP60.js +337 -0
  7. package/dist/FixApp-MWXohP60.js.map +1 -0
  8. package/dist/StatsApp-BC4P4hII.js +372 -0
  9. package/dist/StatsApp-BC4P4hII.js.map +1 -0
  10. package/dist/TrendApp-DOBt7ITA.js +127 -0
  11. package/dist/TrendApp-DOBt7ITA.js.map +1 -0
  12. package/dist/TuiApp-D4Wn81Qv.js +1042 -0
  13. package/dist/TuiApp-D4Wn81Qv.js.map +1 -0
  14. package/dist/ai-DxA5r3hA.js +69 -0
  15. package/dist/ai-DxA5r3hA.js.map +1 -0
  16. package/dist/badge-DB3y0fWt.js +37 -0
  17. package/dist/badge-DB3y0fWt.js.map +1 -0
  18. package/dist/{claude-SN6IVGBI.js → claude-C5dUtWBJ.js} +13 -12
  19. package/dist/claude-C5dUtWBJ.js.map +1 -0
  20. package/dist/config.d.ts +27 -1
  21. package/dist/config.d.ts.map +1 -0
  22. package/dist/config.js +2 -6
  23. package/dist/dist-Bjhxbcak.js +5431 -0
  24. package/dist/dist-Bjhxbcak.js.map +1 -0
  25. package/dist/history-DVegAwFp.js +83 -0
  26. package/dist/history-DVegAwFp.js.map +1 -0
  27. package/dist/index.d.ts +1 -1
  28. package/dist/index.js +692 -564
  29. package/dist/index.js.map +1 -0
  30. package/dist/init-Dn7eDMEp.js +199 -0
  31. package/dist/init-Dn7eDMEp.js.map +1 -0
  32. package/dist/resolve-package-DS27JBhN.js +60 -0
  33. package/dist/resolve-package-DS27JBhN.js.map +1 -0
  34. package/dist/rolldown-runtime-CiIaOW0V.js +13 -0
  35. package/dist/trend-D-Hufthb.js +45 -0
  36. package/dist/trend-D-Hufthb.js.map +1 -0
  37. package/dist/update-check-C7bNNfvf.js +58 -0
  38. package/dist/update-check-C7bNNfvf.js.map +1 -0
  39. package/dist/web-D5etye5Q.js +259 -0
  40. package/dist/web-D5etye5Q.js.map +1 -0
  41. package/package.json +6 -5
  42. package/dist/DiffApp-ASQWWDLS.js +0 -172
  43. package/dist/DoctorApp-SMIZDD64.js +0 -440
  44. package/dist/FixApp-63PU5VF7.js +0 -351
  45. package/dist/StatsApp-CFZBEITZ.js +0 -356
  46. package/dist/TrendApp-BKGRSP6Q.js +0 -106
  47. package/dist/TuiApp-K7KP35RC.js +0 -980
  48. package/dist/ai-7DGOLNJX.js +0 -64
  49. package/dist/badge-KQ73KEIN.js +0 -41
  50. package/dist/chunk-352RAVRZ.js +0 -19
  51. package/dist/chunk-3OR2GFVE.js +0 -90
  52. package/dist/chunk-DJA6K3MN.js +0 -5564
  53. package/dist/chunk-LZOEMCE7.js +0 -62
  54. package/dist/chunk-MBVA75EM.js +0 -19
  55. package/dist/chunk-SHO3ZXTH.js +0 -23
  56. package/dist/chunk-TWCTPAXQ.js +0 -73
  57. package/dist/chunk-VBM6NZAY.js +0 -60
  58. package/dist/dist-LQY3FYCP.js +0 -64
  59. package/dist/history-XLNVZEDI.js +0 -14
  60. package/dist/init-DD2HOQE2.js +0 -217
  61. package/dist/resolve-package-774YTW5Q.js +0 -9
  62. package/dist/update-check-M7IFOMLJ.js +0 -12
  63. package/dist/web-2KWCYTW4.js +0 -269
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dist-Bjhxbcak.js","names":[],"sources":["../../../packages/core/dist/index.js"],"sourcesContent":["import { existsSync, readFileSync, readdirSync, statSync, unlinkSync } from \"fs\";\nimport { basename, dirname, extname, join, relative, resolve, sep } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { execa } from \"execa\";\nimport picomatch from \"picomatch\";\nimport { tmpdir } from \"os\";\nimport { globby } from \"globby\";\n//#region src/advisors/base.ts\nvar BaseAdvisor = class {\n\tisApplicableToContext(context) {\n\t\tif (this.frameworks.length === 0) return true;\n\t\treturn this.frameworks.some((f) => context.frameworks.includes(f));\n\t}\n};\n//#endregion\n//#region src/advisors/angular-best-practices.ts\nconst TS_EXTENSIONS = new Set([\".ts\"]);\nvar AngularBestPracticesAdvisor = class extends BaseAdvisor {\n\tname = \"angular-best-practices\";\n\tframeworks = [\"angular\"];\n\tasync run(projectPath, _context) {\n\t\tconst recommendations = [];\n\t\ttry {\n\t\t\tconst pkg = JSON.parse(readFileSync(join(projectPath, \"package.json\"), \"utf-8\"));\n\t\t\tconst allDeps = {\n\t\t\t\t...pkg.dependencies,\n\t\t\t\t...pkg.devDependencies\n\t\t\t};\n\t\t\tconst files = scanTsFiles(join(projectPath, \"src\"));\n\t\t\tthis.checkStandaloneComponents(files, recommendations);\n\t\t\tthis.checkSignalInputs(files, recommendations);\n\t\t\tthis.checkLegacyControlFlow(files, recommendations);\n\t\t\tthis.checkSsrHydration(allDeps, files, recommendations);\n\t\t\tthis.checkLegacyHttpModule(files, recommendations);\n\t\t} catch {}\n\t\treturn recommendations;\n\t}\n\tcheckStandaloneComponents(files, recommendations) {\n\t\ttry {\n\t\t\tif (files.some((f) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst content = readFileSync(f, \"utf-8\");\n\t\t\t\t\treturn content.includes(\"@NgModule\") && content.includes(\"declarations\");\n\t\t\t\t} catch {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t})) recommendations.push({\n\t\t\t\tid: \"angular-standalone-components\",\n\t\t\t\tframework: \"angular\",\n\t\t\t\ttitle: \"Migrate to Standalone Components\",\n\t\t\t\tmessage: \"NgModule with declarations detected. Standalone components reduce boilerplate and improve tree-shaking. Angular recommends standalone as the default for new components.\",\n\t\t\t\tseverity: \"suggest\",\n\t\t\t\tlearnMoreUrl: \"https://angular.dev/guide/components/importing\"\n\t\t\t});\n\t\t} catch {}\n\t}\n\tcheckSignalInputs(files, recommendations) {\n\t\ttry {\n\t\t\tif (files.some((f) => {\n\t\t\t\ttry {\n\t\t\t\t\treturn readFileSync(f, \"utf-8\").includes(\"@Input(\");\n\t\t\t\t} catch {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t})) recommendations.push({\n\t\t\t\tid: \"angular-signal-inputs\",\n\t\t\t\tframework: \"angular\",\n\t\t\t\ttitle: \"Adopt Signal-Based Inputs\",\n\t\t\t\tmessage: \"Using @Input() decorator. Signal-based inputs (input() / input.required()) provide better type safety, automatic change tracking, and work seamlessly with Angular signals.\",\n\t\t\t\tseverity: \"suggest\",\n\t\t\t\tlearnMoreUrl: \"https://angular.dev/guide/signals/inputs\"\n\t\t\t});\n\t\t} catch {}\n\t}\n\tcheckLegacyControlFlow(files, recommendations) {\n\t\ttry {\n\t\t\tif (files.some((f) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst content = readFileSync(f, \"utf-8\");\n\t\t\t\t\treturn content.includes(\"*ngIf\") || content.includes(\"*ngFor\") || content.includes(\"*ngSwitch\");\n\t\t\t\t} catch {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t})) recommendations.push({\n\t\t\t\tid: \"angular-control-flow\",\n\t\t\t\tframework: \"angular\",\n\t\t\t\ttitle: \"Migrate to Built-in Control Flow\",\n\t\t\t\tmessage: \"Using *ngIf/*ngFor directives. Angular 17+ built-in control flow (@if, @for, @switch) is faster, requires no imports, and supports type narrowing.\",\n\t\t\t\tseverity: \"suggest\",\n\t\t\t\tlearnMoreUrl: \"https://angular.dev/guide/templates/control-flow\"\n\t\t\t});\n\t\t} catch {}\n\t}\n\tcheckSsrHydration(allDeps, files, recommendations) {\n\t\ttry {\n\t\t\tconst hasSsr = \"@angular/ssr\" in allDeps;\n\t\t\tconst hasHydration = files.some((f) => {\n\t\t\t\ttry {\n\t\t\t\t\treturn readFileSync(f, \"utf-8\").includes(\"provideClientHydration\");\n\t\t\t\t} catch {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (!hasSsr && !hasHydration) recommendations.push({\n\t\t\t\tid: \"angular-ssr\",\n\t\t\t\tframework: \"angular\",\n\t\t\t\ttitle: \"Consider Server-Side Rendering\",\n\t\t\t\tmessage: \"No SSR setup detected. Angular SSR with hydration improves initial load performance and SEO. Add @angular/ssr to enable server-side rendering.\",\n\t\t\t\tseverity: \"suggest\",\n\t\t\t\tlearnMoreUrl: \"https://angular.dev/guide/ssr\"\n\t\t\t});\n\t\t} catch {}\n\t}\n\tcheckLegacyHttpModule(files, recommendations) {\n\t\ttry {\n\t\t\tif (files.some((f) => {\n\t\t\t\ttry {\n\t\t\t\t\treturn readFileSync(f, \"utf-8\").includes(\"HttpClientModule\");\n\t\t\t\t} catch {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t})) recommendations.push({\n\t\t\t\tid: \"angular-http-client\",\n\t\t\t\tframework: \"angular\",\n\t\t\t\ttitle: \"Migrate to provideHttpClient()\",\n\t\t\t\tmessage: \"Using HttpClientModule import. The functional provideHttpClient() API (Angular 15+) is tree-shakeable and supports features like interceptors as functions.\",\n\t\t\t\tseverity: \"suggest\",\n\t\t\t\tlearnMoreUrl: \"https://angular.dev/guide/http/setup\"\n\t\t\t});\n\t\t} catch {}\n\t}\n};\nfunction scanTsFiles(dir) {\n\tconst files = [];\n\ttry {\n\t\tif (!existsSync(dir)) return files;\n\t\tfor (const entry of readdirSync(dir)) {\n\t\t\tif (entry.startsWith(\".\") || entry === \"node_modules\") continue;\n\t\t\tconst fullPath = join(dir, entry);\n\t\t\tif (statSync(fullPath).isDirectory()) files.push(...scanTsFiles(fullPath));\n\t\t\telse if (TS_EXTENSIONS.has(extname(entry))) files.push(fullPath);\n\t\t}\n\t} catch {}\n\treturn files;\n}\n//#endregion\n//#region src/advisors/next-best-practices.ts\nconst NEXT_CONFIG_FILES = [\n\t\"next.config.js\",\n\t\"next.config.mjs\",\n\t\"next.config.ts\"\n];\nvar NextBestPracticesAdvisor = class extends BaseAdvisor {\n\tname = \"next-best-practices\";\n\tframeworks = [\"next\"];\n\tasync run(projectPath, _context) {\n\t\tconst recommendations = [];\n\t\ttry {\n\t\t\tconst pkg = JSON.parse(readFileSync(join(projectPath, \"package.json\"), \"utf-8\"));\n\t\t\tconst allDeps = {\n\t\t\t\t...pkg.dependencies,\n\t\t\t\t...pkg.devDependencies\n\t\t\t};\n\t\t\tthis.checkPagesRouter(projectPath, recommendations);\n\t\t\tthis.checkTurbopack(pkg.scripts ?? {}, recommendations);\n\t\t\tthis.checkMetadataApi(projectPath, recommendations);\n\t\t\tthis.checkThirdParties(projectPath, allDeps, recommendations);\n\t\t\tthis.checkStrictMode(projectPath, recommendations);\n\t\t} catch {}\n\t\treturn recommendations;\n\t}\n\tcheckPagesRouter(projectPath, recommendations) {\n\t\ttry {\n\t\t\tif (existsSync(join(projectPath, \"pages\"))) recommendations.push({\n\t\t\t\tid: \"next-app-router\",\n\t\t\t\tframework: \"next\",\n\t\t\t\ttitle: \"Migrate to App Router\",\n\t\t\t\tmessage: \"pages/ directory detected. The App Router (app/) is the recommended architecture for new Next.js features including Server Components, streaming, and nested layouts.\",\n\t\t\t\tseverity: \"suggest\",\n\t\t\t\tlearnMoreUrl: \"https://nextjs.org/docs/app/building-your-application/upgrading/app-router-migration\"\n\t\t\t});\n\t\t} catch {}\n\t}\n\tcheckTurbopack(scripts, recommendations) {\n\t\ttry {\n\t\t\tif (!(scripts.dev ?? \"\").includes(\"--turbopack\")) recommendations.push({\n\t\t\t\tid: \"next-turbopack\",\n\t\t\t\tframework: \"next\",\n\t\t\t\ttitle: \"Enable Turbopack\",\n\t\t\t\tmessage: \"Dev server not using Turbopack. Add --turbopack to your dev script for significantly faster hot module replacement and development builds.\",\n\t\t\t\tseverity: \"suggest\",\n\t\t\t\tlearnMoreUrl: \"https://nextjs.org/docs/architecture/turbopack\"\n\t\t\t});\n\t\t} catch {}\n\t}\n\tcheckMetadataApi(projectPath, recommendations) {\n\t\ttry {\n\t\t\tconst appDir = join(projectPath, \"app\");\n\t\t\tif (!existsSync(appDir)) return;\n\t\t\tconst pageFiles = findPageFiles(appDir);\n\t\t\tif (pageFiles.length === 0) return;\n\t\t\tif (!pageFiles.some((f) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst content = readFileSync(f, \"utf-8\");\n\t\t\t\t\treturn content.includes(\"export const metadata\") || content.includes(\"generateMetadata\");\n\t\t\t\t} catch {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t})) recommendations.push({\n\t\t\t\tid: \"next-metadata-api\",\n\t\t\t\tframework: \"next\",\n\t\t\t\ttitle: \"Use the Metadata API\",\n\t\t\t\tmessage: \"No metadata exports found in App Router pages. The Metadata API (export const metadata / generateMetadata) provides automatic <head> management with built-in deduplication and streaming support.\",\n\t\t\t\tseverity: \"recommend\",\n\t\t\t\tlearnMoreUrl: \"https://nextjs.org/docs/app/building-your-application/optimizing/metadata\"\n\t\t\t});\n\t\t} catch {}\n\t}\n\tcheckThirdParties(projectPath, allDeps, recommendations) {\n\t\ttry {\n\t\t\tif (\"@next/third-parties\" in allDeps) return;\n\t\t\tconst appDir = join(projectPath, \"app\");\n\t\t\tif (!existsSync(appDir)) return;\n\t\t\tif (findLayoutFiles(appDir).some((f) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst content = readFileSync(f, \"utf-8\");\n\t\t\t\t\treturn content.includes(\"googletagmanager.com\") || content.includes(\"google-analytics.com\") || content.includes(\"gtag(\");\n\t\t\t\t} catch {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t})) recommendations.push({\n\t\t\t\tid: \"next-third-parties\",\n\t\t\t\tframework: \"next\",\n\t\t\t\ttitle: \"Use @next/third-parties\",\n\t\t\t\tmessage: \"Google Analytics/GTM loaded via raw script tags. @next/third-parties provides optimized, lazy-loaded wrappers that reduce impact on Core Web Vitals.\",\n\t\t\t\tseverity: \"suggest\",\n\t\t\t\tlearnMoreUrl: \"https://nextjs.org/docs/app/building-your-application/optimizing/third-party-libraries\"\n\t\t\t});\n\t\t} catch {}\n\t}\n\tcheckStrictMode(projectPath, recommendations) {\n\t\ttry {\n\t\t\tif (!NEXT_CONFIG_FILES.some((f) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst content = readFileSync(join(projectPath, f), \"utf-8\");\n\t\t\t\t\treturn /reactStrictMode\\s*:\\s*true/.test(content);\n\t\t\t\t} catch {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t})) recommendations.push({\n\t\t\t\tid: \"next-strict-mode\",\n\t\t\t\tframework: \"next\",\n\t\t\t\ttitle: \"Enable React Strict Mode\",\n\t\t\t\tmessage: \"reactStrictMode is not enabled in your Next.js config. Strict Mode helps find bugs by double-invoking renders and effects in development.\",\n\t\t\t\tseverity: \"recommend\",\n\t\t\t\tlearnMoreUrl: \"https://nextjs.org/docs/api-reference/next.config.js/react-strict-mode\",\n\t\t\t\tfix: { description: \"Add reactStrictMode: true to your next.config.js\" }\n\t\t\t});\n\t\t} catch {}\n\t}\n};\nfunction findPageFiles(dir) {\n\tconst files = [];\n\ttry {\n\t\tfor (const entry of readdirSync(dir, { withFileTypes: true })) {\n\t\t\tif (entry.name.startsWith(\".\") || entry.name === \"node_modules\") continue;\n\t\t\tconst fullPath = join(dir, entry.name);\n\t\t\tif (entry.isDirectory()) files.push(...findPageFiles(fullPath));\n\t\t\telse if (entry.name.startsWith(\"page.\")) files.push(fullPath);\n\t\t}\n\t} catch {}\n\treturn files;\n}\nfunction findLayoutFiles(dir) {\n\tconst files = [];\n\ttry {\n\t\tfor (const entry of readdirSync(dir, { withFileTypes: true })) {\n\t\t\tif (entry.name.startsWith(\".\") || entry.name === \"node_modules\") continue;\n\t\t\tconst fullPath = join(dir, entry.name);\n\t\t\tif (entry.isDirectory()) files.push(...findLayoutFiles(fullPath));\n\t\t\telse if (entry.name.startsWith(\"layout.\") || entry.name.startsWith(\"page.\")) files.push(fullPath);\n\t\t}\n\t} catch {}\n\treturn files;\n}\n//#endregion\n//#region src/advisors/react-best-practices.ts\nconst COMPONENT_EXTENSIONS$2 = new Set([\".tsx\", \".jsx\"]);\nconst ENTRY_FILES = [\n\t\"main.tsx\",\n\t\"main.jsx\",\n\t\"index.tsx\",\n\t\"index.jsx\",\n\t\"src/main.tsx\",\n\t\"src/main.jsx\",\n\t\"src/index.tsx\",\n\t\"src/index.jsx\"\n];\nvar ReactBestPracticesAdvisor = class extends BaseAdvisor {\n\tname = \"react-best-practices\";\n\tframeworks = [\n\t\t\"react\",\n\t\t\"next\",\n\t\t\"remix\"\n\t];\n\tasync run(projectPath, context) {\n\t\tconst recommendations = [];\n\t\tconst isNext = context.frameworks.includes(\"next\");\n\t\ttry {\n\t\t\tconst pkg = JSON.parse(readFileSync(join(projectPath, \"package.json\"), \"utf-8\"));\n\t\t\tconst allDeps = {\n\t\t\t\t...pkg.dependencies,\n\t\t\t\t...pkg.devDependencies\n\t\t\t};\n\t\t\tthis.checkErrorBoundaries(projectPath, allDeps, recommendations);\n\t\t\tthis.checkSuspenseUsage(projectPath, recommendations);\n\t\t\tthis.checkReactCompiler(allDeps, recommendations);\n\t\t\tif (!isNext) this.checkStrictMode(projectPath, recommendations);\n\t\t\tif (!isNext) this.checkLegacyRender(projectPath, recommendations);\n\t\t} catch {}\n\t\treturn recommendations;\n\t}\n\tcheckErrorBoundaries(projectPath, allDeps, recommendations) {\n\t\ttry {\n\t\t\tif (\"react-error-boundary\" in allDeps) return;\n\t\t\tif (!scanComponentFiles(join(projectPath, \"src\")).some((f) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst content = readFileSync(f, \"utf-8\");\n\t\t\t\t\treturn content.includes(\"ErrorBoundary\") || content.includes(\"componentDidCatch\");\n\t\t\t\t} catch {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t})) recommendations.push({\n\t\t\t\tid: \"react-error-boundary\",\n\t\t\t\tframework: \"react\",\n\t\t\t\ttitle: \"Add Error Boundaries\",\n\t\t\t\tmessage: \"No error boundaries detected. Unhandled errors in components will crash the entire app. Consider adding react-error-boundary or a custom ErrorBoundary component.\",\n\t\t\t\tseverity: \"recommend\",\n\t\t\t\tlearnMoreUrl: \"https://react.dev/reference/react/Component#catching-rendering-errors-with-an-error-boundary\",\n\t\t\t\tfix: {\n\t\t\t\t\tcommand: \"npm install react-error-boundary\",\n\t\t\t\t\tdescription: \"Install the react-error-boundary package and wrap your app or key routes\"\n\t\t\t\t}\n\t\t\t});\n\t\t} catch {}\n\t}\n\tcheckSuspenseUsage(projectPath, recommendations) {\n\t\ttry {\n\t\t\tif (!scanComponentFiles(join(projectPath, \"src\")).some((f) => {\n\t\t\t\ttry {\n\t\t\t\t\treturn readFileSync(f, \"utf-8\").includes(\"<Suspense\");\n\t\t\t\t} catch {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t})) recommendations.push({\n\t\t\t\tid: \"react-suspense\",\n\t\t\t\tframework: \"react\",\n\t\t\t\ttitle: \"Use Suspense for Loading States\",\n\t\t\t\tmessage: \"No <Suspense> boundaries found. Suspense provides declarative loading states for lazy-loaded components, data fetching, and code splitting.\",\n\t\t\t\tseverity: \"suggest\",\n\t\t\t\tlearnMoreUrl: \"https://react.dev/reference/react/Suspense\"\n\t\t\t});\n\t\t} catch {}\n\t}\n\tcheckReactCompiler(allDeps, recommendations) {\n\t\ttry {\n\t\t\tif (!(\"babel-plugin-react-compiler\" in allDeps || \"@react-compiler/babel\" in allDeps)) recommendations.push({\n\t\t\t\tid: \"react-compiler\",\n\t\t\t\tframework: \"react\",\n\t\t\t\ttitle: \"Adopt React Compiler\",\n\t\t\t\tmessage: \"React Compiler automatically memoizes components and hooks, eliminating the need for manual useMemo/useCallback. It can significantly reduce re-renders.\",\n\t\t\t\tseverity: \"suggest\",\n\t\t\t\tlearnMoreUrl: \"https://react.dev/learn/react-compiler\"\n\t\t\t});\n\t\t} catch {}\n\t}\n\tcheckStrictMode(projectPath, recommendations) {\n\t\ttry {\n\t\t\tif (!ENTRY_FILES.some((f) => {\n\t\t\t\ttry {\n\t\t\t\t\treturn readFileSync(join(projectPath, f), \"utf-8\").includes(\"<StrictMode\");\n\t\t\t\t} catch {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t})) recommendations.push({\n\t\t\t\tid: \"react-strict-mode\",\n\t\t\t\tframework: \"react\",\n\t\t\t\ttitle: \"Enable StrictMode\",\n\t\t\t\tmessage: \"No <StrictMode> wrapper found in entry files. Strict Mode helps find bugs by double-invoking renders and effects in development.\",\n\t\t\t\tseverity: \"recommend\",\n\t\t\t\tlearnMoreUrl: \"https://react.dev/reference/react/StrictMode\"\n\t\t\t});\n\t\t} catch {}\n\t}\n\tcheckLegacyRender(projectPath, recommendations) {\n\t\ttry {\n\t\t\tif (ENTRY_FILES.some((f) => {\n\t\t\t\ttry {\n\t\t\t\t\treturn readFileSync(join(projectPath, f), \"utf-8\").includes(\"ReactDOM.render(\");\n\t\t\t\t} catch {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t})) recommendations.push({\n\t\t\t\tid: \"react-legacy-render\",\n\t\t\t\tframework: \"react\",\n\t\t\t\ttitle: \"Migrate to createRoot\",\n\t\t\t\tmessage: \"Using legacy ReactDOM.render() API. Migrate to createRoot() to enable concurrent features like Suspense, transitions, and automatic batching.\",\n\t\t\t\tseverity: \"recommend\",\n\t\t\t\tlearnMoreUrl: \"https://react.dev/blog/2022/03/08/react-18-upgrade-guide#updates-to-client-rendering-apis\",\n\t\t\t\tfix: { description: \"Replace ReactDOM.render(<App />, container) with createRoot(container).render(<App />)\" }\n\t\t\t});\n\t\t} catch {}\n\t}\n};\nfunction scanComponentFiles(dir) {\n\tconst files = [];\n\ttry {\n\t\tif (!existsSync(dir)) return files;\n\t\tfor (const entry of readdirSync(dir)) {\n\t\t\tif (entry.startsWith(\".\") || entry === \"node_modules\") continue;\n\t\t\tconst fullPath = join(dir, entry);\n\t\t\tif (statSync(fullPath).isDirectory()) files.push(...scanComponentFiles(fullPath));\n\t\t\telse if (COMPONENT_EXTENSIONS$2.has(extname(entry))) files.push(fullPath);\n\t\t}\n\t} catch {}\n\treturn files;\n}\n//#endregion\n//#region src/advisors/universal-best-practices.ts\nconst LOCK_FILES = [\n\t\"package-lock.json\",\n\t\"pnpm-lock.yaml\",\n\t\"yarn.lock\",\n\t\"bun.lockb\"\n];\nvar UniversalBestPracticesAdvisor = class extends BaseAdvisor {\n\tname = \"universal-best-practices\";\n\tframeworks = [];\n\tasync run(projectPath, _context) {\n\t\tconst recommendations = [];\n\t\ttry {\n\t\t\tconst pkg = JSON.parse(readFileSync(join(projectPath, \"package.json\"), \"utf-8\"));\n\t\t\tthis.checkNodeVersionPinning(projectPath, pkg, recommendations);\n\t\t\tthis.checkEditorConfig(projectPath, recommendations);\n\t\t\tthis.checkEnginesField(pkg, recommendations);\n\t\t\tthis.checkPackageManagerField(pkg, recommendations);\n\t\t\tthis.checkLicenseFile(projectPath, recommendations);\n\t\t\tthis.checkConflictingLockFiles(projectPath, recommendations);\n\t\t} catch {}\n\t\treturn recommendations;\n\t}\n\tcheckNodeVersionPinning(projectPath, pkg, recommendations) {\n\t\ttry {\n\t\t\tconst hasNvmrc = existsSync(join(projectPath, \".nvmrc\"));\n\t\t\tconst hasNodeVersion = existsSync(join(projectPath, \".node-version\"));\n\t\t\tconst hasEnginesNode = !!pkg.engines?.node;\n\t\t\tif (!hasNvmrc && !hasNodeVersion && !hasEnginesNode) recommendations.push({\n\t\t\t\tid: \"universal-node-version\",\n\t\t\t\tframework: \"universal\",\n\t\t\t\ttitle: \"Pin Node.js Version\",\n\t\t\t\tmessage: \"No .nvmrc, .node-version, or engines.node found. Pinning the Node version prevents \\\"works on my machine\\\" issues and ensures consistent CI behavior.\",\n\t\t\t\tseverity: \"recommend\",\n\t\t\t\tfix: { description: \"Create a .nvmrc file with your target Node version (e.g. 22)\" }\n\t\t\t});\n\t\t} catch {}\n\t}\n\tcheckEditorConfig(projectPath, recommendations) {\n\t\ttry {\n\t\t\tif (!existsSync(join(projectPath, \".editorconfig\"))) recommendations.push({\n\t\t\t\tid: \"universal-editorconfig\",\n\t\t\t\tframework: \"universal\",\n\t\t\t\ttitle: \"Add .editorconfig\",\n\t\t\t\tmessage: \"No .editorconfig found. EditorConfig ensures consistent indentation, line endings, and charset across different editors and IDEs.\",\n\t\t\t\tseverity: \"suggest\",\n\t\t\t\tlearnMoreUrl: \"https://editorconfig.org/\"\n\t\t\t});\n\t\t} catch {}\n\t}\n\tcheckEnginesField(pkg, recommendations) {\n\t\ttry {\n\t\t\tif (!pkg.engines) recommendations.push({\n\t\t\t\tid: \"universal-engines\",\n\t\t\t\tframework: \"universal\",\n\t\t\t\ttitle: \"Add engines Field\",\n\t\t\t\tmessage: \"package.json has no engines field. Declaring Node and npm version constraints prevents installs on incompatible runtimes.\",\n\t\t\t\tseverity: \"suggest\"\n\t\t\t});\n\t\t} catch {}\n\t}\n\tcheckPackageManagerField(pkg, recommendations) {\n\t\ttry {\n\t\t\tif (!pkg.packageManager) recommendations.push({\n\t\t\t\tid: \"universal-package-manager\",\n\t\t\t\tframework: \"universal\",\n\t\t\t\ttitle: \"Add packageManager Field\",\n\t\t\t\tmessage: \"package.json has no packageManager field. This field enables Corepack to auto-install the correct package manager version, preventing lockfile churn from version mismatches.\",\n\t\t\t\tseverity: \"suggest\",\n\t\t\t\tlearnMoreUrl: \"https://nodejs.org/api/corepack.html\"\n\t\t\t});\n\t\t} catch {}\n\t}\n\tcheckLicenseFile(projectPath, recommendations) {\n\t\ttry {\n\t\t\tif (!(existsSync(join(projectPath, \"LICENSE\")) || existsSync(join(projectPath, \"LICENSE.md\")) || existsSync(join(projectPath, \"LICENSE.txt\")) || existsSync(join(projectPath, \"LICENCE\")) || existsSync(join(projectPath, \"LICENCE.md\")))) recommendations.push({\n\t\t\t\tid: \"universal-license\",\n\t\t\t\tframework: \"universal\",\n\t\t\t\ttitle: \"Add a LICENSE File\",\n\t\t\t\tmessage: \"No LICENSE file found. Without an explicit license, the project is \\\"all rights reserved\\\" by default, which may prevent others from using or contributing to it.\",\n\t\t\t\tseverity: \"recommend\"\n\t\t\t});\n\t\t} catch {}\n\t}\n\tcheckConflictingLockFiles(projectPath, recommendations) {\n\t\ttry {\n\t\t\tconst presentLockFiles = LOCK_FILES.filter((f) => existsSync(join(projectPath, f)));\n\t\t\tif (presentLockFiles.length > 1) recommendations.push({\n\t\t\t\tid: \"universal-conflicting-lockfiles\",\n\t\t\t\tframework: \"universal\",\n\t\t\t\ttitle: \"Remove Conflicting Lock Files\",\n\t\t\t\tmessage: `Multiple lock files found (${presentLockFiles.join(\", \")}). This causes nondeterministic installs and CI failures. Keep only the lock file for your project's package manager.`,\n\t\t\t\tseverity: \"recommend\"\n\t\t\t});\n\t\t} catch {}\n\t}\n};\n//#endregion\n//#region src/config.ts\nfunction defineConfig(config) {\n\treturn config;\n}\nconst CONFIG_FILES = [\n\t\"sickbay.config.ts\",\n\t\"sickbay.config.js\",\n\t\"sickbay.config.mjs\"\n];\nfunction getCheckConfig(config, checkId) {\n\tif (!config?.checks) return null;\n\tconst entry = config.checks[checkId];\n\tif (typeof entry === \"object\" && entry.enabled !== false) return entry;\n\treturn null;\n}\nfunction isCheckDisabled(config, checkId) {\n\tif (!config?.checks) return false;\n\tconst entry = config.checks[checkId];\n\tif (entry === false) return true;\n\tif (typeof entry === \"object\" && entry.enabled === false) return true;\n\treturn false;\n}\nfunction resolveConfigMeta(config) {\n\tif (!config) return {\n\t\thasCustomConfig: false,\n\t\toverriddenChecks: [],\n\t\tdisabledChecks: []\n\t};\n\tconst disabledChecks = [];\n\tconst overriddenChecks = [];\n\tif (config.checks) {\n\t\tfor (const [id, entry] of Object.entries(config.checks)) if (entry === false || typeof entry === \"object\" && entry.enabled === false) disabledChecks.push(id);\n\t\telse if (typeof entry === \"object\") {\n\t\t\tif (entry.thresholds || entry.exclude?.length || entry.suppress?.length) overriddenChecks.push(id);\n\t\t}\n\t}\n\treturn {\n\t\thasCustomConfig: disabledChecks.length > 0 || overriddenChecks.length > 0 || config.weights !== void 0 && Object.keys(config.weights).length > 0 || config.exclude !== void 0 && config.exclude.length > 0,\n\t\toverriddenChecks,\n\t\tdisabledChecks\n\t};\n}\n/** Known threshold keys per configurable runner. Used for validation. */\nconst KNOWN_THRESHOLD_KEYS = {\n\toutdated: [\"maxOutdated\"],\n\tcomplexity: [\n\t\t\"react-component\",\n\t\t\"custom-hook\",\n\t\t\"node-service\",\n\t\t\"route-file\",\n\t\t\"ts-utility\",\n\t\t\"config\",\n\t\t\"test\",\n\t\t\"general\"\n\t],\n\tjscpd: [\"warnPercent\", \"criticalPercent\"],\n\tcoverage: [\"lines\", \"functions\"],\n\teslint: [\"maxErrors\"],\n\ttypescript: [\"maxErrors\"],\n\tmadge: [\"maxCircular\"],\n\t\"todo-scanner\": [\"patterns\"],\n\t\"asset-size\": [\n\t\t\"imageWarn\",\n\t\t\"imageCritical\",\n\t\t\"svgWarn\",\n\t\t\"fontWarn\",\n\t\t\"totalWarn\",\n\t\t\"totalCritical\"\n\t],\n\t\"source-map-explorer\": [\"warnSize\", \"failSize\"],\n\t\"license-checker\": [\"blocklist\"],\n\tgit: [\"staleMonths\", \"maxRemoteBranches\"]\n};\nfunction validateConfig(config, knownCheckIds) {\n\tif (config.weights) {\n\t\tfor (const [category, value] of Object.entries(config.weights)) if (value !== void 0 && value <= 0) throw new Error(`Invalid weight for category \"${category}\": must be > 0, got ${value}`);\n\t}\n\tif (config.checks) for (const [checkId, entry] of Object.entries(config.checks)) {\n\t\tif (!knownCheckIds.includes(checkId)) {\n\t\t\tprocess.stderr.write(`Warning: Unknown check \"${checkId}\" in sickbay.config — it will be ignored.\\n`);\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof entry === \"object\" && entry.thresholds) {\n\t\t\tconst knownKeys = KNOWN_THRESHOLD_KEYS[checkId];\n\t\t\tif (knownKeys) {\n\t\t\t\tfor (const key of Object.keys(entry.thresholds)) if (!knownKeys.includes(key)) process.stderr.write(`Warning: Unknown threshold key \"${key}\" for check \"${checkId}\" — it will be ignored.\\n`);\n\t\t\t}\n\t\t}\n\t}\n}\n/**\n* Returns runner names that are running but not listed in the user's config.\n* Returns empty array when config is null or has no checks block.\n*/\nfunction getUnlistedChecks(config, runnerNames) {\n\tif (!config?.checks) return [];\n\tconst configCheckIds = new Set(Object.keys(config.checks));\n\treturn runnerNames.filter((name) => !configCheckIds.has(name));\n}\n/**\n* Merge a root config with a package-level config for monorepo mode.\n* Package config overrides root per-key for checks and weights.\n* Exclude patterns are concatenated (additive).\n*/\nfunction mergeConfigs(root, pkg) {\n\tif (!root && !pkg) return null;\n\tif (!root) return pkg;\n\tif (!pkg) return root;\n\treturn {\n\t\tchecks: {\n\t\t\t...root.checks,\n\t\t\t...pkg.checks\n\t\t},\n\t\texclude: [...root.exclude ?? [], ...pkg.exclude ?? []],\n\t\tweights: root.weights || pkg.weights ? {\n\t\t\t...root.weights,\n\t\t\t...pkg.weights\n\t\t} : void 0\n\t};\n}\nasync function loadConfig(projectPath) {\n\tconst absProjectPath = resolve(projectPath);\n\tconst configPath = CONFIG_FILES.map((f) => join(absProjectPath, f)).find((p) => existsSync(p));\n\tif (!configPath) return null;\n\ttry {\n\t\tconst { createJiti } = await import(\"jiti\");\n\t\tconst mod = await createJiti(absProjectPath).import(configPath);\n\t\treturn mod.default ?? mod;\n\t} catch (err) {\n\t\tprocess.stderr.write(`Warning: Failed to load ${configPath}: ${err instanceof Error ? err.message : err}\\nFalling back to defaults.\\n`);\n\t\treturn null;\n\t}\n}\n//#endregion\n//#region src/constants.ts\nconst WARN_LINES = 400;\nconst CRITICAL_LINES = 600;\nconst SCORE_EXCELLENT = 90;\nconst SCORE_GOOD = 80;\nconst SCORE_FAIR = 60;\n//#endregion\n//#region src/utils/file-helpers.ts\n/**\n* This module provides utility functions for file operations, command availability checks, timing, and robust JSON parsing.\n* It includes functions to read package.json, check if a command is available in the environment, verify file existence, and measure elapsed time.\n* The parseJsonOutput function is designed to handle CLI outputs that may contain non-JSON text or ANSI color codes, extracting valid JSON content reliably.\n* These utilities are essential for the various runners and integrations in the sickbay-core package to perform their checks and analyses effectively.\n*/\nconst coreLocalDir = dirname(dirname(fileURLToPath(import.meta.url)));\nfunction readPackageJson(projectPath) {\n\tconst pkgPath = join(projectPath, \"package.json\");\n\treturn JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n}\nasync function isCommandAvailable(cmd) {\n\tconst binDir = join(coreLocalDir, \"node_modules\", \".bin\");\n\tif ((process.platform === \"win32\" ? [\n\t\tcmd,\n\t\t`${cmd}.cmd`,\n\t\t`${cmd}.exe`,\n\t\t`${cmd}.ps1`\n\t] : [cmd]).some((c) => existsSync(join(binDir, c)))) return true;\n\tconst lookupCmd = process.platform === \"win32\" ? \"where\" : \"which\";\n\ttry {\n\t\tawait execa(lookupCmd, [cmd]);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\nfunction fileExists(projectPath, ...parts) {\n\treturn existsSync(join(projectPath, ...parts));\n}\n/**\n* Compute a project-relative path from an absolute path, with forward\n* slashes regardless of platform.\n*\n* Why this exists: every check runner that walks the filesystem builds\n* absolute paths with `path.join`, then needs to display/store/match a\n* project-relative version. The natural way to do that is `path.relative`,\n* but on Windows that returns paths with backslashes — which then break\n* suppression rules (users write forward-slash globs), JSON snapshots\n* (compared across platforms), and dashboard rendering.\n*\n* Historical bug: 19 sites across 16 integrations used\n* `fullPath.replace(projectRoot + '/', '')` instead, which silently\n* produced wrong output on Windows because the literal `/` in the\n* search string never matched the actual `\\` separator. The result was\n* that every \"relative\" path was actually the original absolute path\n* unchanged, breaking suppression matching and dashboard display for\n* all Windows users. This helper replaces every one of those sites.\n*/\nfunction relativeFromRoot(projectRoot, fullPath) {\n\treturn relative(projectRoot, fullPath).split(sep).join(\"/\");\n}\nfunction timer() {\n\tconst start = Date.now();\n\treturn () => Date.now() - start;\n}\n/**\n* Safely extract and parse JSON from mixed CLI output that may contain logs, ANSI codes, etc.\n* Handles cases where tools output \"[Vite] Proxy...\" or other text before/after JSON.\n*/\nfunction parseJsonOutput(stdout, fallback = \"{}\") {\n\tif (!stdout || !stdout.trim()) return JSON.parse(fallback);\n\tconst cleaned = stdout.replace(/\\u001b\\[[0-9;]*m/g, \"\");\n\ttry {\n\t\treturn JSON.parse(cleaned);\n\t} catch {}\n\tconst lines = cleaned.split(\"\\n\");\n\tconst jsonLines = [];\n\tlet foundStart = false;\n\tfor (const line of lines) {\n\t\tconst trimmed = line.trim();\n\t\tif (!foundStart && (trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\"))) foundStart = true;\n\t\tif (foundStart) {\n\t\t\tjsonLines.push(line);\n\t\t\tconst candidate = jsonLines.join(\"\\n\");\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(candidate);\n\t\t\t} catch {}\n\t\t}\n\t}\n\tif (jsonLines.length > 0) try {\n\t\treturn JSON.parse(jsonLines.join(\"\\n\"));\n\t} catch {}\n\treturn JSON.parse(fallback);\n}\n//#endregion\n//#region src/integrations/base.ts\nvar BaseRunner = class {\n\t/** Human-readable display name. Falls back to `name` (the check ID) if not set. */\n\tdisplayName;\n\tapplicableFrameworks;\n\tapplicableRuntimes;\n\tisApplicableToContext(context) {\n\t\tif (this.applicableFrameworks) {\n\t\t\tif (!this.applicableFrameworks.some((f) => context.frameworks.includes(f))) return false;\n\t\t}\n\t\tif (this.applicableRuntimes) {\n\t\t\tif (!this.applicableRuntimes.includes(context.runtime)) return false;\n\t\t}\n\t\treturn true;\n\t}\n\tasync isApplicable(_projectPath, _context) {\n\t\treturn true;\n\t}\n\telapsed = timer;\n\tskipped(reason) {\n\t\treturn {\n\t\t\tid: this.name,\n\t\t\tcategory: this.category,\n\t\t\tname: this.displayName ?? this.name,\n\t\t\tscore: 100,\n\t\t\tstatus: \"skipped\",\n\t\t\tissues: [],\n\t\t\ttoolsUsed: [this.name],\n\t\t\tduration: 0,\n\t\t\tmetadata: { reason }\n\t\t};\n\t}\n};\n//#endregion\n//#region src/integrations/angular-build-config.ts\nvar AngularBuildConfigRunner = class extends BaseRunner {\n\tname = \"angular-build-config\";\n\tcategory = \"performance\";\n\tapplicableFrameworks = [\"angular\"];\n\tasync run(projectPath) {\n\t\tconst elapsed = timer();\n\t\ttry {\n\t\t\tconst angularJsonPath = join(projectPath, \"angular.json\");\n\t\t\tif (!existsSync(angularJsonPath)) return {\n\t\t\t\tid: \"angular-build-config\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Angular Build Config\",\n\t\t\t\tscore: 100,\n\t\t\t\tstatus: \"pass\",\n\t\t\t\tissues: [],\n\t\t\t\ttoolsUsed: [\"angular-build-config\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: { reason: \"no angular.json found\" }\n\t\t\t};\n\t\t\tconst angularJson = JSON.parse(readFileSync(angularJsonPath, \"utf-8\"));\n\t\t\tconst issues = [];\n\t\t\tconst projects = angularJson.projects ?? {};\n\t\t\tconst projectName = angularJson.defaultProject ?? Object.keys(projects)[0];\n\t\t\tif (!projectName || !projects[projectName]) return {\n\t\t\t\tid: \"angular-build-config\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Angular Build Config\",\n\t\t\t\tscore: 100,\n\t\t\t\tstatus: \"pass\",\n\t\t\t\tissues: [],\n\t\t\t\ttoolsUsed: [\"angular-build-config\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: { reason: \"no projects found in angular.json\" }\n\t\t\t};\n\t\t\tconst buildConfig = projects[projectName]?.architect?.build?.configurations?.production ?? {};\n\t\t\tif (buildConfig.sourceMap === true) issues.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tmessage: \"Production build has sourceMap enabled — ships source code to end users\",\n\t\t\t\tfix: {\n\t\t\t\t\tdescription: \"Set \\\"sourceMap\\\": false in the production build configuration.\",\n\t\t\t\t\tcommand: `ng config projects.${projectName}.architect.build.configurations.production.sourceMap false`\n\t\t\t\t},\n\t\t\t\treportedBy: [\"angular-build-config\"]\n\t\t\t});\n\t\t\tif (buildConfig.optimization === false) issues.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tmessage: \"Production build has optimization disabled — no minification or tree-shaking\",\n\t\t\t\tfix: {\n\t\t\t\t\tdescription: \"Set \\\"optimization\\\": true in the production build configuration.\",\n\t\t\t\t\tcommand: `ng config projects.${projectName}.architect.build.configurations.production.optimization true`\n\t\t\t\t},\n\t\t\t\treportedBy: [\"angular-build-config\"]\n\t\t\t});\n\t\t\tif (!buildConfig.budgets && !Array.isArray(buildConfig.budgets)) issues.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tmessage: \"No bundle size budgets configured — no enforcement of bundle size limits\",\n\t\t\t\tfix: { description: \"Add a \\\"budgets\\\" array to the production build configuration to enforce bundle size limits.\" },\n\t\t\t\treportedBy: [\"angular-build-config\"]\n\t\t\t});\n\t\t\tif (buildConfig.aot === false) issues.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tmessage: \"Production build has AOT compilation disabled — JIT compilation is slower and less secure\",\n\t\t\t\tfix: {\n\t\t\t\t\tdescription: \"Remove \\\"aot\\\": false from the production build configuration. AOT is the default since Angular 9.\",\n\t\t\t\t\tcommand: `ng config projects.${projectName}.architect.build.configurations.production.aot true`\n\t\t\t\t},\n\t\t\t\treportedBy: [\"angular-build-config\"]\n\t\t\t});\n\t\t\tconst score = Math.max(20, 100 - issues.length * 20);\n\t\t\treturn {\n\t\t\t\tid: \"angular-build-config\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Angular Build Config\",\n\t\t\t\tscore,\n\t\t\t\tstatus: issues.length > 0 ? \"warning\" : \"pass\",\n\t\t\t\tissues,\n\t\t\t\ttoolsUsed: [\"angular-build-config\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: {\n\t\t\t\t\tproject: projectName,\n\t\t\t\t\tissueCount: issues.length\n\t\t\t\t}\n\t\t\t};\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tid: \"angular-build-config\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Angular Build Config\",\n\t\t\t\tscore: 0,\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tissues: [{\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\tmessage: `Check failed: ${err}`,\n\t\t\t\t\treportedBy: [\"angular-build-config\"]\n\t\t\t\t}],\n\t\t\t\ttoolsUsed: [\"angular-build-config\"],\n\t\t\t\tduration: elapsed()\n\t\t\t};\n\t\t}\n\t}\n};\n//#endregion\n//#region src/integrations/angular-change-detection.ts\n/**\n* Checks Angular components for missing OnPush change detection strategy.\n* Components without OnPush can cause unnecessary re-renders and performance issues.\n* This runner scans for .component.ts files, looks for @Component decorators,\n* and checks if they include `changeDetection: ChangeDetectionStrategy.OnPush`.\n* It reports warnings for any components that are missing this optimization.\n*\n* Note: This check is a heuristic and may not be 100% accurate, but it can help identify potential performance improvements.\n*/\nvar AngularChangeDetectionRunner = class extends BaseRunner {\n\tname = \"angular-change-detection\";\n\tcategory = \"performance\";\n\tapplicableFrameworks = [\"angular\"];\n\tasync run(projectPath) {\n\t\tconst elapsed = timer();\n\t\ttry {\n\t\t\tconst files = findComponentFiles$2(join(projectPath, \"src\"), projectPath);\n\t\t\tconst missing = [];\n\t\t\tfor (const { relPath, fullPath } of files) {\n\t\t\t\tconst content = readFileSync(fullPath, \"utf-8\");\n\t\t\t\tif (content.includes(\"@Component(\") && !content.includes(\"ChangeDetectionStrategy.OnPush\")) missing.push(relPath);\n\t\t\t}\n\t\t\tconst issues = missing.map((file) => ({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tmessage: `${file} — component missing OnPush change detection`,\n\t\t\t\tfile,\n\t\t\t\tsuppressMatch: file,\n\t\t\t\tfix: { description: \"Add `changeDetection: ChangeDetectionStrategy.OnPush` to the @Component decorator to prevent unnecessary re-renders.\" },\n\t\t\t\treportedBy: [\"angular-change-detection\"]\n\t\t\t}));\n\t\t\tconst score = Math.max(20, 100 - missing.length * 15);\n\t\t\treturn {\n\t\t\t\tid: \"angular-change-detection\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Angular Change Detection\",\n\t\t\t\tscore,\n\t\t\t\tstatus: missing.length > 0 ? \"warning\" : \"pass\",\n\t\t\t\tissues,\n\t\t\t\ttoolsUsed: [\"angular-change-detection\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: {\n\t\t\t\t\tfilesScanned: files.length,\n\t\t\t\t\tmissingOnPush: missing.length\n\t\t\t\t}\n\t\t\t};\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tid: \"angular-change-detection\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Angular Change Detection\",\n\t\t\t\tscore: 0,\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tissues: [{\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\tmessage: `Check failed: ${err}`,\n\t\t\t\t\treportedBy: [\"angular-change-detection\"]\n\t\t\t\t}],\n\t\t\t\ttoolsUsed: [\"angular-change-detection\"],\n\t\t\t\tduration: elapsed()\n\t\t\t};\n\t\t}\n\t}\n};\nfunction findComponentFiles$2(dir, projectRoot, isRoot = true) {\n\tconst files = [];\n\ttry {\n\t\tfor (const entry of readdirSync(dir)) {\n\t\t\tif (entry.startsWith(\".\") || entry === \"node_modules\") continue;\n\t\t\tconst fullPath = join(dir, entry);\n\t\t\tif (statSync(fullPath).isDirectory()) files.push(...findComponentFiles$2(fullPath, projectRoot, false));\n\t\t\telse if (entry.endsWith(\".component.ts\")) files.push({\n\t\t\t\trelPath: relativeFromRoot(projectRoot, fullPath),\n\t\t\t\tfullPath\n\t\t\t});\n\t\t}\n\t} catch (err) {\n\t\tif (isRoot) {\n\t\t\tconst code = err.code;\n\t\t\tif (code !== \"ENOENT\" && code !== \"ENOTDIR\") throw err;\n\t\t}\n\t}\n\treturn files;\n}\n//#endregion\n//#region src/integrations/angular-lazy-routes.ts\nvar AngularLazyRoutesRunner = class extends BaseRunner {\n\tname = \"angular-lazy-routes\";\n\tcategory = \"performance\";\n\tapplicableFrameworks = [\"angular\"];\n\tasync run(projectPath) {\n\t\tconst elapsed = timer();\n\t\ttry {\n\t\t\tlet routeFiles;\n\t\t\ttry {\n\t\t\t\trouteFiles = findRouteFiles(join(projectPath, \"src\"), projectPath);\n\t\t\t} catch (dirErr) {\n\t\t\t\tconst code = dirErr.code;\n\t\t\t\tif (code === \"ENOENT\" || code === \"ENOTDIR\") routeFiles = [];\n\t\t\t\telse throw dirErr;\n\t\t\t}\n\t\t\tif (routeFiles.length === 0) return {\n\t\t\t\tid: \"angular-lazy-routes\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Angular Lazy Routes\",\n\t\t\t\tscore: 100,\n\t\t\t\tstatus: \"pass\",\n\t\t\t\tissues: [],\n\t\t\t\ttoolsUsed: [\"angular-lazy-routes\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: {\n\t\t\t\t\trouteFiles: 0,\n\t\t\t\t\tstaticRoutes: 0,\n\t\t\t\t\tlazyRoutes: 0,\n\t\t\t\t\ttotalRoutes: 0\n\t\t\t\t}\n\t\t\t};\n\t\t\tlet lazyRoutes = 0;\n\t\t\tlet staticRoutes = 0;\n\t\t\tconst issues = [];\n\t\t\tfor (const { relPath, fullPath } of routeFiles) {\n\t\t\t\tconst lines = readFileSync(fullPath, \"utf-8\").split(\"\\n\");\n\t\t\t\tfor (let i = 0; i < lines.length; i++) {\n\t\t\t\t\tconst line = lines[i].trim();\n\t\t\t\t\tif (line.startsWith(\"//\") || line.startsWith(\"*\") || line.startsWith(\"/*\")) continue;\n\t\t\t\t\tif (/\\bloadComponent\\s*:/.test(line)) lazyRoutes++;\n\t\t\t\t\telse if (/\\bcomponent\\s*:/.test(line)) {\n\t\t\t\t\t\tstaticRoutes++;\n\t\t\t\t\t\tissues.push({\n\t\t\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\t\t\tmessage: `${relPath}:${i + 1} — static route component import; consider lazy loading`,\n\t\t\t\t\t\t\tfile: relPath,\n\t\t\t\t\t\t\tsuppressMatch: relPath,\n\t\t\t\t\t\t\tfix: { description: \"Replace `component: MyComponent` with `loadComponent: () => import('./my.component').then(m => m.MyComponent)` to enable route-level code splitting.\" },\n\t\t\t\t\t\t\treportedBy: [\"angular-lazy-routes\"]\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst totalRoutes = lazyRoutes + staticRoutes;\n\t\t\tconst score = totalRoutes === 0 ? 100 : Math.max(20, Math.round(lazyRoutes / totalRoutes * 100));\n\t\t\treturn {\n\t\t\t\tid: \"angular-lazy-routes\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Angular Lazy Routes\",\n\t\t\t\tscore,\n\t\t\t\tstatus: staticRoutes > 0 ? \"warning\" : \"pass\",\n\t\t\t\tissues,\n\t\t\t\ttoolsUsed: [\"angular-lazy-routes\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: {\n\t\t\t\t\trouteFiles: routeFiles.length,\n\t\t\t\t\tstaticRoutes,\n\t\t\t\t\tlazyRoutes,\n\t\t\t\t\ttotalRoutes\n\t\t\t\t}\n\t\t\t};\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tid: \"angular-lazy-routes\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Angular Lazy Routes\",\n\t\t\t\tscore: 0,\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tissues: [{\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\tmessage: `Check failed: ${err}`,\n\t\t\t\t\treportedBy: [\"angular-lazy-routes\"]\n\t\t\t\t}],\n\t\t\t\ttoolsUsed: [\"angular-lazy-routes\"],\n\t\t\t\tduration: elapsed()\n\t\t\t};\n\t\t}\n\t}\n};\nfunction findRouteFiles(dir, projectRoot, topLevel = true) {\n\tconst files = [];\n\tconst entries = topLevel ? readdirSync(dir) : (() => {\n\t\ttry {\n\t\t\treturn readdirSync(dir);\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t})();\n\tfor (const entry of entries) {\n\t\tif (entry.startsWith(\".\") || entry === \"node_modules\") continue;\n\t\tconst fullPath = join(dir, entry);\n\t\tlet stat;\n\t\ttry {\n\t\t\tstat = statSync(fullPath);\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\t\tif (stat.isDirectory()) files.push(...findRouteFiles(fullPath, projectRoot, false));\n\t\telse if (entry.endsWith(\".routes.ts\") || entry === \"app.config.ts\") files.push({\n\t\t\trelPath: relativeFromRoot(projectRoot, fullPath),\n\t\t\tfullPath\n\t\t});\n\t}\n\treturn files;\n}\n//#endregion\n//#region src/integrations/angular-security.ts\nconst BYPASS_METHODS = [\n\t\"bypassSecurityTrustHtml(\",\n\t\"bypassSecurityTrustScript(\",\n\t\"bypassSecurityTrustUrl(\",\n\t\"bypassSecurityTrustResourceUrl(\",\n\t\"bypassSecurityTrustStyle(\"\n];\nvar AngularSecurityRunner = class extends BaseRunner {\n\tname = \"angular-security\";\n\tcategory = \"security\";\n\tapplicableFrameworks = [\"angular\"];\n\tasync run(projectPath) {\n\t\tconst elapsed = timer();\n\t\ttry {\n\t\t\tconst files = findSourceFiles(join(projectPath, \"src\"), projectPath);\n\t\t\tconst issues = [];\n\t\t\tfor (const { relPath, fullPath } of files) {\n\t\t\t\tconst lines = readFileSync(fullPath, \"utf-8\").split(\"\\n\");\n\t\t\t\tfor (let i = 0; i < lines.length; i++) {\n\t\t\t\t\tconst line = lines[i];\n\t\t\t\t\tfor (const method of BYPASS_METHODS) if (line.includes(method)) issues.push({\n\t\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\t\tmessage: `${relPath}:${i + 1} — DomSanitizer ${method.slice(0, -1)}() bypasses XSS protection`,\n\t\t\t\t\t\tfile: relPath,\n\t\t\t\t\t\tsuppressMatch: relPath,\n\t\t\t\t\t\tfix: { description: \"Avoid bypassing Angular's built-in sanitization. Use safe values or sanitize input before rendering.\" },\n\t\t\t\t\t\treportedBy: [\"angular-security\"]\n\t\t\t\t\t});\n\t\t\t\t\tif (line.includes(\"[innerHTML]\")) issues.push({\n\t\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\t\tmessage: `${relPath}:${i + 1} — [innerHTML] binding is a potential XSS vector if content is user-controlled`,\n\t\t\t\t\t\tfile: relPath,\n\t\t\t\t\t\tsuppressMatch: relPath,\n\t\t\t\t\t\tfix: { description: \"Prefer Angular's built-in text interpolation or use DomSanitizer explicitly when innerHTML is required.\" },\n\t\t\t\t\t\treportedBy: [\"angular-security\"]\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst score = Math.max(20, 100 - issues.length * 20);\n\t\t\treturn {\n\t\t\t\tid: \"angular-security\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Angular Security\",\n\t\t\t\tscore,\n\t\t\t\tstatus: issues.length > 0 ? \"warning\" : \"pass\",\n\t\t\t\tissues,\n\t\t\t\ttoolsUsed: [\"angular-security\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: {\n\t\t\t\t\tfilesScanned: files.length,\n\t\t\t\t\tviolations: issues.length\n\t\t\t\t}\n\t\t\t};\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tid: \"angular-security\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Angular Security\",\n\t\t\t\tscore: 0,\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tissues: [{\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\tmessage: `Check failed: ${err}`,\n\t\t\t\t\treportedBy: [\"angular-security\"]\n\t\t\t\t}],\n\t\t\t\ttoolsUsed: [\"angular-security\"],\n\t\t\t\tduration: elapsed()\n\t\t\t};\n\t\t}\n\t}\n};\nfunction findSourceFiles(dir, projectRoot, isRoot = true) {\n\tconst files = [];\n\ttry {\n\t\tfor (const entry of readdirSync(dir)) {\n\t\t\tif (entry.startsWith(\".\") || entry === \"node_modules\") continue;\n\t\t\tconst fullPath = join(dir, entry);\n\t\t\tif (statSync(fullPath).isDirectory()) files.push(...findSourceFiles(fullPath, projectRoot, false));\n\t\t\telse if (entry.endsWith(\".ts\") || entry.endsWith(\".html\")) files.push({\n\t\t\t\trelPath: relativeFromRoot(projectRoot, fullPath),\n\t\t\t\tfullPath\n\t\t\t});\n\t\t}\n\t} catch (err) {\n\t\tif (isRoot) {\n\t\t\tconst code = err.code;\n\t\t\tif (code !== \"ENOENT\" && code !== \"ENOTDIR\") throw err;\n\t\t}\n\t}\n\treturn files;\n}\n//#endregion\n//#region src/integrations/angular-strict.ts\nvar AngularStrictRunner = class extends BaseRunner {\n\tname = \"angular-strict\";\n\tcategory = \"code-quality\";\n\tapplicableFrameworks = [\"angular\"];\n\tasync run(projectPath) {\n\t\tconst elapsed = timer();\n\t\ttry {\n\t\t\tconst tsconfigPath = join(projectPath, \"tsconfig.json\");\n\t\t\tif (!existsSync(tsconfigPath)) return {\n\t\t\t\tid: \"angular-strict\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Angular Strict Mode\",\n\t\t\t\tscore: 100,\n\t\t\t\tstatus: \"pass\",\n\t\t\t\tissues: [],\n\t\t\t\ttoolsUsed: [\"angular-strict\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: { reason: \"no tsconfig.json found\" }\n\t\t\t};\n\t\t\tconst tsconfig = JSON.parse(readFileSync(tsconfigPath, \"utf-8\"));\n\t\t\tconst compilerOptions = tsconfig.compilerOptions ?? {};\n\t\t\tconst angularOptions = tsconfig.angularCompilerOptions ?? {};\n\t\t\tconst issues = [];\n\t\t\tif (!compilerOptions[\"strict\"]) issues.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tmessage: \"TypeScript strict mode is disabled — could not confirm strict mode is enabled (check parent configs if using extends)\",\n\t\t\t\tfix: { description: \"Enable `strict: true` in `compilerOptions` for full TypeScript strict mode.\" },\n\t\t\t\treportedBy: [\"angular-strict\"]\n\t\t\t});\n\t\t\tif (!angularOptions[\"strictTemplates\"]) issues.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tmessage: \"Angular strictTemplates is disabled — could not confirm strictTemplates is enabled (check parent configs if using extends)\",\n\t\t\t\tfix: { description: \"Enable `strictTemplates: true` in `angularCompilerOptions` to catch template type errors at build time.\" },\n\t\t\t\treportedBy: [\"angular-strict\"]\n\t\t\t});\n\t\t\tif (!angularOptions[\"strictInjectionParameters\"]) issues.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tmessage: \"Angular strictInjectionParameters is disabled — could not confirm strictInjectionParameters is enabled (check parent configs if using extends)\",\n\t\t\t\tfix: { description: \"Enable `strictInjectionParameters: true` in `angularCompilerOptions` to catch missing injection token errors.\" },\n\t\t\t\treportedBy: [\"angular-strict\"]\n\t\t\t});\n\t\t\tconst score = Math.max(20, 100 - issues.length * 27);\n\t\t\treturn {\n\t\t\t\tid: \"angular-strict\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Angular Strict Mode\",\n\t\t\t\tscore,\n\t\t\t\tstatus: issues.length > 0 ? \"warning\" : \"pass\",\n\t\t\t\tissues,\n\t\t\t\ttoolsUsed: [\"angular-strict\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: {\n\t\t\t\t\tstrict: !!compilerOptions[\"strict\"],\n\t\t\t\t\tstrictTemplates: !!angularOptions[\"strictTemplates\"],\n\t\t\t\t\tstrictInjectionParameters: !!angularOptions[\"strictInjectionParameters\"]\n\t\t\t\t}\n\t\t\t};\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tid: \"angular-strict\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Angular Strict Mode\",\n\t\t\t\tscore: 0,\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tissues: [{\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\tmessage: `Check failed: ${err}`,\n\t\t\t\t\treportedBy: [\"angular-strict\"]\n\t\t\t\t}],\n\t\t\t\ttoolsUsed: [\"angular-strict\"],\n\t\t\t\tduration: elapsed()\n\t\t\t};\n\t\t}\n\t}\n};\n//#endregion\n//#region src/integrations/angular-subscriptions.ts\nconst CLEANUP_PATTERNS = [\n\t\"takeUntilDestroyed(\",\n\t\"takeUntil(\",\n\t\"DestroyRef\",\n\t\"ngOnDestroy\",\n\t\".unsubscribe(\"\n];\nvar AngularSubscriptionsRunner = class extends BaseRunner {\n\tname = \"angular-subscriptions\";\n\tcategory = \"code-quality\";\n\tapplicableFrameworks = [\"angular\"];\n\tasync run(projectPath) {\n\t\tconst elapsed = timer();\n\t\ttry {\n\t\t\tconst files = findComponentFiles$1(join(projectPath, \"src\"), projectPath);\n\t\t\tconst leaky = [];\n\t\t\tfor (const { relPath, fullPath } of files) {\n\t\t\t\tconst content = readFileSync(fullPath, \"utf-8\");\n\t\t\t\tif (content.includes(\".subscribe(\")) {\n\t\t\t\t\tif (!CLEANUP_PATTERNS.some((p) => content.includes(p))) leaky.push(relPath);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst issues = leaky.map((file) => ({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tmessage: `${file} — possible unguarded subscription (no takeUntilDestroyed, takeUntil, or ngOnDestroy found)`,\n\t\t\t\tfile,\n\t\t\t\tsuppressMatch: file,\n\t\t\t\tfix: { description: \"Use `takeUntilDestroyed()` from `@angular/core/rxjs-interop` or call `.unsubscribe()` in `ngOnDestroy` to prevent memory leaks.\" },\n\t\t\t\treportedBy: [\"angular-subscriptions\"]\n\t\t\t}));\n\t\t\tconst score = Math.max(20, 100 - leaky.length * 20);\n\t\t\treturn {\n\t\t\t\tid: \"angular-subscriptions\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Angular Subscriptions\",\n\t\t\t\tscore,\n\t\t\t\tstatus: leaky.length > 0 ? \"warning\" : \"pass\",\n\t\t\t\tissues,\n\t\t\t\ttoolsUsed: [\"angular-subscriptions\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: {\n\t\t\t\t\tfilesScanned: files.length,\n\t\t\t\t\tleakyComponents: leaky.length\n\t\t\t\t}\n\t\t\t};\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tid: \"angular-subscriptions\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Angular Subscriptions\",\n\t\t\t\tscore: 0,\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tissues: [{\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\tmessage: `Check failed: ${err}`,\n\t\t\t\t\treportedBy: [\"angular-subscriptions\"]\n\t\t\t\t}],\n\t\t\t\ttoolsUsed: [\"angular-subscriptions\"],\n\t\t\t\tduration: elapsed()\n\t\t\t};\n\t\t}\n\t}\n};\nfunction findComponentFiles$1(dir, projectRoot, isRoot = true) {\n\tconst files = [];\n\ttry {\n\t\tfor (const entry of readdirSync(dir)) {\n\t\t\tif (entry.startsWith(\".\") || entry === \"node_modules\") continue;\n\t\t\tconst fullPath = join(dir, entry);\n\t\t\tlet stat;\n\t\t\ttry {\n\t\t\t\tstat = statSync(fullPath);\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (stat.isDirectory()) files.push(...findComponentFiles$1(fullPath, projectRoot, false));\n\t\t\telse if (entry.endsWith(\".component.ts\")) files.push({\n\t\t\t\trelPath: relativeFromRoot(projectRoot, fullPath),\n\t\t\t\tfullPath\n\t\t\t});\n\t\t}\n\t} catch (err) {\n\t\tif (isRoot) {\n\t\t\tconst code = err.code;\n\t\t\tif (code !== \"ENOENT\" && code !== \"ENOTDIR\") throw err;\n\t\t}\n\t}\n\treturn files;\n}\n//#endregion\n//#region src/integrations/angular-template-performance.ts\nvar AngularTemplatePerformanceRunner = class extends BaseRunner {\n\tname = \"angular-template-performance\";\n\tcategory = \"performance\";\n\tapplicableFrameworks = [\"angular\"];\n\tasync run(projectPath) {\n\t\tconst elapsed = timer();\n\t\ttry {\n\t\t\tconst files = findComponentFiles(join(projectPath, \"src\"), projectPath);\n\t\t\tconst issues = [];\n\t\t\tfor (const { relPath, fullPath } of files) {\n\t\t\t\tconst template = readFileSync(fullPath, \"utf-8\").match(/template\\s*:\\s*`([\\s\\S]*?)`/)?.[1] ?? \"\";\n\t\t\t\tcheckNgForTrackBy(template, relPath, issues);\n\t\t\t\tcheckForTrack(template, relPath, issues);\n\t\t\t\tcheckFunctionCalls(template, relPath, issues);\n\t\t\t}\n\t\t\tconst score = Math.max(20, 100 - issues.length * 15);\n\t\t\treturn {\n\t\t\t\tid: \"angular-template-performance\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Angular Template Performance\",\n\t\t\t\tscore,\n\t\t\t\tstatus: issues.length > 0 ? \"warning\" : \"pass\",\n\t\t\t\tissues,\n\t\t\t\ttoolsUsed: [\"angular-template-performance\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: {\n\t\t\t\t\tfilesScanned: files.length,\n\t\t\t\t\tviolations: issues.length\n\t\t\t\t}\n\t\t\t};\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tid: \"angular-template-performance\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Angular Template Performance\",\n\t\t\t\tscore: 0,\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tissues: [{\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\tmessage: `Check failed: ${err}`,\n\t\t\t\t\treportedBy: [\"angular-template-performance\"]\n\t\t\t\t}],\n\t\t\t\ttoolsUsed: [\"angular-template-performance\"],\n\t\t\t\tduration: elapsed()\n\t\t\t};\n\t\t}\n\t}\n};\nfunction checkNgForTrackBy(template, relPath, issues) {\n\tconst ngForRegex = /\\*ngFor\\s*=\\s*\"([^\"]*)\"/g;\n\tlet match;\n\twhile ((match = ngForRegex.exec(template)) !== null) if (!match[1].includes(\"trackBy\")) issues.push({\n\t\tseverity: \"warning\",\n\t\tmessage: `${relPath} — *ngFor without trackBy causes full list re-renders on any array change`,\n\t\tfile: relPath,\n\t\tsuppressMatch: relPath,\n\t\tfix: { description: \"Add a trackBy function to the *ngFor directive (e.g. *ngFor=\\\"let item of items; trackBy: trackById\\\").\" },\n\t\treportedBy: [\"angular-template-performance\"]\n\t});\n}\nfunction checkForTrack(template, relPath, issues) {\n\tconst forRegex = /@for\\s*\\(([^)]*)\\)/g;\n\tlet match;\n\twhile ((match = forRegex.exec(template)) !== null) if (!match[1].includes(\"track\")) issues.push({\n\t\tseverity: \"warning\",\n\t\tmessage: `${relPath} — @for without track expression causes full list re-renders`,\n\t\tfile: relPath,\n\t\tsuppressMatch: relPath,\n\t\tfix: { description: \"Add a track expression to the @for block (e.g. @for (item of items; track item.id)).\" },\n\t\treportedBy: [\"angular-template-performance\"]\n\t});\n}\nfunction checkFunctionCalls(template, relPath, issues) {\n\tconst interpolationRegex = /\\{\\{\\s*(\\w+)\\s*\\(/g;\n\tlet match;\n\twhile ((match = interpolationRegex.exec(template)) !== null) {\n\t\tconst fnName = match[1];\n\t\tif (fnName === \"$any\" || fnName === \"$event\") continue;\n\t\tissues.push({\n\t\t\tseverity: \"warning\",\n\t\t\tmessage: `${relPath} — function call \\`${fnName}()\\` in template re-runs on every change detection cycle`,\n\t\t\tfile: relPath,\n\t\t\tsuppressMatch: relPath,\n\t\t\tfix: { description: \"Replace the function call with a pre-computed property, a pipe, or use memoization to avoid re-execution on every change detection cycle.\" },\n\t\t\treportedBy: [\"angular-template-performance\"]\n\t\t});\n\t}\n\tconst bindingRegex = /\\[(\\w+)\\]\\s*=\\s*\"(\\w+)\\s*\\(/g;\n\twhile ((match = bindingRegex.exec(template)) !== null) {\n\t\tconst fnName = match[2];\n\t\tif (fnName === \"$any\" || fnName === \"$event\") continue;\n\t\tissues.push({\n\t\t\tseverity: \"warning\",\n\t\t\tmessage: `${relPath} — function call \\`${fnName}()\\` in property binding re-runs on every change detection cycle`,\n\t\t\tfile: relPath,\n\t\t\tsuppressMatch: relPath,\n\t\t\tfix: { description: \"Replace the function call with a pre-computed property, a pipe, or use memoization to avoid re-execution on every change detection cycle.\" },\n\t\t\treportedBy: [\"angular-template-performance\"]\n\t\t});\n\t}\n}\nfunction findComponentFiles(dir, projectRoot, isRoot = true) {\n\tconst files = [];\n\ttry {\n\t\tfor (const entry of readdirSync(dir)) {\n\t\t\tif (entry.startsWith(\".\") || entry === \"node_modules\") continue;\n\t\t\tconst fullPath = join(dir, entry);\n\t\t\tif (statSync(fullPath).isDirectory()) files.push(...findComponentFiles(fullPath, projectRoot, false));\n\t\t\telse if (entry.endsWith(\".component.ts\")) files.push({\n\t\t\t\trelPath: relativeFromRoot(projectRoot, fullPath),\n\t\t\t\tfullPath\n\t\t\t});\n\t\t}\n\t} catch (err) {\n\t\tif (isRoot) {\n\t\t\tconst code = err.code;\n\t\t\tif (code !== \"ENOENT\" && code !== \"ENOTDIR\") throw err;\n\t\t}\n\t}\n\treturn files;\n}\n//#endregion\n//#region src/utils/exclude.ts\n/**\n* Creates a filter function that tests file paths against glob exclude patterns.\n* Returns a function: (filePath) => true if the file should be excluded.\n*/\nfunction createExcludeFilter(patterns) {\n\tif (patterns.length === 0) return () => false;\n\tconst isMatch = picomatch(patterns);\n\treturn (filePath) => isMatch(filePath);\n}\n//#endregion\n//#region src/integrations/asset-size.ts\n/**\n* AssetSizeRunner scans common asset directories for images, SVGs, and fonts, and checks their file sizes against defined thresholds.\n* It reports individual files that exceed size limits, as well as the total asset size for the project.\n* The runner provides actionable feedback on optimizing large assets to improve web performance.\n*/\nconst ASSET_DIRS = [\n\t\"public\",\n\t\"src/assets\",\n\t\"static\",\n\t\"assets\"\n];\nconst IMAGE_EXTENSIONS = new Set([\n\t\".png\",\n\t\".jpg\",\n\t\".jpeg\",\n\t\".gif\",\n\t\".webp\",\n\t\".bmp\",\n\t\".ico\"\n]);\nconst SVG_EXTENSION = \".svg\";\nconst FONT_EXTENSIONS = new Set([\n\t\".woff\",\n\t\".woff2\",\n\t\".ttf\",\n\t\".otf\",\n\t\".eot\"\n]);\nconst SKIP_EXTENSIONS = new Set([\n\t\".mp4\",\n\t\".webm\",\n\t\".ogg\",\n\t\".mp3\",\n\t\".wav\",\n\t\".flac\",\n\t\".avi\",\n\t\".mov\"\n]);\nconst IMAGE_WARN = 500 * 1024;\nconst IMAGE_CRITICAL = 2 * 1024 * 1024;\nconst SVG_WARN = 100 * 1024;\nconst FONT_WARN = 500 * 1024;\nconst TOTAL_WARN = 5 * 1024 * 1024;\nconst TOTAL_CRITICAL = 10 * 1024 * 1024;\nvar AssetSizeRunner = class extends BaseRunner {\n\tname = \"asset-size\";\n\tcategory = \"performance\";\n\tapplicableRuntimes = [\"browser\"];\n\tasync run(projectPath, options) {\n\t\tconst elapsed = timer();\n\t\tconst t = options?.checkConfig?.thresholds;\n\t\tconst imageWarn = t?.imageWarn ?? IMAGE_WARN;\n\t\tconst imageCritical = t?.imageCritical ?? IMAGE_CRITICAL;\n\t\tconst svgWarn = t?.svgWarn ?? SVG_WARN;\n\t\tconst fontWarn = t?.fontWarn ?? FONT_WARN;\n\t\tconst totalWarn = t?.totalWarn ?? TOTAL_WARN;\n\t\tconst totalCritical = t?.totalCritical ?? TOTAL_CRITICAL;\n\t\tconst isExcluded = createExcludeFilter(options?.checkConfig?.exclude ?? []);\n\t\ttry {\n\t\t\tconst assets = [];\n\t\t\tfor (const dir of ASSET_DIRS) if (fileExists(projectPath, dir)) scanAssets(join(projectPath, dir), projectPath, assets, isExcluded);\n\t\t\tconst issues = [];\n\t\t\tlet totalSize = 0;\n\t\t\tfor (const asset of assets) {\n\t\t\t\ttotalSize += asset.size;\n\t\t\t\tconst sizeKB = Math.round(asset.size / 1024);\n\t\t\t\tconst sizeMB = (asset.size / (1024 * 1024)).toFixed(1);\n\t\t\t\tif (asset.type === \"image\") {\n\t\t\t\t\tif (asset.size > imageCritical) issues.push({\n\t\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\t\tmessage: `${asset.path} — ${sizeMB}MB image (exceeds 2MB)`,\n\t\t\t\t\t\tsuppressMatch: asset.path,\n\t\t\t\t\t\tfile: asset.path,\n\t\t\t\t\t\tfix: { description: \"Compress with tools like squoosh.app, tinypng.com, or convert to WebP/AVIF format\" },\n\t\t\t\t\t\treportedBy: [\"asset-size\"]\n\t\t\t\t\t});\n\t\t\t\t\telse if (asset.size > imageWarn) issues.push({\n\t\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\t\tmessage: `${asset.path} — ${sizeKB}KB image (exceeds 500KB)`,\n\t\t\t\t\t\tsuppressMatch: asset.path,\n\t\t\t\t\t\tfile: asset.path,\n\t\t\t\t\t\tfix: { description: \"Compress or convert to a more efficient format (WebP, AVIF)\" },\n\t\t\t\t\t\treportedBy: [\"asset-size\"]\n\t\t\t\t\t});\n\t\t\t\t} else if (asset.type === \"svg\") {\n\t\t\t\t\tif (asset.size > svgWarn) issues.push({\n\t\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\t\tmessage: `${asset.path} — ${sizeKB}KB SVG (exceeds 100KB, likely unoptimized)`,\n\t\t\t\t\t\tsuppressMatch: asset.path,\n\t\t\t\t\t\tfile: asset.path,\n\t\t\t\t\t\tfix: { description: \"Optimize with SVGO or svgomg.net — remove metadata, simplify paths\" },\n\t\t\t\t\t\treportedBy: [\"asset-size\"]\n\t\t\t\t\t});\n\t\t\t\t} else if (asset.type === \"font\") {\n\t\t\t\t\tif (asset.size > fontWarn) issues.push({\n\t\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\t\tmessage: `${asset.path} — ${sizeKB}KB font (exceeds 500KB)`,\n\t\t\t\t\t\tsuppressMatch: asset.path,\n\t\t\t\t\t\tfile: asset.path,\n\t\t\t\t\t\tfix: { description: \"Subset the font to include only needed characters, or use WOFF2 format\" },\n\t\t\t\t\t\treportedBy: [\"asset-size\"]\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst totalMB = (totalSize / (1024 * 1024)).toFixed(1);\n\t\t\tif (totalSize > totalCritical) issues.push({\n\t\t\t\tseverity: \"critical\",\n\t\t\t\tmessage: `Total asset size is ${totalMB}MB — exceeds 10MB threshold`,\n\t\t\t\tfix: { description: \"Review and optimize all static assets to reduce total payload\" },\n\t\t\t\treportedBy: [\"asset-size\"]\n\t\t\t});\n\t\t\telse if (totalSize > totalWarn) issues.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tmessage: `Total asset size is ${totalMB}MB — consider optimizing`,\n\t\t\t\tfix: { description: \"Compress images, subset fonts, and remove unused assets\" },\n\t\t\t\treportedBy: [\"asset-size\"]\n\t\t\t});\n\t\t\tconst criticalCount = issues.filter((i) => i.severity === \"critical\").length;\n\t\t\tconst warningCount = issues.filter((i) => i.severity === \"warning\").length;\n\t\t\tconst score = Math.max(20, 100 - criticalCount * 20 - warningCount * 8);\n\t\t\treturn {\n\t\t\t\tid: \"asset-size\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Asset Sizes\",\n\t\t\t\tscore,\n\t\t\t\tstatus: criticalCount > 0 ? \"fail\" : warningCount > 0 ? \"warning\" : \"pass\",\n\t\t\t\tissues,\n\t\t\t\ttoolsUsed: [\"asset-size\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: {\n\t\t\t\t\ttotalAssets: assets.length,\n\t\t\t\t\ttotalSizeBytes: totalSize,\n\t\t\t\t\ttotalSizeMB: totalMB,\n\t\t\t\t\timages: assets.filter((a) => a.type === \"image\").length,\n\t\t\t\t\tsvgs: assets.filter((a) => a.type === \"svg\").length,\n\t\t\t\t\tfonts: assets.filter((a) => a.type === \"font\").length\n\t\t\t\t}\n\t\t\t};\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tid: \"asset-size\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Asset Sizes\",\n\t\t\t\tscore: 0,\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tissues: [{\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\tmessage: `Asset size check failed: ${err}`,\n\t\t\t\t\treportedBy: [\"asset-size\"]\n\t\t\t\t}],\n\t\t\t\ttoolsUsed: [\"asset-size\"],\n\t\t\t\tduration: elapsed()\n\t\t\t};\n\t\t}\n\t}\n};\nfunction scanAssets(dir, projectRoot, assets, isExcluded) {\n\ttry {\n\t\tfor (const entry of readdirSync(dir)) {\n\t\t\tif (entry.startsWith(\".\") || entry === \"node_modules\") continue;\n\t\t\tconst fullPath = join(dir, entry);\n\t\t\tif (isExcluded(relativeFromRoot(projectRoot, fullPath))) continue;\n\t\t\tconst stat = statSync(fullPath);\n\t\t\tif (stat.isDirectory()) scanAssets(fullPath, projectRoot, assets, isExcluded);\n\t\t\telse {\n\t\t\t\tconst ext = extname(entry).toLowerCase();\n\t\t\t\tif (SKIP_EXTENSIONS.has(ext)) continue;\n\t\t\t\tlet type = \"other\";\n\t\t\t\tif (IMAGE_EXTENSIONS.has(ext)) type = \"image\";\n\t\t\t\telse if (ext === SVG_EXTENSION) type = \"svg\";\n\t\t\t\telse if (FONT_EXTENSIONS.has(ext)) type = \"font\";\n\t\t\t\telse continue;\n\t\t\t\tassets.push({\n\t\t\t\t\tpath: relativeFromRoot(projectRoot, fullPath),\n\t\t\t\t\tsize: stat.size,\n\t\t\t\t\ttype\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t} catch {}\n}\n//#endregion\n//#region src/utils/file-types.ts\nconst FILE_TYPE_THRESHOLDS = {\n\t\"react-component\": {\n\t\twarn: 300,\n\t\tcritical: 500\n\t},\n\t\"custom-hook\": {\n\t\twarn: 150,\n\t\tcritical: 250\n\t},\n\t\"node-service\": {\n\t\twarn: 500,\n\t\tcritical: 800\n\t},\n\t\"route-file\": {\n\t\twarn: 250,\n\t\tcritical: 400\n\t},\n\t\"ts-utility\": {\n\t\twarn: 600,\n\t\tcritical: 1e3\n\t},\n\tconfig: {\n\t\twarn: Infinity,\n\t\tcritical: Infinity\n\t},\n\ttest: {\n\t\twarn: Infinity,\n\t\tcritical: Infinity\n\t},\n\tgeneral: {\n\t\twarn: 400,\n\t\tcritical: 600\n\t}\n};\nconst TEST_PATTERN = /\\.(test|spec)\\.(ts|tsx|js|jsx|mts|cts)$/;\nconst CONFIG_PATTERN = /\\.(config|rc)\\.(ts|js|mjs|cjs|json)$/;\nconst CONFIG_NAMES = new Set([\n\t\".eslintrc.js\",\n\t\".eslintrc.cjs\",\n\t\".prettierrc.js\",\n\t\"tailwind.config.js\",\n\t\"tailwind.config.ts\",\n\t\"postcss.config.js\",\n\t\"postcss.config.ts\",\n\t\"next.config.js\",\n\t\"next.config.ts\",\n\t\"next.config.mjs\",\n\t\"tsconfig.json\"\n]);\nconst HOOK_PATTERN = /^use[A-Z]/;\nconst ROUTE_NAMES = new Set([\n\t\"page.tsx\",\n\t\"page.jsx\",\n\t\"layout.tsx\",\n\t\"layout.jsx\",\n\t\"loading.tsx\",\n\t\"error.tsx\",\n\t\"not-found.tsx\"\n]);\nconst ROUTE_PATH_PATTERN = /[/\\\\](routes?|router)[/\\\\]/i;\nconst SERVICE_PATTERN = /\\.(service|controller|middleware|handler)\\.(ts|js)$/;\nconst COMPONENT_EXTENSIONS$1 = new Set([\".tsx\", \".jsx\"]);\nfunction classifyFile(filePath) {\n\tconst name = basename(filePath);\n\tconst ext = extname(name);\n\tif (TEST_PATTERN.test(name)) return \"test\";\n\tif (CONFIG_PATTERN.test(name) || CONFIG_NAMES.has(name)) return \"config\";\n\tif (HOOK_PATTERN.test(name) && (ext === \".ts\" || ext === \".tsx\")) return \"custom-hook\";\n\tif (ROUTE_NAMES.has(name)) return \"route-file\";\n\tif (ROUTE_PATH_PATTERN.test(filePath)) return \"route-file\";\n\tif (SERVICE_PATTERN.test(name)) return \"node-service\";\n\tif (COMPONENT_EXTENSIONS$1.has(ext)) return \"react-component\";\n\tif ([\n\t\t\".ts\",\n\t\t\".js\",\n\t\t\".mts\",\n\t\t\".cts\",\n\t\t\".mjs\",\n\t\t\".cjs\"\n\t].includes(ext)) return \"ts-utility\";\n\treturn \"general\";\n}\nfunction getThresholds(filePath) {\n\tconst fileType = classifyFile(filePath);\n\treturn {\n\t\t...FILE_TYPE_THRESHOLDS[fileType],\n\t\tfileType\n\t};\n}\nconst FILE_TYPE_LABELS = {\n\t\"react-component\": \"React component\",\n\t\"custom-hook\": \"custom hook\",\n\t\"node-service\": \"service\",\n\t\"route-file\": \"route file\",\n\t\"ts-utility\": \"utility\",\n\tconfig: \"config\",\n\ttest: \"test\",\n\tgeneral: \"file\"\n};\nfunction getFileTypeLabel(fileType) {\n\treturn FILE_TYPE_LABELS[fileType];\n}\n//#endregion\n//#region src/integrations/complexity.ts\n/**\n* ComplexityRunner analyzes the source code files in the 'src' directory to identify files with high line counts, which can indicate complexity and maintenance challenges.\n* It reports files that exceed defined line thresholds, providing feedback on potential refactoring opportunities to improve code maintainability.\n* The runner also calculates overall statistics such as total lines of code and average lines per file to give a broader view of code complexity in the project.\n*/\nconst SOURCE_EXTENSIONS$2 = new Set([\n\t\".ts\",\n\t\".tsx\",\n\t\".js\",\n\t\".jsx\",\n\t\".mts\",\n\t\".cts\"\n]);\nconst SOURCE_DIRS$1 = [\n\t\"src\",\n\t\"app\",\n\t\"lib\"\n];\nvar ComplexityRunner = class extends BaseRunner {\n\tname = \"complexity\";\n\tcategory = \"code-quality\";\n\tasync isApplicable(projectPath) {\n\t\treturn SOURCE_DIRS$1.some((dir) => existsSync(join(projectPath, dir)));\n\t}\n\tasync run(projectPath, options) {\n\t\tconst elapsed = timer();\n\t\tconst userThresholds = options?.checkConfig?.thresholds;\n\t\tconst mergedThresholds = { ...FILE_TYPE_THRESHOLDS };\n\t\tif (userThresholds) for (const [key, overrides] of Object.entries(userThresholds)) {\n\t\t\tconst ft = key;\n\t\t\tif (mergedThresholds[ft] && overrides) mergedThresholds[ft] = {\n\t\t\t\twarn: overrides.warn ?? mergedThresholds[ft].warn,\n\t\t\t\tcritical: overrides.critical ?? mergedThresholds[ft].critical\n\t\t\t};\n\t\t}\n\t\tconst resolveThresholds = (filePath) => {\n\t\t\tconst fileType = classifyFile(filePath);\n\t\t\treturn {\n\t\t\t\t...mergedThresholds[fileType],\n\t\t\t\tfileType\n\t\t\t};\n\t\t};\n\t\tconst isExcluded = createExcludeFilter(options?.checkConfig?.exclude ?? []);\n\t\ttry {\n\t\t\tconst files = SOURCE_DIRS$1.flatMap((dir) => existsSync(join(projectPath, dir)) ? scanDirectory$3(join(projectPath, dir), projectPath, isExcluded) : []);\n\t\t\tconst issues = [];\n\t\t\tlet oversizedCount = 0;\n\t\t\tfor (const f of files) {\n\t\t\t\tconst { warn, critical, fileType } = resolveThresholds(f.path);\n\t\t\t\tif (f.lines >= warn) {\n\t\t\t\t\toversizedCount++;\n\t\t\t\t\tconst label = getFileTypeLabel(fileType);\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tseverity: f.lines >= critical ? \"warning\" : \"info\",\n\t\t\t\t\t\tmessage: `${f.path} (${label}): ${f.lines} lines — consider splitting (threshold: ${warn})`,\n\t\t\t\t\t\tsuppressMatch: f.path,\n\t\t\t\t\t\tfix: { description: \"Extract concerns into smaller, focused files\" },\n\t\t\t\t\t\treportedBy: [\"complexity\"]\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst totalLines = files.reduce((sum, f) => sum + f.lines, 0);\n\t\t\tconst avgLines = files.length > 0 ? Math.round(totalLines / files.length) : 0;\n\t\t\tconst score = Math.max(0, 100 - oversizedCount * 10);\n\t\t\tconst topFiles = [...files].sort((a, b) => b.lines - a.lines).slice(0, 10).map((f) => {\n\t\t\t\tconst { warn, critical, fileType } = resolveThresholds(f.path);\n\t\t\t\treturn {\n\t\t\t\t\t...f,\n\t\t\t\t\tfileType,\n\t\t\t\t\twarn,\n\t\t\t\t\tcritical\n\t\t\t\t};\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tid: \"complexity\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"File Complexity\",\n\t\t\t\tscore,\n\t\t\t\tstatus: issues.some((i) => i.severity === \"warning\") ? \"warning\" : oversizedCount > 0 ? \"warning\" : \"pass\",\n\t\t\t\tissues,\n\t\t\t\ttoolsUsed: [\"complexity\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: {\n\t\t\t\t\ttotalFiles: files.length,\n\t\t\t\t\ttotalLines,\n\t\t\t\t\tavgLines,\n\t\t\t\t\toversizedCount,\n\t\t\t\t\ttopFiles\n\t\t\t\t}\n\t\t\t};\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tid: \"complexity\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"File Complexity\",\n\t\t\t\tscore: 0,\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tissues: [{\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\tmessage: `Complexity scan failed: ${err}`,\n\t\t\t\t\treportedBy: [\"complexity\"]\n\t\t\t\t}],\n\t\t\t\ttoolsUsed: [\"complexity\"],\n\t\t\t\tduration: elapsed()\n\t\t\t};\n\t\t}\n\t}\n};\nfunction scanDirectory$3(dir, projectRoot, isExcluded) {\n\tconst files = [];\n\ttry {\n\t\tfor (const entry of readdirSync(dir)) {\n\t\t\tif (entry.startsWith(\".\") || entry === \"node_modules\" || entry === \"__tests__\" || entry === \"test\" || entry === \"tests\") continue;\n\t\t\tconst fullPath = join(dir, entry);\n\t\t\tif (statSync(fullPath).isDirectory()) files.push(...scanDirectory$3(fullPath, projectRoot, isExcluded));\n\t\t\telse if (SOURCE_EXTENSIONS$2.has(extname(entry)) && !isTestFile$1(entry)) {\n\t\t\t\tconst relPath = relativeFromRoot(projectRoot, fullPath);\n\t\t\t\tif (isExcluded(relPath)) continue;\n\t\t\t\ttry {\n\t\t\t\t\tconst lines = readFileSync(fullPath, \"utf-8\").split(\"\\n\").filter((l) => l.trim()).length;\n\t\t\t\t\tfiles.push({\n\t\t\t\t\t\tpath: relPath,\n\t\t\t\t\t\tlines\n\t\t\t\t\t});\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t}\n\t} catch {}\n\treturn files;\n}\nfunction isTestFile$1(filename) {\n\treturn /\\.(test|spec)\\.(ts|tsx|js|jsx|mts|cts)$/.test(filename);\n}\n//#endregion\n//#region src/utils/detect-project.ts\n/**\n* detectProject analyzes the given project directory to extract key information about the project setup.\n* It reads the package.json file to determine the project's name, version, dependencies, and devDependencies.\n* The function checks for the presence of TypeScript configuration and ESLint/Prettier configurations to infer if those tools are being used.\n* It also detects the framework used (e.g., Next.js, Vite, Create React App) based on dependencies and configuration files.\n* Finally, it identifies the package manager in use by checking for lock files (pnpm-lock.yaml, yarn.lock).\n* This information is crucial for tailoring checks and recommendations specific to the project's technology stack and tooling.\n*/\nasync function detectProject(projectPath) {\n\tconst pkgPath = join(projectPath, \"package.json\");\n\tif (!existsSync(pkgPath)) throw new Error(`No package.json found at ${projectPath}`);\n\tconst pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n\tconst deps = pkg.dependencies ?? {};\n\tconst devDeps = pkg.devDependencies ?? {};\n\tconst catalog = loadPnpmCatalog(projectPath);\n\tif (catalog) {\n\t\tfor (const [name, ver] of Object.entries(deps)) if (ver.startsWith(\"catalog:\")) deps[name] = catalog[name] ?? ver;\n\t\tfor (const [name, ver] of Object.entries(devDeps)) if (ver.startsWith(\"catalog:\")) devDeps[name] = catalog[name] ?? ver;\n\t}\n\tconst allDeps = {\n\t\t...deps,\n\t\t...devDeps\n\t};\n\tconst rawOverrides = pkg.pnpm?.overrides ?? pkg.overrides ?? pkg.resolutions ?? void 0;\n\tconst overrides = rawOverrides && Object.keys(rawOverrides).length > 0 ? rawOverrides : void 0;\n\treturn {\n\t\tname: pkg.name ?? \"unknown\",\n\t\tversion: pkg.version ?? \"0.0.0\",\n\t\thasTypeScript: existsSync(join(projectPath, \"tsconfig.json\")) || \"typescript\" in allDeps,\n\t\thasESLint: existsSync(join(projectPath, \".eslintrc.js\")) || existsSync(join(projectPath, \".eslintrc.json\")) || existsSync(join(projectPath, \"eslint.config.js\")) || \"eslint\" in allDeps,\n\t\thasPrettier: existsSync(join(projectPath, \".prettierrc\")) || existsSync(join(projectPath, \".prettierrc.json\")) || \"prettier\" in allDeps,\n\t\tframework: detectFramework(allDeps),\n\t\tpackageManager: detectPackageManager(projectPath),\n\t\ttotalDependencies: Object.keys(allDeps).length,\n\t\tdependencies: deps,\n\t\tdevDependencies: devDeps,\n\t\toverrides\n\t};\n}\nfunction detectFramework(deps) {\n\tif (\"next\" in deps) return \"next\";\n\tif (\"@angular/core\" in deps) return \"angular\";\n\tif (\"@vitejs/plugin-react\" in deps || \"vite\" in deps) return \"vite\";\n\tif (\"react-scripts\" in deps) return \"cra\";\n\tif (\"react\" in deps) return \"react\";\n\tif (\"express\" in deps) return \"express\";\n\tif (\"fastify\" in deps) return \"fastify\";\n\tif (\"koa\" in deps) return \"koa\";\n\tif (\"hono\" in deps) return \"hono\";\n\tif (\"@hapi/hapi\" in deps || \"hapi\" in deps) return \"hapi\";\n\treturn \"node\";\n}\nfunction detectPackageManager(projectPath) {\n\tlet dir = projectPath;\n\twhile (true) {\n\t\tif (existsSync(join(dir, \"pnpm-lock.yaml\"))) return \"pnpm\";\n\t\tif (existsSync(join(dir, \"yarn.lock\"))) return \"yarn\";\n\t\tif (existsSync(join(dir, \"bun.lockb\")) || existsSync(join(dir, \"bun.lock\"))) return \"bun\";\n\t\tconst parent = dirname(dir);\n\t\tif (parent === dir) break;\n\t\tdir = parent;\n\t}\n\treturn \"npm\";\n}\nasync function detectContext(projectPath) {\n\tconst pkgPath = join(projectPath, \"package.json\");\n\tif (!existsSync(pkgPath)) return {\n\t\truntime: \"unknown\",\n\t\tframeworks: [],\n\t\tbuildTool: \"unknown\",\n\t\ttestFramework: null\n\t};\n\tconst pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n\tconst deps = pkg.dependencies ?? {};\n\tconst devDeps = pkg.devDependencies ?? {};\n\tconst allDeps = {\n\t\t...deps,\n\t\t...devDeps\n\t};\n\tconst frameworks = [];\n\tif (\"@angular/core\" in allDeps) frameworks.push(\"angular\");\n\tif (\"next\" in allDeps) frameworks.push(\"react\", \"next\");\n\telse if (\"@remix-run/react\" in allDeps) frameworks.push(\"react\", \"remix\");\n\telse if (\"react\" in allDeps) frameworks.push(\"react\");\n\tif (\"vue\" in allDeps) frameworks.push(\"vue\");\n\tif (\"svelte\" in allDeps) frameworks.push(\"svelte\");\n\tconst runtime = frameworks.length === 0 ? \"node\" : \"browser\";\n\tlet buildTool = \"unknown\";\n\tif (\"vite\" in allDeps || \"@vitejs/plugin-react\" in allDeps) buildTool = \"vite\";\n\telse if (\"webpack\" in allDeps) buildTool = \"webpack\";\n\telse if (\"esbuild\" in allDeps) buildTool = \"esbuild\";\n\telse if (\"rollup\" in allDeps) buildTool = \"rollup\";\n\telse if (\"next\" in allDeps) buildTool = \"webpack\";\n\telse if (\"typescript\" in allDeps) buildTool = \"tsc\";\n\tlet testFramework = null;\n\tif (\"vitest\" in allDeps) testFramework = \"vitest\";\n\telse if (\"jest\" in allDeps) testFramework = \"jest\";\n\telse if (\"mocha\" in allDeps) testFramework = \"mocha\";\n\treturn {\n\t\truntime,\n\t\tframeworks,\n\t\tbuildTool,\n\t\ttestFramework\n\t};\n}\n/**\n* Walk up from projectPath to find pnpm-workspace.yaml and parse its catalog section.\n* Returns a map of package name → version, or null if no catalog is found.\n*/\nfunction loadPnpmCatalog(projectPath) {\n\tlet dir = projectPath;\n\twhile (true) {\n\t\tconst wsPath = join(dir, \"pnpm-workspace.yaml\");\n\t\tif (existsSync(wsPath)) try {\n\t\t\treturn parseCatalogFromYaml(readFileSync(wsPath, \"utf-8\"));\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t\tconst parent = dirname(dir);\n\t\tif (parent === dir) break;\n\t\tdir = parent;\n\t}\n\treturn null;\n}\n/**\n* Minimal YAML parser for the catalog: section of pnpm-workspace.yaml.\n* Avoids adding a YAML parsing dependency — the catalog format is simple\n* key-value pairs under a `catalog:` heading.\n*/\nfunction parseCatalogFromYaml(content) {\n\tconst lines = content.split(\"\\n\");\n\tconst catalog = {};\n\tlet inCatalog = false;\n\tfor (const line of lines) {\n\t\tif (/^catalog:\\s*$/.test(line)) {\n\t\t\tinCatalog = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (inCatalog && /^\\S/.test(line)) break;\n\t\tif (inCatalog) {\n\t\t\tconst match = line.match(/^\\s+['\"]?([^'\":\\s][^'\":]*?)['\"]?\\s*:\\s*(.+)$/);\n\t\t\tif (match) catalog[match[1].trim()] = match[2].trim();\n\t\t}\n\t}\n\treturn Object.keys(catalog).length > 0 ? catalog : null;\n}\n//#endregion\n//#region src/integrations/coverage.ts\nconst COVERAGE_PATHS = [\"coverage/coverage-summary.json\", \"coverage/coverage-final.json\"];\nvar CoverageRunner = class extends BaseRunner {\n\tname = \"coverage\";\n\tcategory = \"code-quality\";\n\tasync isApplicable(projectPath) {\n\t\treturn COVERAGE_PATHS.some((p) => existsSync(join(projectPath, p))) || this.detectTestRunner(projectPath) !== null;\n\t}\n\tdetectTestRunner(projectPath) {\n\t\ttry {\n\t\t\tconst pkg = readPackageJson(projectPath);\n\t\t\tconst deps = {\n\t\t\t\t...pkg.dependencies ?? {},\n\t\t\t\t...pkg.devDependencies ?? {}\n\t\t\t};\n\t\t\tif (\"vitest\" in deps) return \"vitest\";\n\t\t\tif (\"jest\" in deps || \"@jest/core\" in deps) return \"jest\";\n\t\t} catch {}\n\t\treturn null;\n\t}\n\thasCoverageProvider(projectPath, runner) {\n\t\tif (runner === \"vitest\") {\n\t\t\tlet dir = projectPath;\n\t\t\twhile (true) {\n\t\t\t\tif (existsSync(join(dir, \"node_modules\", \"@vitest\", \"coverage-v8\")) || existsSync(join(dir, \"node_modules\", \"@vitest\", \"coverage-istanbul\"))) return true;\n\t\t\t\tconst parent = dirname(dir);\n\t\t\t\tif (parent === dir) break;\n\t\t\t\tdir = parent;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\tasync run(projectPath, options) {\n\t\tconst elapsed = timer();\n\t\tconst thresholds = options?.checkConfig?.thresholds;\n\t\tconst lineTarget = thresholds?.lines ?? 80;\n\t\tconst functionTarget = thresholds?.functions ?? 80;\n\t\tconst runner = this.detectTestRunner(projectPath);\n\t\tif (!runner) return this.readExistingCoverage(projectPath, elapsed, lineTarget);\n\t\ttry {\n\t\t\tconst hasCoverage = this.hasCoverageProvider(projectPath, runner);\n\t\t\tconst tmpFile = join(tmpdir(), `sickbay-test-${Date.now()}.json`);\n\t\t\tawait execa(runner, runner === \"vitest\" ? [\n\t\t\t\t\"run\",\n\t\t\t\t\"--reporter=json\",\n\t\t\t\t`--outputFile=${tmpFile}`,\n\t\t\t\t...hasCoverage ? [\"--coverage\", \"--coverage.reporter=json-summary\"] : []\n\t\t\t] : [\n\t\t\t\t\"--json\",\n\t\t\t\t`--outputFile=${tmpFile}`,\n\t\t\t\t...hasCoverage ? [\"--coverage\"] : []\n\t\t\t], {\n\t\t\t\tcwd: projectPath,\n\t\t\t\treject: false,\n\t\t\t\tlocalDir: projectPath,\n\t\t\t\tpreferLocal: true,\n\t\t\t\ttimeout: 12e4\n\t\t\t});\n\t\t\tlet testCounts = {\n\t\t\t\ttotal: 0,\n\t\t\t\tpassed: 0,\n\t\t\t\tfailed: 0,\n\t\t\t\tskipped: 0\n\t\t\t};\n\t\t\tif (existsSync(tmpFile)) try {\n\t\t\t\tconst parsed = JSON.parse(readFileSync(tmpFile, \"utf-8\"));\n\t\t\t\ttestCounts = {\n\t\t\t\t\ttotal: parsed.numTotalTests ?? 0,\n\t\t\t\t\tpassed: parsed.numPassedTests ?? 0,\n\t\t\t\t\tfailed: parsed.numFailedTests ?? 0,\n\t\t\t\t\tskipped: parsed.numSkippedTests ?? 0\n\t\t\t\t};\n\t\t\t} finally {\n\t\t\t\ttry {\n\t\t\t\t\tunlinkSync(tmpFile);\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t\tconst coveragePath = COVERAGE_PATHS.map((p) => join(projectPath, p)).find(existsSync);\n\t\t\tlet coverageData = null;\n\t\t\tif (coveragePath) try {\n\t\t\t\tconst raw = JSON.parse(readFileSync(coveragePath, \"utf-8\"));\n\t\t\t\tconst candidate = raw.total ?? raw;\n\t\t\t\tif (candidate?.lines?.pct !== void 0 && candidate?.statements?.pct !== void 0) coverageData = candidate;\n\t\t\t} catch {}\n\t\t\tconst packageManager = detectPackageManager(projectPath);\n\t\t\treturn this.buildResult(elapsed, testCounts, coverageData, runner, hasCoverage, packageManager, lineTarget, functionTarget);\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tid: \"coverage\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Tests & Coverage\",\n\t\t\t\tscore: 0,\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tissues: [{\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\tmessage: `Test run failed: ${err}`,\n\t\t\t\t\treportedBy: [\"coverage\"]\n\t\t\t\t}],\n\t\t\t\ttoolsUsed: [runner],\n\t\t\t\tduration: elapsed()\n\t\t\t};\n\t\t}\n\t}\n\tbuildResult(elapsed, counts, coverage, runner, hasCoverage, packageManager = \"npm\", lineTarget = 80, functionTarget = 80) {\n\t\tconst issues = [];\n\t\tif (counts.failed > 0) issues.push({\n\t\t\tseverity: \"critical\",\n\t\t\tmessage: `${counts.failed} test${counts.failed > 1 ? \"s\" : \"\"} failing (${counts.passed}/${counts.total} passing)`,\n\t\t\tfix: { description: \"Fix failing tests\" },\n\t\t\treportedBy: [\"coverage\"]\n\t\t});\n\t\tif (coverage) {\n\t\t\tif (coverage.lines.pct < lineTarget) issues.push({\n\t\t\t\tseverity: coverage.lines.pct < 50 ? \"critical\" : \"warning\",\n\t\t\t\tmessage: `Line coverage: ${coverage.lines.pct.toFixed(1)}% (target: ${lineTarget}%)`,\n\t\t\t\tfix: { description: \"Add tests to improve coverage\" },\n\t\t\t\treportedBy: [\"coverage\"]\n\t\t\t});\n\t\t\tif (coverage.functions.pct < functionTarget) issues.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tmessage: `Function coverage: ${coverage.functions.pct.toFixed(1)}% (target: ${functionTarget}%)`,\n\t\t\t\tfix: { description: \"Add tests for uncovered functions\" },\n\t\t\t\treportedBy: [\"coverage\"]\n\t\t\t});\n\t\t} else if (!hasCoverage && counts.total > 0) issues.push({\n\t\t\tseverity: \"info\",\n\t\t\tmessage: \"Coverage data unavailable — install @vitest/coverage-v8 for coverage reporting\",\n\t\t\tfix: {\n\t\t\t\tdescription: \"Add coverage provider\",\n\t\t\t\tcommand: `${packageManager} add -D @vitest/coverage-v8`\n\t\t\t},\n\t\t\treportedBy: [\"coverage\"]\n\t\t});\n\t\tlet score = 100;\n\t\tif (counts.total > 0 && counts.failed > 0) score = Math.round(100 * (counts.passed / counts.total));\n\t\tif (coverage) {\n\t\t\tconst covAvg = (coverage.lines.pct + coverage.statements.pct + coverage.functions.pct + coverage.branches.pct) / 4;\n\t\t\tscore = Math.round(score * .6 + covAvg * .4);\n\t\t}\n\t\tconst status = counts.failed > 0 ? \"fail\" : coverage && coverage.lines.pct < 50 ? \"fail\" : coverage && coverage.lines.pct < lineTarget ? \"warning\" : issues.length > 0 ? \"warning\" : \"pass\";\n\t\treturn {\n\t\t\tid: \"coverage\",\n\t\t\tcategory: this.category,\n\t\t\tname: \"Tests & Coverage\",\n\t\t\tscore,\n\t\t\tstatus,\n\t\t\tissues,\n\t\t\ttoolsUsed: [runner],\n\t\t\tduration: elapsed(),\n\t\t\tmetadata: {\n\t\t\t\ttestRunner: runner,\n\t\t\t\ttotalTests: counts.total,\n\t\t\t\tpassed: counts.passed,\n\t\t\t\tfailed: counts.failed,\n\t\t\t\tskipped: counts.skipped,\n\t\t\t\t...coverage ? {\n\t\t\t\t\tlines: coverage.lines.pct,\n\t\t\t\t\tstatements: coverage.statements.pct,\n\t\t\t\t\tfunctions: coverage.functions.pct,\n\t\t\t\t\tbranches: coverage.branches.pct\n\t\t\t\t} : {}\n\t\t\t}\n\t\t};\n\t}\n\treadExistingCoverage(projectPath, elapsed, lineTarget = 80) {\n\t\tconst coveragePath = COVERAGE_PATHS.map((p) => join(projectPath, p)).find(existsSync);\n\t\tif (!coveragePath) return this.skipped(\"No test runner or coverage report found\");\n\t\ttry {\n\t\t\tconst raw = JSON.parse(readFileSync(coveragePath, \"utf-8\"));\n\t\t\tconst candidate = raw.total ?? raw;\n\t\t\tif (!candidate?.lines?.pct || !candidate?.statements?.pct) return this.skipped(\"Coverage report format not recognized\");\n\t\t\tconst { lines, statements, functions, branches } = candidate;\n\t\t\tconst avg = (lines.pct + statements.pct + functions.pct + branches.pct) / 4;\n\t\t\tconst issues = [];\n\t\t\tif (lines.pct < lineTarget) issues.push({\n\t\t\t\tseverity: lines.pct < 50 ? \"critical\" : \"warning\",\n\t\t\t\tmessage: `Line coverage: ${lines.pct.toFixed(1)}% (target: ${lineTarget}%)`,\n\t\t\t\treportedBy: [\"coverage\"]\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tid: \"coverage\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Tests & Coverage\",\n\t\t\t\tscore: Math.round(avg),\n\t\t\t\tstatus: avg >= lineTarget ? \"pass\" : avg >= 50 ? \"warning\" : \"fail\",\n\t\t\t\tissues,\n\t\t\t\ttoolsUsed: [\"coverage\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: {\n\t\t\t\t\tlines: lines.pct,\n\t\t\t\t\tstatements: statements.pct,\n\t\t\t\t\tfunctions: functions.pct,\n\t\t\t\t\tbranches: branches.pct\n\t\t\t\t}\n\t\t\t};\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tid: \"coverage\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Tests & Coverage\",\n\t\t\t\tscore: 0,\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tissues: [{\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\tmessage: `Failed to parse coverage: ${err}`,\n\t\t\t\t\treportedBy: [\"coverage\"]\n\t\t\t\t}],\n\t\t\t\ttoolsUsed: [\"coverage\"],\n\t\t\t\tduration: elapsed()\n\t\t\t};\n\t\t}\n\t}\n};\n//#endregion\n//#region src/integrations/depcheck.ts\nvar DepcheckRunner = class extends BaseRunner {\n\tname = \"depcheck\";\n\tcategory = \"dependencies\";\n\tasync run(projectPath) {\n\t\tconst elapsed = timer();\n\t\tif (!await isCommandAvailable(\"depcheck\")) return this.skipped(\"depcheck not installed — run: npm i -g depcheck\");\n\t\ttry {\n\t\t\tconst { stdout } = await execa(\"depcheck\", [\"--json\"], {\n\t\t\t\tcwd: projectPath,\n\t\t\t\treject: false,\n\t\t\t\tpreferLocal: true,\n\t\t\t\tlocalDir: coreLocalDir\n\t\t\t});\n\t\t\tconst data = parseJsonOutput(stdout, \"{}\");\n\t\t\tconst pm = detectPackageManager(projectPath);\n\t\t\tconst issues = [];\n\t\t\tfor (const [dep, files] of Object.entries(data.missing ?? {})) {\n\t\t\t\tif (dep.startsWith(\"virtual:\") || dep.startsWith(\"node:\")) continue;\n\t\t\t\tissues.push({\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\tmessage: `Missing dependency: ${dep} (used in ${files.length} file${files.length > 1 ? \"s\" : \"\"})`,\n\t\t\t\t\tsuppressMatch: dep,\n\t\t\t\t\tfix: {\n\t\t\t\t\t\tdescription: `Install ${dep}`,\n\t\t\t\t\t\tcommand: `${pm} install ${dep}`\n\t\t\t\t\t},\n\t\t\t\t\treportedBy: [\"depcheck\"]\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst score = Math.max(0, 100 - issues.length * 5);\n\t\t\treturn {\n\t\t\t\tid: \"depcheck\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Dependency Health\",\n\t\t\t\tscore,\n\t\t\t\tstatus: issues.length === 0 ? \"pass\" : issues[0].severity === \"critical\" ? \"fail\" : \"warning\",\n\t\t\t\tissues,\n\t\t\t\ttoolsUsed: [\"depcheck\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: {\n\t\t\t\t\tunused: data.dependencies?.length ?? 0,\n\t\t\t\t\tmissing: Object.keys(data.missing ?? {}).length\n\t\t\t\t}\n\t\t\t};\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tid: \"depcheck\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Dependency Health\",\n\t\t\t\tscore: 0,\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tissues: [{\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\tmessage: `depcheck failed: ${err}`,\n\t\t\t\t\treportedBy: [\"depcheck\"]\n\t\t\t\t}],\n\t\t\t\ttoolsUsed: [\"depcheck\"],\n\t\t\t\tduration: elapsed()\n\t\t\t};\n\t\t}\n\t}\n};\n//#endregion\n//#region src/integrations/eslint.ts\nvar ESLintRunner = class extends BaseRunner {\n\tname = \"eslint\";\n\tcategory = \"code-quality\";\n\tasync isApplicable(projectPath) {\n\t\treturn existsSync(join(projectPath, \".eslintrc.js\")) || existsSync(join(projectPath, \".eslintrc.cjs\")) || existsSync(join(projectPath, \".eslintrc.json\")) || existsSync(join(projectPath, \".eslintrc.yml\")) || existsSync(join(projectPath, \"eslint.config.js\")) || existsSync(join(projectPath, \"eslint.config.mjs\")) || existsSync(join(projectPath, \"eslint.config.cjs\"));\n\t}\n\tasync run(projectPath, options) {\n\t\tconst elapsed = timer();\n\t\tconst maxErrors = (options?.checkConfig?.thresholds)?.maxErrors ?? 10;\n\t\ttry {\n\t\t\tconst dirsToScan = [\n\t\t\t\t\"src\",\n\t\t\t\t\"lib\",\n\t\t\t\t\"app\"\n\t\t\t].filter((d) => existsSync(join(projectPath, d)));\n\t\t\tif (dirsToScan.length === 0) return this.skipped(\"No source directory found (looked for src, lib, app)\");\n\t\t\tconst { stdout } = await execa(\"eslint\", [\n\t\t\t\t...dirsToScan,\n\t\t\t\t\"--format\",\n\t\t\t\t\"json\",\n\t\t\t\t\"--no-error-on-unmatched-pattern\"\n\t\t\t], {\n\t\t\t\tcwd: projectPath,\n\t\t\t\treject: false,\n\t\t\t\tpreferLocal: true,\n\t\t\t\ttimeout: 6e4\n\t\t\t});\n\t\t\tconst results = parseJsonOutput(stdout, \"[]\");\n\t\t\tlet totalErrors = 0;\n\t\t\tlet totalWarnings = 0;\n\t\t\tconst issues = [];\n\t\t\tfor (const file of results) {\n\t\t\t\ttotalErrors += file.errorCount;\n\t\t\t\ttotalWarnings += file.warningCount;\n\t\t\t\tif (file.errorCount > 0 || file.warningCount > 0) {\n\t\t\t\t\tconst relPath = relativeFromRoot(projectPath, file.filePath);\n\t\t\t\t\tconst parts = [];\n\t\t\t\t\tif (file.errorCount > 0) parts.push(`${file.errorCount} error${file.errorCount > 1 ? \"s\" : \"\"}`);\n\t\t\t\t\tif (file.warningCount > 0) parts.push(`${file.warningCount} warning${file.warningCount > 1 ? \"s\" : \"\"}`);\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tseverity: file.errorCount > 0 ? \"warning\" : \"info\",\n\t\t\t\t\t\tmessage: `${relPath}: ${parts.join(\", \")}`,\n\t\t\t\t\t\tsuppressMatch: relPath,\n\t\t\t\t\t\tfix: {\n\t\t\t\t\t\t\tdescription: `Fix ESLint issues in ${relPath}`,\n\t\t\t\t\t\t\tcommand: `eslint ${relPath} --fix`,\n\t\t\t\t\t\t\tmodifiesSource: true\n\t\t\t\t\t\t},\n\t\t\t\t\t\treportedBy: [\"eslint\"]\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst score = Math.max(0, 100 - totalErrors * 5 - Math.round(totalWarnings * .5));\n\t\t\treturn {\n\t\t\t\tid: \"eslint\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Lint\",\n\t\t\t\tscore,\n\t\t\t\tstatus: totalErrors > maxErrors ? \"fail\" : totalErrors > 0 ? \"warning\" : totalWarnings > 0 ? \"warning\" : \"pass\",\n\t\t\t\tissues,\n\t\t\t\ttoolsUsed: [\"eslint\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: {\n\t\t\t\t\terrors: totalErrors,\n\t\t\t\t\twarnings: totalWarnings,\n\t\t\t\t\tfiles: results.length\n\t\t\t\t}\n\t\t\t};\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tid: \"eslint\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Lint\",\n\t\t\t\tscore: 0,\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tissues: [{\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\tmessage: `ESLint failed: ${err}`,\n\t\t\t\t\treportedBy: [\"eslint\"]\n\t\t\t\t}],\n\t\t\t\ttoolsUsed: [\"eslint\"],\n\t\t\t\tduration: elapsed()\n\t\t\t};\n\t\t}\n\t}\n};\n//#endregion\n//#region src/integrations/git.ts\n/**\n* GitRunner analyzes the Git repository of the project to provide insights into its health and activity.\n* It checks for the presence of a .git directory to confirm applicability, then gathers data on the last commit date, total commit count, number of contributors, and remote branches.\n* The runner identifies potential issues such as stale repositories (no recent commits) and excessive remote branches, providing actionable feedback for maintaining a healthy Git history.\n* This helps ensure that the project is actively maintained and that the Git repository is well-managed.\n*/\nvar GitRunner = class extends BaseRunner {\n\tname = \"git\";\n\tcategory = \"git\";\n\tasync isApplicable(projectPath) {\n\t\treturn fileExists(projectPath, \".git\");\n\t}\n\tasync run(projectPath, options) {\n\t\tconst elapsed = timer();\n\t\tconst thresholds = options?.checkConfig?.thresholds;\n\t\tconst staleMonths = thresholds?.staleMonths ?? 6;\n\t\tconst maxRemoteBranches = thresholds?.maxRemoteBranches ?? 20;\n\t\ttry {\n\t\t\tconst [lastCommitResult, logCountResult, contributorsResult] = await Promise.allSettled([\n\t\t\t\texeca(\"git\", [\n\t\t\t\t\t\"log\",\n\t\t\t\t\t\"-1\",\n\t\t\t\t\t\"--format=%cr\"\n\t\t\t\t], { cwd: projectPath }),\n\t\t\t\texeca(\"git\", [\n\t\t\t\t\t\"rev-list\",\n\t\t\t\t\t\"--count\",\n\t\t\t\t\t\"HEAD\"\n\t\t\t\t], { cwd: projectPath }),\n\t\t\t\texeca(\"git\", [\n\t\t\t\t\t\"shortlog\",\n\t\t\t\t\t\"-sn\",\n\t\t\t\t\t\"--no-merges\",\n\t\t\t\t\t\"HEAD\"\n\t\t\t\t], { cwd: projectPath })\n\t\t\t]);\n\t\t\tconst hasRemote = (await execa(\"git\", [\"remote\"], {\n\t\t\t\tcwd: projectPath,\n\t\t\t\treject: false\n\t\t\t})).stdout.trim().length > 0;\n\t\t\tlet remoteBranches = 0;\n\t\t\tif (hasRemote) remoteBranches = (await execa(\"git\", [\"branch\", \"-r\"], {\n\t\t\t\tcwd: projectPath,\n\t\t\t\treject: false\n\t\t\t})).stdout.trim().split(\"\\n\").filter(Boolean).length;\n\t\t\tconst lastCommit = lastCommitResult.status === \"fulfilled\" ? lastCommitResult.value.stdout.trim() : \"unknown\";\n\t\t\tconst commitCount = logCountResult.status === \"fulfilled\" ? parseInt(logCountResult.value.stdout.trim(), 10) : 0;\n\t\t\tconst contributorCount = contributorsResult.status === \"fulfilled\" ? contributorsResult.value.stdout.trim().split(\"\\n\").filter(Boolean).length : 0;\n\t\t\tconst issues = [];\n\t\t\tif ((lastCommit.includes(\"year\") ? parseGitRelativeCount(lastCommit) * 12 : lastCommit.includes(\"month\") ? parseGitRelativeCount(lastCommit) : 0) > staleMonths) issues.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tmessage: `Last commit was ${lastCommit} — project may be stale`,\n\t\t\t\treportedBy: [\"git\"]\n\t\t\t});\n\t\t\tif (remoteBranches > maxRemoteBranches) issues.push({\n\t\t\t\tseverity: \"info\",\n\t\t\t\tmessage: `${remoteBranches} remote branches — consider pruning stale branches`,\n\t\t\t\tfix: {\n\t\t\t\t\tdescription: \"Clean up merged branches\",\n\t\t\t\t\tcommand: \"git remote prune origin\"\n\t\t\t\t},\n\t\t\t\treportedBy: [\"git\"]\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tid: \"git\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Git Health\",\n\t\t\t\tscore: issues.length === 0 ? 100 : 80,\n\t\t\t\tstatus: issues.length === 0 ? \"pass\" : \"warning\",\n\t\t\t\tissues,\n\t\t\t\ttoolsUsed: [\"git\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: {\n\t\t\t\t\tlastCommit,\n\t\t\t\t\tcommitCount,\n\t\t\t\t\tcontributorCount,\n\t\t\t\t\tremoteBranches\n\t\t\t\t}\n\t\t\t};\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tid: \"git\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Git Health\",\n\t\t\t\tscore: 0,\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tissues: [{\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\tmessage: `git analysis failed: ${err}`,\n\t\t\t\t\treportedBy: [\"git\"]\n\t\t\t\t}],\n\t\t\t\ttoolsUsed: [\"git\"],\n\t\t\t\tduration: elapsed()\n\t\t\t};\n\t\t}\n\t}\n};\n/**\n* Extract the leading numeric count from a git relative-date string like\n* \"3 months ago\" or \"a month ago\". The word \"a\"/\"an\" represents 1.\n* Returns 0 if the string can't be parsed (which keeps stale-detection\n* conservative — non-parseable strings won't trigger a stale warning).\n*/\nfunction parseGitRelativeCount(s) {\n\tconst trimmed = s.trim().toLowerCase();\n\tif (trimmed.startsWith(\"a \") || trimmed.startsWith(\"an \")) return 1;\n\tconst match = trimmed.match(/^(\\d+)\\b/);\n\treturn match ? parseInt(match[1], 10) : 0;\n}\n//#endregion\n//#region src/integrations/heavy-deps.ts\nconst HEAVY_DEPS = {\n\tmoment: {\n\t\talternative: \"dayjs or date-fns\",\n\t\treason: \"moment is 300KB+ and mutable — modern alternatives are ~2KB\",\n\t\tseverity: \"warning\"\n\t},\n\tlodash: {\n\t\talternative: \"lodash-es or individual lodash/* imports\",\n\t\treason: \"Full lodash bundle is 70KB+ — use tree-shakeable imports instead\",\n\t\tseverity: \"warning\"\n\t},\n\tunderscore: {\n\t\talternative: \"native JS methods (map, filter, reduce, etc.)\",\n\t\treason: \"Most underscore utilities have native equivalents\",\n\t\tseverity: \"warning\"\n\t},\n\tjquery: {\n\t\talternative: \"native DOM APIs (querySelector, fetch, classList, etc.)\",\n\t\treason: \"Modern browsers cover virtually all jQuery use cases natively\",\n\t\tseverity: \"warning\"\n\t},\n\trequest: {\n\t\talternative: \"native fetch or undici\",\n\t\treason: \"request is deprecated and heavy\",\n\t\tseverity: \"warning\"\n\t},\n\tbluebird: {\n\t\talternative: \"native Promises\",\n\t\treason: \"Native Promises are performant in modern Node/browsers\",\n\t\tseverity: \"info\"\n\t},\n\taxios: {\n\t\talternative: \"native fetch\",\n\t\treason: \"fetch is built-in to Node 18+ and all modern browsers\",\n\t\tseverity: \"info\"\n\t},\n\t\"left-pad\": {\n\t\talternative: \"String.prototype.padStart()\",\n\t\treason: \"padStart is a native JS method\",\n\t\tseverity: \"info\"\n\t},\n\t\"is-even\": {\n\t\talternative: \"n % 2 === 0\",\n\t\treason: \"Trivial one-liner — no package needed\",\n\t\tseverity: \"info\"\n\t},\n\t\"is-odd\": {\n\t\talternative: \"n % 2 !== 0\",\n\t\treason: \"Trivial one-liner — no package needed\",\n\t\tseverity: \"info\"\n\t},\n\t\"is-number\": {\n\t\talternative: \"typeof n === \\\"number\\\" or Number.isFinite()\",\n\t\treason: \"Trivial check — no package needed\",\n\t\tseverity: \"info\"\n\t},\n\tclassnames: {\n\t\talternative: \"clsx (lighter drop-in replacement)\",\n\t\treason: \"clsx is smaller and faster\",\n\t\tseverity: \"info\"\n\t},\n\t\"node-fetch\": {\n\t\talternative: \"native fetch (Node 18+)\",\n\t\treason: \"fetch is built-in to Node 18+\",\n\t\tseverity: \"info\"\n\t},\n\t\"moment-timezone\": {\n\t\talternative: \"Intl.DateTimeFormat or date-fns-tz\",\n\t\treason: \"moment-timezone bundles all IANA timezone data — 500KB+ unminified\",\n\t\tseverity: \"warning\"\n\t},\n\tuuid: {\n\t\talternative: \"crypto.randomUUID()\",\n\t\treason: \"crypto.randomUUID() is native in Node 14.17+ and all modern browsers\",\n\t\tseverity: \"info\"\n\t},\n\trimraf: {\n\t\talternative: \"fs.rm(path, { recursive: true, force: true })\",\n\t\treason: \"fs.rm with recursive option is built into Node 14.14+\",\n\t\tseverity: \"info\"\n\t},\n\tmkdirp: {\n\t\talternative: \"fs.mkdir(path, { recursive: true })\",\n\t\treason: \"fs.mkdir with recursive option is built into Node 10.12+\",\n\t\tseverity: \"info\"\n\t},\n\tqs: {\n\t\talternative: \"URLSearchParams\",\n\t\treason: \"URLSearchParams handles query string parsing natively in Node and browsers\",\n\t\tseverity: \"info\"\n\t}\n};\nvar HeavyDepsRunner = class extends BaseRunner {\n\tname = \"heavy-deps\";\n\tcategory = \"performance\";\n\tasync isApplicable(projectPath) {\n\t\treturn fileExists(projectPath, \"package.json\");\n\t}\n\tasync run(projectPath) {\n\t\tconst elapsed = timer();\n\t\ttry {\n\t\t\tconst pkg = JSON.parse(readFileSync(join(projectPath, \"package.json\"), \"utf-8\"));\n\t\t\tconst allDeps = {\n\t\t\t\t...pkg.dependencies,\n\t\t\t\t...pkg.devDependencies\n\t\t\t};\n\t\t\tconst depNames = Object.keys(allDeps || {});\n\t\t\tconst found = [];\n\t\t\tfor (const dep of depNames) {\n\t\t\t\tconst info = HEAVY_DEPS[dep];\n\t\t\t\tif (info) found.push({\n\t\t\t\t\tname: dep,\n\t\t\t\t\tinfo\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst issues = found.map((f) => ({\n\t\t\t\tseverity: f.info.severity,\n\t\t\t\tmessage: `${f.name} — ${f.info.reason}`,\n\t\t\t\tsuppressMatch: f.name,\n\t\t\t\tfix: { description: `Consider replacing with ${f.info.alternative}` },\n\t\t\t\treportedBy: [\"heavy-deps\"]\n\t\t\t}));\n\t\t\tconst warningCount = found.filter((f) => f.info.severity === \"warning\").length;\n\t\t\tconst infoCount = found.filter((f) => f.info.severity === \"info\").length;\n\t\t\tconst score = Math.max(30, 100 - warningCount * 10 - infoCount * 5);\n\t\t\treturn {\n\t\t\t\tid: \"heavy-deps\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Heavy Dependencies\",\n\t\t\t\tscore,\n\t\t\t\tstatus: warningCount > 0 ? \"warning\" : infoCount > 0 ? \"warning\" : \"pass\",\n\t\t\t\tissues,\n\t\t\t\ttoolsUsed: [\"heavy-deps\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: {\n\t\t\t\t\ttotalDeps: depNames.length,\n\t\t\t\t\theavyDepsFound: found.length,\n\t\t\t\t\theavyDeps: found.map((f) => f.name)\n\t\t\t\t}\n\t\t\t};\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tid: \"heavy-deps\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Heavy Dependencies\",\n\t\t\t\tscore: 0,\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tissues: [{\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\tmessage: `Heavy deps check failed: ${err}`,\n\t\t\t\t\treportedBy: [\"heavy-deps\"]\n\t\t\t\t}],\n\t\t\t\ttoolsUsed: [\"heavy-deps\"],\n\t\t\t\tduration: elapsed()\n\t\t\t};\n\t\t}\n\t}\n};\n//#endregion\n//#region src/integrations/jscpd.ts\nvar JscpdRunner = class extends BaseRunner {\n\tname = \"jscpd\";\n\tcategory = \"code-quality\";\n\tasync run(projectPath, options) {\n\t\tconst elapsed = timer();\n\t\tconst thresholds = options?.checkConfig?.thresholds;\n\t\tconst warnPercent = thresholds?.warnPercent ?? 5;\n\t\tconst criticalPercent = thresholds?.criticalPercent ?? 20;\n\t\tif (!await isCommandAvailable(\"jscpd\")) return this.skipped(\"jscpd not installed — run: npm i -g jscpd\");\n\t\ttry {\n\t\t\tconst { stdout } = await execa(\"jscpd\", [\n\t\t\t\t\"src\",\n\t\t\t\t\"--reporters\",\n\t\t\t\t\"json\",\n\t\t\t\t\"--output\",\n\t\t\t\t\"/tmp/jscpd-sickbay\",\n\t\t\t\t\"--silent\"\n\t\t\t], {\n\t\t\t\tcwd: projectPath,\n\t\t\t\treject: false,\n\t\t\t\tpreferLocal: true,\n\t\t\t\tlocalDir: coreLocalDir\n\t\t\t});\n\t\t\tlet data = {};\n\t\t\ttry {\n\t\t\t\tdata = parseJsonOutput(stdout, \"{}\");\n\t\t\t} catch {}\n\t\t\tconst percentage = data.statistics?.total.percentage ?? 0;\n\t\t\tconst clones = data.statistics?.total.clones ?? 0;\n\t\t\tconst issues = [];\n\t\t\tif (percentage > warnPercent) issues.push({\n\t\t\t\tseverity: percentage > criticalPercent ? \"critical\" : \"warning\",\n\t\t\t\tmessage: `${percentage.toFixed(1)}% code duplication detected (${clones} clone${clones !== 1 ? \"s\" : \"\"})`,\n\t\t\t\tfix: { description: \"Extract duplicated code into shared utilities or components\" },\n\t\t\t\treportedBy: [\"jscpd\"]\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tid: \"jscpd\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Code Duplication\",\n\t\t\t\tscore: Math.max(0, 100 - Math.round(percentage * 3)),\n\t\t\t\tstatus: percentage === 0 ? \"pass\" : percentage > criticalPercent ? \"fail\" : percentage > warnPercent ? \"warning\" : \"pass\",\n\t\t\t\tissues,\n\t\t\t\ttoolsUsed: [\"jscpd\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: {\n\t\t\t\t\tpercentage,\n\t\t\t\t\tclones\n\t\t\t\t}\n\t\t\t};\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tid: \"jscpd\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Code Duplication\",\n\t\t\t\tscore: 0,\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tissues: [{\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\tmessage: `jscpd failed: ${err}`,\n\t\t\t\t\treportedBy: [\"jscpd\"]\n\t\t\t\t}],\n\t\t\t\ttoolsUsed: [\"jscpd\"],\n\t\t\t\tduration: elapsed()\n\t\t\t};\n\t\t}\n\t}\n};\n//#endregion\n//#region src/integrations/knip.ts\nconst TEST_ONLY_PACKAGE_PREFIXES = [\"@testing-library/\"];\nconst TEST_RUNNER_PACKAGES = [\n\t\"vitest\",\n\t\"jest\",\n\t\"@jest/core\",\n\t\"@jest/globals\"\n];\nvar KnipRunner = class extends BaseRunner {\n\tname = \"knip\";\n\tcategory = \"dependencies\";\n\tasync run(projectPath) {\n\t\tconst elapsed = timer();\n\t\tif (!await isCommandAvailable(\"knip\")) return this.skipped(\"knip not installed — run: npm i -g knip\");\n\t\ttry {\n\t\t\tconst { stdout } = await execa(\"knip\", [\n\t\t\t\t\"--reporter\",\n\t\t\t\t\"json\",\n\t\t\t\t\"--no-progress\"\n\t\t\t], {\n\t\t\t\tcwd: projectPath,\n\t\t\t\treject: false,\n\t\t\t\tpreferLocal: true,\n\t\t\t\tlocalDir: coreLocalDir\n\t\t\t});\n\t\t\tconst data = parseJsonOutput(stdout, \"{}\");\n\t\t\tconst issues = [];\n\t\t\tlet hasTestRunner = false;\n\t\t\tlet workspaceScope = null;\n\t\t\tconst pkgPath = join(projectPath, \"package.json\");\n\t\t\tif (existsSync(pkgPath)) {\n\t\t\t\tconst pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n\t\t\t\tconst allDeps = {\n\t\t\t\t\t...pkg.dependencies ?? {},\n\t\t\t\t\t...pkg.devDependencies ?? {}\n\t\t\t\t};\n\t\t\t\thasTestRunner = TEST_RUNNER_PACKAGES.some((p) => p in allDeps);\n\t\t\t\tconst scopeMatch = pkg.name?.match(/^(@[^/]+)\\//);\n\t\t\t\tif (scopeMatch) workspaceScope = scopeMatch[1];\n\t\t\t}\n\t\t\tconst deps = /* @__PURE__ */ new Set();\n\t\t\tconst devDeps = /* @__PURE__ */ new Set();\n\t\t\tconst unusedExports = [];\n\t\t\tconst unusedFiles = [];\n\t\t\tfor (const fileIssue of data.issues ?? []) {\n\t\t\t\t(fileIssue.files ?? []).forEach((f) => {\n\t\t\t\t\tconst filePath = f.name || fileIssue.file;\n\t\t\t\t\tif (/^sickbay\\.config\\.[cm]?[jt]s$/.test(filePath)) return;\n\t\t\t\t\tunusedFiles.push(filePath);\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\t\tmessage: `Unused file: ${filePath}`,\n\t\t\t\t\t\tsuppressMatch: filePath,\n\t\t\t\t\t\tfile: filePath,\n\t\t\t\t\t\tfix: { description: `Remove ${filePath}` },\n\t\t\t\t\t\treportedBy: [\"knip\"]\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\t(fileIssue.dependencies ?? []).forEach((d) => {\n\t\t\t\t\tif (workspaceScope && d.name.startsWith(`${workspaceScope}/`)) return;\n\t\t\t\t\tdeps.add(d.name);\n\t\t\t\t});\n\t\t\t\t(fileIssue.devDependencies ?? []).forEach((d) => {\n\t\t\t\t\tif (workspaceScope && d.name.startsWith(`${workspaceScope}/`)) return;\n\t\t\t\t\tif (!TEST_ONLY_PACKAGE_PREFIXES.some((prefix) => d.name.startsWith(prefix)) || !hasTestRunner) devDeps.add(d.name);\n\t\t\t\t});\n\t\t\t\t(fileIssue.exports ?? []).forEach((e) => unusedExports.push(`${fileIssue.file}: ${e.name}`));\n\t\t\t}\n\t\t\tdeps.forEach((dep) => issues.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tmessage: `Unused dependency: ${dep}`,\n\t\t\t\tsuppressMatch: dep,\n\t\t\t\tfix: { description: `Remove ${dep}` },\n\t\t\t\treportedBy: [\"knip\"]\n\t\t\t}));\n\t\t\tdevDeps.forEach((dep) => issues.push({\n\t\t\t\tseverity: \"info\",\n\t\t\t\tmessage: `Unused devDependency: ${dep}`,\n\t\t\t\tsuppressMatch: dep,\n\t\t\t\tfix: { description: `Remove ${dep}` },\n\t\t\t\treportedBy: [\"knip\"]\n\t\t\t}));\n\t\t\tunusedExports.slice(0, 5).forEach((exp) => issues.push({\n\t\t\t\tseverity: \"info\",\n\t\t\t\tmessage: `Unused export: ${exp}`,\n\t\t\t\tsuppressMatch: exp,\n\t\t\t\treportedBy: [\"knip\"]\n\t\t\t}));\n\t\t\tif (unusedExports.length > 5) issues.push({\n\t\t\t\tseverity: \"info\",\n\t\t\t\tmessage: `...and ${unusedExports.length - 5} more unused exports`,\n\t\t\t\treportedBy: [\"knip\"]\n\t\t\t});\n\t\t\tconst totalIssues = issues.length;\n\t\t\tconst score = Math.max(0, 100 - totalIssues * 5);\n\t\t\treturn {\n\t\t\t\tid: \"knip\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Unused Code\",\n\t\t\t\tscore,\n\t\t\t\tstatus: totalIssues === 0 ? \"pass\" : totalIssues > 10 ? \"fail\" : \"warning\",\n\t\t\t\tissues,\n\t\t\t\ttoolsUsed: [\"knip\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: {\n\t\t\t\t\tunusedFiles: unusedFiles.length,\n\t\t\t\t\tunusedDeps: deps.size,\n\t\t\t\t\tunusedDevDeps: devDeps.size,\n\t\t\t\t\tunusedExports: unusedExports.length\n\t\t\t\t}\n\t\t\t};\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tid: \"knip\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Unused Code\",\n\t\t\t\tscore: 0,\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tissues: [{\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\tmessage: `knip failed: ${err}`,\n\t\t\t\t\treportedBy: [\"knip\"]\n\t\t\t\t}],\n\t\t\t\ttoolsUsed: [\"knip\"],\n\t\t\t\tduration: elapsed()\n\t\t\t};\n\t\t}\n\t}\n};\n//#endregion\n//#region src/integrations/license-checker.ts\n/**\n* LicenseCheckerRunner uses the license-checker tool to analyze the project's dependencies for problematic licenses.\n* It checks the licenses of all production dependencies, flagging those that may be incompatible with commercial use.\n* The runner reports issues with actionable feedback, including commands to review or replace dependencies with problematic licenses.\n* It calculates an overall score based on the number of flagged licenses, providing insights into the project's license compliance.\n*/\nconst PROBLEMATIC_LICENSES = [\n\t\"GPL-2.0\",\n\t\"GPL-3.0\",\n\t\"AGPL-3.0\",\n\t\"LGPL-2.1\",\n\t\"LGPL-3.0\",\n\t\"CC-BY-NC\"\n];\nvar LicenseCheckerRunner = class extends BaseRunner {\n\tname = \"license-checker\";\n\tcategory = \"security\";\n\tasync run(projectPath, options) {\n\t\tconst elapsed = timer();\n\t\tconst blocklist = (options?.checkConfig?.thresholds)?.blocklist ?? PROBLEMATIC_LICENSES;\n\t\tif (!await isCommandAvailable(\"license-checker\")) return this.skipped(\"license-checker not installed — run: npm i -g license-checker\");\n\t\ttry {\n\t\t\tconst { stdout } = await execa(\"license-checker\", [\"--json\", \"--production\"], {\n\t\t\t\tcwd: projectPath,\n\t\t\t\treject: false,\n\t\t\t\tpreferLocal: true,\n\t\t\t\tlocalDir: coreLocalDir\n\t\t\t});\n\t\t\tconst licenses = parseJsonOutput(stdout, \"{}\");\n\t\t\tconst issues = [];\n\t\t\tfor (const [pkg, info] of Object.entries(licenses)) {\n\t\t\t\tconst license = info.licenses;\n\t\t\t\tif (blocklist.some((l) => license.includes(l))) issues.push({\n\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\tmessage: `${pkg} uses ${license} license — may be incompatible with commercial use`,\n\t\t\t\t\tsuppressMatch: pkg.lastIndexOf(\"@\") > 0 ? pkg.slice(0, pkg.lastIndexOf(\"@\")) : pkg,\n\t\t\t\t\tfix: { description: `Review or replace ${pkg.split(\"@\")[0]}` },\n\t\t\t\t\treportedBy: [\"license-checker\"]\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tid: \"license-checker\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"License Compliance\",\n\t\t\t\tscore: issues.length === 0 ? 100 : Math.max(60, 100 - issues.length * 10),\n\t\t\t\tstatus: issues.length === 0 ? \"pass\" : \"warning\",\n\t\t\t\tissues,\n\t\t\t\ttoolsUsed: [\"license-checker\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: {\n\t\t\t\t\ttotalPackages: Object.keys(licenses).length,\n\t\t\t\t\tflagged: issues.length\n\t\t\t\t}\n\t\t\t};\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tid: \"license-checker\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"License Compliance\",\n\t\t\t\tscore: 0,\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tissues: [{\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\tmessage: `license-checker failed: ${err}`,\n\t\t\t\t\treportedBy: [\"license-checker\"]\n\t\t\t\t}],\n\t\t\t\ttoolsUsed: [\"license-checker\"],\n\t\t\t\tduration: elapsed()\n\t\t\t};\n\t\t}\n\t}\n};\n//#endregion\n//#region src/integrations/madge.ts\nfunction findCircularDeps(graph) {\n\tconst circles = [];\n\tconst visited = /* @__PURE__ */ new Set();\n\tconst stack = /* @__PURE__ */ new Set();\n\tfunction dfs(node, path) {\n\t\tif (stack.has(node)) {\n\t\t\tconst cycleStart = path.indexOf(node);\n\t\t\tif (cycleStart !== -1) circles.push(path.slice(cycleStart));\n\t\t\treturn;\n\t\t}\n\t\tif (visited.has(node)) return;\n\t\tvisited.add(node);\n\t\tstack.add(node);\n\t\tpath.push(node);\n\t\tfor (const dep of graph[node] ?? []) dfs(dep, [...path]);\n\t\tstack.delete(node);\n\t}\n\tfor (const node of Object.keys(graph)) dfs(node, []);\n\tconst seen = /* @__PURE__ */ new Set();\n\treturn circles.filter((cycle) => {\n\t\tconst sorted = [...cycle].sort().join(\"|\");\n\t\tif (seen.has(sorted)) return false;\n\t\tseen.add(sorted);\n\t\treturn true;\n\t});\n}\nvar MadgeRunner = class extends BaseRunner {\n\tname = \"madge\";\n\tcategory = \"code-quality\";\n\tasync run(projectPath, options) {\n\t\tconst elapsed = timer();\n\t\tconst maxCircular = (options?.checkConfig?.thresholds)?.maxCircular ?? 5;\n\t\tif (!await isCommandAvailable(\"madge\")) return this.skipped(\"madge not installed — run: npm i -g madge\");\n\t\ttry {\n\t\t\tconst tsConfig = fileExists(projectPath, \"tsconfig.app.json\") ? \"tsconfig.app.json\" : fileExists(projectPath, \"tsconfig.json\") ? \"tsconfig.json\" : null;\n\t\t\tconst sourceDir = [\n\t\t\t\t\"src\",\n\t\t\t\t\"app\",\n\t\t\t\t\"lib\"\n\t\t\t].find((d) => existsSync(join(projectPath, d))) ?? \"src\";\n\t\t\tconst args = [\n\t\t\t\t\"--json\",\n\t\t\t\t\"--extensions\",\n\t\t\t\t\"ts,tsx,js,jsx\"\n\t\t\t];\n\t\t\tif (tsConfig) args.push(\"--ts-config\", tsConfig);\n\t\t\targs.push(sourceDir);\n\t\t\tconst { stdout } = await execa(\"madge\", args, {\n\t\t\t\tcwd: projectPath,\n\t\t\t\treject: false,\n\t\t\t\tpreferLocal: true,\n\t\t\t\tlocalDir: coreLocalDir\n\t\t\t});\n\t\t\tlet graph;\n\t\t\ttry {\n\t\t\t\tgraph = parseJsonOutput(stdout, \"{}\");\n\t\t\t} catch {\n\t\t\t\tgraph = {};\n\t\t\t}\n\t\t\tconst circles = findCircularDeps(graph);\n\t\t\tconst issues = circles.map((cycle) => ({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tmessage: `Circular dependency: ${cycle.join(\" → \")}`,\n\t\t\t\tsuppressMatch: cycle[0],\n\t\t\t\tfix: { description: \"Refactor to break the circular dependency cycle\" },\n\t\t\t\treportedBy: [\"madge\"]\n\t\t\t}));\n\t\t\treturn {\n\t\t\t\tid: \"madge\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Circular Dependencies\",\n\t\t\t\tscore: circles.length === 0 ? 100 : Math.max(0, 100 - circles.length * 10),\n\t\t\t\tstatus: circles.length === 0 ? \"pass\" : circles.length > maxCircular ? \"fail\" : \"warning\",\n\t\t\t\tissues,\n\t\t\t\ttoolsUsed: [\"madge\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: {\n\t\t\t\t\tcircularCount: circles.length,\n\t\t\t\t\tgraph\n\t\t\t\t}\n\t\t\t};\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tid: \"madge\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Circular Dependencies\",\n\t\t\t\tscore: 0,\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tissues: [{\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\tmessage: `madge failed: ${err}`,\n\t\t\t\t\treportedBy: [\"madge\"]\n\t\t\t\t}],\n\t\t\t\ttoolsUsed: [\"madge\"],\n\t\t\t\tduration: elapsed()\n\t\t\t};\n\t\t}\n\t}\n};\n//#endregion\n//#region src/integrations/next-client-components.ts\nvar NextClientComponentsRunner = class extends BaseRunner {\n\tname = \"next-client-components\";\n\tcategory = \"performance\";\n\tapplicableFrameworks = [\"next\"];\n\tasync run(projectPath) {\n\t\tconst elapsed = timer();\n\t\ttry {\n\t\t\tconst files = [...findJsxFiles$2(join(projectPath, \"app\"), projectPath), ...findJsxFiles$2(join(projectPath, \"src\"), projectPath)];\n\t\t\tconst unnecessary = [];\n\t\t\tlet clientCount = 0;\n\t\t\tfor (const { relPath, fullPath } of files) {\n\t\t\t\tconst content = readFileSync(fullPath, \"utf-8\");\n\t\t\t\tconst trimmed = content.trim();\n\t\t\t\tif (!(trimmed.startsWith(\"\\\"use client\\\"\") || trimmed.startsWith(\"'use client'\"))) continue;\n\t\t\t\tclientCount++;\n\t\t\t\tconst hasHooks = /\\b(useState|useEffect|useRef|useCallback|useMemo|useContext|useReducer)\\b/.test(content);\n\t\t\t\tconst hasEventHandlers = /\\bon[A-Z][a-zA-Z]*\\s*=\\s*\\{/.test(content);\n\t\t\t\tif (!hasHooks && !hasEventHandlers) unnecessary.push(relPath);\n\t\t\t}\n\t\t\tconst issues = unnecessary.map((file) => ({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tmessage: `${file} — may not need 'use client' (no hooks or event handlers detected)`,\n\t\t\t\tfile,\n\t\t\t\tsuppressMatch: file,\n\t\t\t\tfix: { description: \"This component may not need 'use client' — it contains no hooks or event handlers. Moving it to a Server Component reduces client bundle size.\" },\n\t\t\t\treportedBy: [\"next-client-components\"]\n\t\t\t}));\n\t\t\tconst score = Math.max(20, 100 - unnecessary.length * 15);\n\t\t\treturn {\n\t\t\t\tid: \"next-client-components\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Next.js Client Components\",\n\t\t\t\tscore,\n\t\t\t\tstatus: unnecessary.length > 0 ? \"warning\" : \"pass\",\n\t\t\t\tissues,\n\t\t\t\ttoolsUsed: [\"next-client-components\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: {\n\t\t\t\t\tfilesScanned: files.length,\n\t\t\t\t\tclientFiles: clientCount,\n\t\t\t\t\tunnecessaryClientFiles: unnecessary.length\n\t\t\t\t}\n\t\t\t};\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tid: \"next-client-components\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Next.js Client Components\",\n\t\t\t\tscore: 0,\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tissues: [{\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\tmessage: `Check failed: ${err}`,\n\t\t\t\t\treportedBy: [\"next-client-components\"]\n\t\t\t\t}],\n\t\t\t\ttoolsUsed: [\"next-client-components\"],\n\t\t\t\tduration: elapsed()\n\t\t\t};\n\t\t}\n\t}\n};\nfunction findJsxFiles$2(dir, projectRoot, isRoot = true) {\n\tconst files = [];\n\ttry {\n\t\tfor (const entry of readdirSync(dir)) {\n\t\t\tif (entry.startsWith(\".\") || entry === \"node_modules\") continue;\n\t\t\tconst fullPath = join(dir, entry);\n\t\t\tlet stat;\n\t\t\ttry {\n\t\t\t\tstat = statSync(fullPath);\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (stat.isDirectory()) files.push(...findJsxFiles$2(fullPath, projectRoot, false));\n\t\t\telse if (entry.endsWith(\".tsx\") || entry.endsWith(\".jsx\")) files.push({\n\t\t\t\trelPath: relativeFromRoot(projectRoot, fullPath),\n\t\t\t\tfullPath\n\t\t\t});\n\t\t}\n\t} catch (err) {\n\t\tif (isRoot) {\n\t\t\tconst code = err.code;\n\t\t\tif (code !== \"ENOENT\" && code !== \"ENOTDIR\") throw err;\n\t\t}\n\t}\n\treturn files;\n}\n//#endregion\n//#region src/integrations/next-fonts.ts\nvar NextFontsRunner = class extends BaseRunner {\n\tname = \"next-fonts\";\n\tcategory = \"performance\";\n\tapplicableFrameworks = [\"next\"];\n\tasync run(projectPath) {\n\t\tconst elapsed = timer();\n\t\ttry {\n\t\t\tconst layoutPaths = [\n\t\t\t\t\"app/layout.tsx\",\n\t\t\t\t\"app/layout.jsx\",\n\t\t\t\t\"src/app/layout.tsx\",\n\t\t\t\t\"src/app/layout.jsx\",\n\t\t\t\t\"pages/_document.tsx\",\n\t\t\t\t\"pages/_document.jsx\",\n\t\t\t\t\"pages/_document.js\",\n\t\t\t\t\"src/pages/_document.tsx\",\n\t\t\t\t\"src/pages/_document.jsx\"\n\t\t\t];\n\t\t\tconst found = [];\n\t\t\tfor (const layoutPath of layoutPaths) {\n\t\t\t\tconst fullPath = join(projectPath, layoutPath);\n\t\t\t\tif (existsSync(fullPath)) {\n\t\t\t\t\tconst content = readFileSync(fullPath, \"utf-8\");\n\t\t\t\t\tif (content.includes(\"fonts.googleapis.com\") || content.includes(\"fonts.gstatic.com\")) found.push(layoutPath);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst issues = found.map((layoutPath) => ({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tmessage: `${layoutPath} — Google Fonts loaded via external stylesheet; use next/font/google`,\n\t\t\t\tfile: layoutPath,\n\t\t\t\tsuppressMatch: layoutPath,\n\t\t\t\tfix: { description: \"Use next/font/google instead of a <link> stylesheet to self-host fonts and improve Core Web Vitals (eliminates render-blocking request).\" },\n\t\t\t\treportedBy: [\"next-fonts\"]\n\t\t\t}));\n\t\t\tconst score = Math.max(40, 100 - found.length * 30);\n\t\t\treturn {\n\t\t\t\tid: \"next-fonts\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Next.js Fonts\",\n\t\t\t\tscore,\n\t\t\t\tstatus: found.length > 0 ? \"warning\" : \"pass\",\n\t\t\t\tissues,\n\t\t\t\ttoolsUsed: [\"next-fonts\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: {\n\t\t\t\t\tlayoutFilesChecked: layoutPaths.length,\n\t\t\t\t\tviolations: found.length\n\t\t\t\t}\n\t\t\t};\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tid: \"next-fonts\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Next.js Fonts\",\n\t\t\t\tscore: 0,\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tissues: [{\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\tmessage: `Check failed: ${err}`,\n\t\t\t\t\treportedBy: [\"next-fonts\"]\n\t\t\t\t}],\n\t\t\t\ttoolsUsed: [\"next-fonts\"],\n\t\t\t\tduration: elapsed()\n\t\t\t};\n\t\t}\n\t}\n};\n//#endregion\n//#region src/integrations/next-images.ts\nvar NextImagesRunner = class extends BaseRunner {\n\tname = \"next-images\";\n\tcategory = \"performance\";\n\tapplicableFrameworks = [\"next\"];\n\tasync run(projectPath) {\n\t\tconst elapsed = timer();\n\t\ttry {\n\t\t\tconst files = [...findJsxFiles$1(join(projectPath, \"app\"), projectPath), ...findJsxFiles$1(join(projectPath, \"src\"), projectPath)];\n\t\t\tconst violations = [];\n\t\t\tconst imgRegex = /<img[\\s>]/;\n\t\t\tfor (const { relPath, fullPath } of files) {\n\t\t\t\tconst content = readFileSync(fullPath, \"utf-8\");\n\t\t\t\tif (imgRegex.test(content)) violations.push(relPath);\n\t\t\t}\n\t\t\tconst issues = violations.map((file) => ({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tmessage: `${file} — raw image element; use next/image for automatic optimization`,\n\t\t\t\tfile,\n\t\t\t\tsuppressMatch: file,\n\t\t\t\tfix: { description: \"Replace <img> with the <Image> component from next/image for automatic optimization, lazy loading, and Core Web Vitals improvements.\" },\n\t\t\t\treportedBy: [\"next-images\"]\n\t\t\t}));\n\t\t\tconst score = Math.max(20, 100 - violations.length * 10);\n\t\t\treturn {\n\t\t\t\tid: \"next-images\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Next.js Image Optimization\",\n\t\t\t\tscore,\n\t\t\t\tstatus: violations.length > 0 ? \"warning\" : \"pass\",\n\t\t\t\tissues,\n\t\t\t\ttoolsUsed: [\"next-images\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: {\n\t\t\t\t\tfilesScanned: files.length,\n\t\t\t\t\tviolations: violations.length\n\t\t\t\t}\n\t\t\t};\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tid: \"next-images\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Next.js Image Optimization\",\n\t\t\t\tscore: 0,\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tissues: [{\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\tmessage: `Check failed: ${err}`,\n\t\t\t\t\treportedBy: [\"next-images\"]\n\t\t\t\t}],\n\t\t\t\ttoolsUsed: [\"next-images\"],\n\t\t\t\tduration: elapsed()\n\t\t\t};\n\t\t}\n\t}\n};\nfunction findJsxFiles$1(dir, projectRoot, isRoot = true) {\n\tconst files = [];\n\ttry {\n\t\tfor (const entry of readdirSync(dir)) {\n\t\t\tif (entry.startsWith(\".\") || entry === \"node_modules\") continue;\n\t\t\tconst fullPath = join(dir, entry);\n\t\t\tlet stat;\n\t\t\ttry {\n\t\t\t\tstat = statSync(fullPath);\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (stat.isDirectory()) files.push(...findJsxFiles$1(fullPath, projectRoot, false));\n\t\t\telse if (entry.endsWith(\".tsx\") || entry.endsWith(\".jsx\")) files.push({\n\t\t\t\trelPath: relativeFromRoot(projectRoot, fullPath),\n\t\t\t\tfullPath\n\t\t\t});\n\t\t}\n\t} catch (err) {\n\t\tif (isRoot) {\n\t\t\tconst code = err.code;\n\t\t\tif (code !== \"ENOENT\" && code !== \"ENOTDIR\") throw err;\n\t\t}\n\t}\n\treturn files;\n}\n//#endregion\n//#region src/integrations/next-link.ts\nconst INTERNAL_LINK_REGEX = /<a\\s[^>]*href=[\"'](\\/|\\.\\/)/;\nvar NextLinkRunner = class extends BaseRunner {\n\tname = \"next-link\";\n\tcategory = \"performance\";\n\tapplicableFrameworks = [\"next\"];\n\tasync run(projectPath) {\n\t\tconst elapsed = timer();\n\t\ttry {\n\t\t\tconst files = [...findJsxFiles(join(projectPath, \"app\"), projectPath), ...findJsxFiles(join(projectPath, \"src\"), projectPath)];\n\t\t\tconst violations = [];\n\t\t\tfor (const { relPath, fullPath } of files) {\n\t\t\t\tconst content = readFileSync(fullPath, \"utf-8\");\n\t\t\t\tif (INTERNAL_LINK_REGEX.test(content)) violations.push(relPath);\n\t\t\t}\n\t\t\tconst issues = violations.map((file) => ({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tmessage: `${file} — raw anchor tag for internal navigation; use next/link`,\n\t\t\t\tfile,\n\t\t\t\tsuppressMatch: file,\n\t\t\t\tfix: { description: \"Replace <a href=\\\"/path\\\"> with <Link href=\\\"/path\\\"> from next/link to enable client-side navigation and prefetching.\" },\n\t\t\t\treportedBy: [\"next-link\"]\n\t\t\t}));\n\t\t\tconst score = Math.max(20, 100 - violations.length * 15);\n\t\t\treturn {\n\t\t\t\tid: \"next-link\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Next.js Link Usage\",\n\t\t\t\tscore,\n\t\t\t\tstatus: violations.length > 0 ? \"warning\" : \"pass\",\n\t\t\t\tissues,\n\t\t\t\ttoolsUsed: [\"next-link\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: {\n\t\t\t\t\tfilesScanned: files.length,\n\t\t\t\t\tviolations: violations.length\n\t\t\t\t}\n\t\t\t};\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tid: \"next-link\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Next.js Link Usage\",\n\t\t\t\tscore: 0,\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tissues: [{\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\tmessage: `Check failed: ${err}`,\n\t\t\t\t\treportedBy: [\"next-link\"]\n\t\t\t\t}],\n\t\t\t\ttoolsUsed: [\"next-link\"],\n\t\t\t\tduration: elapsed()\n\t\t\t};\n\t\t}\n\t}\n};\nfunction findJsxFiles(dir, projectRoot, isRoot = true) {\n\tconst files = [];\n\ttry {\n\t\tfor (const entry of readdirSync(dir)) {\n\t\t\tif (entry.startsWith(\".\") || entry === \"node_modules\") continue;\n\t\t\tconst fullPath = join(dir, entry);\n\t\t\tlet stat;\n\t\t\ttry {\n\t\t\t\tstat = statSync(fullPath);\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (stat.isDirectory()) files.push(...findJsxFiles(fullPath, projectRoot, false));\n\t\t\telse if (entry.endsWith(\".tsx\") || entry.endsWith(\".jsx\")) files.push({\n\t\t\t\trelPath: relativeFromRoot(projectRoot, fullPath),\n\t\t\t\tfullPath\n\t\t\t});\n\t\t}\n\t} catch (err) {\n\t\tif (isRoot) {\n\t\t\tconst code = err.code;\n\t\t\tif (code !== \"ENOENT\" && code !== \"ENOTDIR\") throw err;\n\t\t}\n\t}\n\treturn files;\n}\n//#endregion\n//#region src/integrations/next-missing-boundaries.ts\nvar NextMissingBoundariesRunner = class extends BaseRunner {\n\tname = \"next-missing-boundaries\";\n\tcategory = \"code-quality\";\n\tapplicableFrameworks = [\"next\"];\n\tasync run(projectPath) {\n\t\tconst elapsed = timer();\n\t\ttry {\n\t\t\tconst appPaths = [join(projectPath, \"app\"), join(projectPath, \"src\", \"app\")];\n\t\t\tlet pageDirs = [];\n\t\t\tfor (const appPath of appPaths) pageDirs.push(...findPageDirs(appPath, projectPath, true));\n\t\t\tconst issues = [];\n\t\t\tlet segmentsChecked = 0;\n\t\t\tlet missingLoading = 0;\n\t\t\tlet missingError = 0;\n\t\t\tfor (const pageDir of pageDirs) {\n\t\t\t\tsegmentsChecked++;\n\t\t\t\tconst relDir = relativeFromRoot(projectPath, pageDir);\n\t\t\t\tif (!existsSync(join(pageDir, \"loading.tsx\")) && !existsSync(join(pageDir, \"loading.jsx\"))) {\n\t\t\t\t\tmissingLoading++;\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tseverity: \"info\",\n\t\t\t\t\t\tmessage: `${relDir} — missing loading.tsx (Suspense boundary for this route segment)`,\n\t\t\t\t\t\tsuppressMatch: relDir,\n\t\t\t\t\t\tfix: { description: \"Add loading.tsx to show a skeleton UI while this route's data loads (App Router Suspense boundary).\" },\n\t\t\t\t\t\treportedBy: [\"next-missing-boundaries\"]\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (!existsSync(join(pageDir, \"error.tsx\")) && !existsSync(join(pageDir, \"error.jsx\"))) {\n\t\t\t\t\tmissingError++;\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tseverity: \"info\",\n\t\t\t\t\t\tmessage: `${relDir} — missing error.tsx (error boundary for this route segment)`,\n\t\t\t\t\t\tsuppressMatch: relDir,\n\t\t\t\t\t\tfix: { description: \"Add error.tsx with 'use client' to gracefully handle errors in this route segment.\" },\n\t\t\t\t\t\treportedBy: [\"next-missing-boundaries\"]\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst score = Math.max(20, 100 - issues.length * 15);\n\t\t\treturn {\n\t\t\t\tid: \"next-missing-boundaries\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Next.js Missing Boundaries\",\n\t\t\t\tscore,\n\t\t\t\tstatus: issues.length > 0 ? \"warning\" : \"pass\",\n\t\t\t\tissues,\n\t\t\t\ttoolsUsed: [\"next-missing-boundaries\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: {\n\t\t\t\t\tsegmentsChecked,\n\t\t\t\t\tmissingLoading,\n\t\t\t\t\tmissingError\n\t\t\t\t}\n\t\t\t};\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tid: \"next-missing-boundaries\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Next.js Missing Boundaries\",\n\t\t\t\tscore: 0,\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tissues: [{\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\tmessage: `Check failed: ${err}`,\n\t\t\t\t\treportedBy: [\"next-missing-boundaries\"]\n\t\t\t\t}],\n\t\t\t\ttoolsUsed: [\"next-missing-boundaries\"],\n\t\t\t\tduration: elapsed()\n\t\t\t};\n\t\t}\n\t}\n};\nfunction findPageDirs(dir, projectRoot, isRoot = true) {\n\tconst dirs = [];\n\ttry {\n\t\tconst entries = readdirSync(dir);\n\t\tfor (const entry of entries) {\n\t\t\tif (entry.startsWith(\".\") || entry === \"node_modules\") continue;\n\t\t\tconst fullPath = join(dir, entry);\n\t\t\tlet stat;\n\t\t\ttry {\n\t\t\t\tstat = statSync(fullPath);\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!stat.isDirectory()) continue;\n\t\t\tif (existsSync(join(fullPath, \"page.tsx\")) || existsSync(join(fullPath, \"page.jsx\"))) dirs.push(fullPath);\n\t\t\tdirs.push(...findPageDirs(fullPath, projectRoot, false));\n\t\t}\n\t} catch (err) {\n\t\tif (isRoot) {\n\t\t\tconst code = err.code;\n\t\t\tif (code !== \"ENOENT\" && code !== \"ENOTDIR\") throw err;\n\t\t}\n\t}\n\treturn dirs;\n}\n//#endregion\n//#region src/integrations/next-security-headers.ts\nvar NextSecurityHeadersRunner = class extends BaseRunner {\n\tname = \"next-security-headers\";\n\tcategory = \"security\";\n\tapplicableFrameworks = [\"next\"];\n\tasync run(projectPath) {\n\t\tconst elapsed = timer();\n\t\ttry {\n\t\t\tconst configFiles = [\n\t\t\t\t\"next.config.js\",\n\t\t\t\t\"next.config.mjs\",\n\t\t\t\t\"next.config.ts\"\n\t\t\t];\n\t\t\tlet configFile = null;\n\t\t\tfor (const file of configFiles) if (existsSync(join(projectPath, file))) {\n\t\t\t\tconfigFile = file;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (!configFile) return {\n\t\t\t\tid: \"next-security-headers\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Next.js Security Headers\",\n\t\t\t\tscore: 0,\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tissues: [{\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\tmessage: \"No Next.js config file found — cannot verify security headers\",\n\t\t\t\t\treportedBy: [\"next-security-headers\"]\n\t\t\t\t}],\n\t\t\t\ttoolsUsed: [\"next-security-headers\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: {\n\t\t\t\t\tconfigFile: null,\n\t\t\t\t\thasHeaders: false,\n\t\t\t\t\tmissingHeaders: []\n\t\t\t\t}\n\t\t\t};\n\t\t\tconst content = readFileSync(join(projectPath, configFile), \"utf-8\");\n\t\t\tif (!/async\\s+headers\\s*\\(\\s*\\)/.test(content)) return {\n\t\t\t\tid: \"next-security-headers\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Next.js Security Headers\",\n\t\t\t\tscore: 30,\n\t\t\t\tstatus: \"warning\",\n\t\t\t\tissues: [{\n\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\tmessage: \"next.config.js missing async headers() — security response headers (CSP, X-Frame-Options, etc.) are not configured\",\n\t\t\t\t\tfix: { description: \"Add an async headers() function to next.config.js to set security headers like Content-Security-Policy, X-Frame-Options, X-Content-Type-Options, and Referrer-Policy.\" },\n\t\t\t\t\treportedBy: [\"next-security-headers\"]\n\t\t\t\t}],\n\t\t\t\ttoolsUsed: [\"next-security-headers\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: {\n\t\t\t\t\tconfigFile,\n\t\t\t\t\thasHeaders: false,\n\t\t\t\t\tmissingHeaders: []\n\t\t\t\t}\n\t\t\t};\n\t\t\tconst requiredHeaders = [\n\t\t\t\t\"Content-Security-Policy\",\n\t\t\t\t\"X-Frame-Options\",\n\t\t\t\t\"X-Content-Type-Options\",\n\t\t\t\t\"Referrer-Policy\"\n\t\t\t];\n\t\t\tconst missingHeaders = [];\n\t\t\tconst issues = [];\n\t\t\tfor (const header of requiredHeaders) if (!content.includes(header)) {\n\t\t\t\tmissingHeaders.push(header);\n\t\t\t\tissues.push({\n\t\t\t\t\tseverity: \"info\",\n\t\t\t\t\tmessage: `next.config.js headers() is missing the ${header} header`,\n\t\t\t\t\tfix: { description: `Add the ${header} header to the headers() function to improve security. ${header === \"Content-Security-Policy\" ? \"CSP restricts resources that can be loaded, mitigating XSS attacks.\" : header === \"X-Frame-Options\" ? \"X-Frame-Options prevents clickjacking by controlling whether the page can be framed.\" : header === \"X-Content-Type-Options\" ? \"X-Content-Type-Options prevents MIME type sniffing attacks.\" : \"Referrer-Policy controls how much referrer information is shared with other sites.\"}` },\n\t\t\t\t\treportedBy: [\"next-security-headers\"]\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst score = Math.max(40, 100 - missingHeaders.length * 15);\n\t\t\treturn {\n\t\t\t\tid: \"next-security-headers\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Next.js Security Headers\",\n\t\t\t\tscore,\n\t\t\t\tstatus: missingHeaders.length > 0 ? \"warning\" : \"pass\",\n\t\t\t\tissues,\n\t\t\t\ttoolsUsed: [\"next-security-headers\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: {\n\t\t\t\t\tconfigFile,\n\t\t\t\t\thasHeaders: true,\n\t\t\t\t\tmissingHeaders\n\t\t\t\t}\n\t\t\t};\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tid: \"next-security-headers\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Next.js Security Headers\",\n\t\t\t\tscore: 0,\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tissues: [{\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\tmessage: `Check failed: ${err}`,\n\t\t\t\t\treportedBy: [\"next-security-headers\"]\n\t\t\t\t}],\n\t\t\t\ttoolsUsed: [\"next-security-headers\"],\n\t\t\t\tduration: elapsed()\n\t\t\t};\n\t\t}\n\t}\n};\n//#endregion\n//#region src/integrations/node-async-errors.ts\nconst SOURCE_EXTENSIONS$1 = new Set([\n\t\".js\",\n\t\".ts\",\n\t\".mjs\",\n\t\".cjs\"\n]);\nconst SKIP_DIRS = new Set([\n\t\"node_modules\",\n\t\".git\",\n\t\"dist\",\n\t\"build\",\n\t\"coverage\",\n\t\"test\",\n\t\"tests\",\n\t\"__tests__\"\n]);\nconst ASYNC_ROUTE_RE = /(?:app|router)\\s*\\.\\s*(?:get|post|put|patch|delete|all)\\s*\\([^;]*\\basync\\b/s;\nconst TRY_CATCH_RE = /\\btry\\s*\\{/;\nconst ASYNC_ERRORS_RE = /require\\s*\\(\\s*['\"]express-async-errors['\"]\\s*\\)|from\\s+['\"]express-async-errors['\"]/;\nconst ERROR_MIDDLEWARE_RE = /\\(\\s*(?:err|error)\\s*,\\s*\\w+\\s*,\\s*\\w+\\s*,\\s*\\w+\\s*\\)\\s*(?:=>|\\{)/;\nfunction collectSourceFiles(dir) {\n\tif (!existsSync(dir)) return [];\n\tconst files = [];\n\tfor (const entry of readdirSync(dir)) {\n\t\tif (SKIP_DIRS.has(entry)) continue;\n\t\tconst full = join(dir, entry);\n\t\ttry {\n\t\t\tif (statSync(full).isDirectory()) files.push(...collectSourceFiles(full));\n\t\t\telse if (SOURCE_EXTENSIONS$1.has(extname(entry))) files.push(full);\n\t\t} catch {}\n\t}\n\treturn files;\n}\nvar NodeAsyncErrorsRunner = class extends BaseRunner {\n\tname = \"node-async-errors\";\n\tcategory = \"code-quality\";\n\tapplicableRuntimes = [\"node\"];\n\tasync run(projectPath) {\n\t\tconst elapsed = timer();\n\t\tconst pkgPath = join(projectPath, \"package.json\");\n\t\tif (!existsSync(pkgPath)) return this.skipped(\"No package.json found\");\n\t\tconst pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n\t\tif (\"express-async-errors\" in {\n\t\t\t...pkg.dependencies ?? {},\n\t\t\t...pkg.devDependencies ?? {}\n\t\t}) return {\n\t\t\tid: \"node-async-errors\",\n\t\t\tcategory: this.category,\n\t\t\tname: \"Async Error Handling\",\n\t\t\tscore: 100,\n\t\t\tstatus: \"pass\",\n\t\t\tissues: [{\n\t\t\t\tseverity: \"info\",\n\t\t\t\tmessage: \"express-async-errors detected — all async route handlers are automatically protected.\",\n\t\t\t\treportedBy: [\"node-async-errors\"]\n\t\t\t}],\n\t\t\ttoolsUsed: [\"node-async-errors\"],\n\t\t\tduration: elapsed()\n\t\t};\n\t\tconst srcDir = join(projectPath, \"src\");\n\t\tconst files = collectSourceFiles(existsSync(srcDir) ? srcDir : projectPath);\n\t\tlet routeFiles = 0;\n\t\tlet protectedFiles = 0;\n\t\tlet hasErrorMiddleware = false;\n\t\tfor (const file of files) try {\n\t\t\tconst content = readFileSync(file, \"utf-8\");\n\t\t\tif (ASYNC_ERRORS_RE.test(content)) {\n\t\t\t\thasErrorMiddleware = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (ERROR_MIDDLEWARE_RE.test(content)) hasErrorMiddleware = true;\n\t\t\tif (!ASYNC_ROUTE_RE.test(content)) continue;\n\t\t\trouteFiles++;\n\t\t\tif (TRY_CATCH_RE.test(content)) protectedFiles++;\n\t\t} catch {}\n\t\tconst pm = detectPackageManager(projectPath);\n\t\tconst issues = [];\n\t\tif (routeFiles === 0) return {\n\t\t\tid: \"node-async-errors\",\n\t\t\tcategory: this.category,\n\t\t\tname: \"Async Error Handling\",\n\t\t\tscore: 100,\n\t\t\tstatus: \"pass\",\n\t\t\tissues,\n\t\t\ttoolsUsed: [\"node-async-errors\"],\n\t\t\tduration: elapsed()\n\t\t};\n\t\tconst unprotectedFiles = routeFiles - protectedFiles;\n\t\tconst protectionRatio = protectedFiles / routeFiles;\n\t\tif (unprotectedFiles > 0) issues.push({\n\t\t\tseverity: unprotectedFiles === routeFiles ? \"critical\" : \"warning\",\n\t\t\tmessage: `${unprotectedFiles} of ${routeFiles} route file(s) contain async handlers without try/catch. Unhandled promise rejections will crash the process in Node.js <15 or produce silent failures.`,\n\t\t\tfix: {\n\t\t\t\tdescription: \"Wrap async route handlers in try/catch or use express-async-errors to auto-wrap all handlers\",\n\t\t\t\tcommand: `${pm} install express-async-errors`\n\t\t\t},\n\t\t\treportedBy: [\"node-async-errors\"]\n\t\t});\n\t\tif (!hasErrorMiddleware) issues.push({\n\t\t\tseverity: \"warning\",\n\t\t\tmessage: \"No Express error handling middleware found (4-parameter function: err, req, res, next). Without it, errors passed to next() have no centralized handler.\",\n\t\t\tfix: { description: \"Add app.use((err, req, res, next) => { res.status(500).json({ error: err.message }); }) after all routes\" },\n\t\t\treportedBy: [\"node-async-errors\"]\n\t\t});\n\t\tconst baseScore = Math.round(protectionRatio * 80);\n\t\tconst score = Math.min(100, baseScore + (hasErrorMiddleware ? 20 : 0));\n\t\tconst status = score >= 80 ? \"pass\" : score >= 50 ? \"warning\" : \"fail\";\n\t\treturn {\n\t\t\tid: \"node-async-errors\",\n\t\t\tcategory: this.category,\n\t\t\tname: \"Async Error Handling\",\n\t\t\tscore,\n\t\t\tstatus,\n\t\t\tissues,\n\t\t\ttoolsUsed: [\"node-async-errors\"],\n\t\t\tduration: elapsed()\n\t\t};\n\t}\n};\n//#endregion\n//#region src/integrations/node-input-validation.ts\nconst VALIDATION_PACKAGES = [\n\t\"zod\",\n\t\"joi\",\n\t\"express-validator\",\n\t\"yup\",\n\t\"ajv\",\n\t\"@sinclair/typebox\",\n\t\"valibot\"\n];\nconst HTTP_SERVER_PACKAGES$1 = [\n\t\"express\",\n\t\"fastify\",\n\t\"koa\",\n\t\"hapi\",\n\t\"@hapi/hapi\",\n\t\"restify\",\n\t\"polka\",\n\t\"micro\",\n\t\"@nestjs/core\",\n\t\"h3\"\n];\nvar NodeInputValidationRunner = class extends BaseRunner {\n\tname = \"node-input-validation\";\n\tcategory = \"code-quality\";\n\tapplicableRuntimes = [\"node\"];\n\tasync isApplicable(projectPath, _context) {\n\t\tconst pkgPath = join(projectPath, \"package.json\");\n\t\tif (!existsSync(pkgPath)) return false;\n\t\tconst pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n\t\tconst allDeps = {\n\t\t\t...pkg.dependencies ?? {},\n\t\t\t...pkg.devDependencies ?? {}\n\t\t};\n\t\treturn HTTP_SERVER_PACKAGES$1.some((p) => p in allDeps);\n\t}\n\tasync run(projectPath) {\n\t\tconst elapsed = timer();\n\t\tconst pkgPath = join(projectPath, \"package.json\");\n\t\tif (!existsSync(pkgPath)) return this.skipped(\"No package.json found\");\n\t\tconst pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n\t\tconst allDeps = {\n\t\t\t...pkg.dependencies ?? {},\n\t\t\t...pkg.devDependencies ?? {}\n\t\t};\n\t\tconst found = VALIDATION_PACKAGES.find((p) => p in allDeps);\n\t\tif (found) {\n\t\t\tconst issues = [{\n\t\t\t\tseverity: \"info\",\n\t\t\t\tmessage: `Input validation library detected: ${found}`,\n\t\t\t\treportedBy: [\"node-input-validation\"]\n\t\t\t}];\n\t\t\treturn {\n\t\t\t\tid: \"node-input-validation\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Input Validation\",\n\t\t\t\tscore: 85,\n\t\t\t\tstatus: \"pass\",\n\t\t\t\tissues,\n\t\t\t\ttoolsUsed: [\"node-input-validation\"],\n\t\t\t\tduration: elapsed()\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tid: \"node-input-validation\",\n\t\t\tcategory: this.category,\n\t\t\tname: \"Input Validation\",\n\t\t\tscore: 20,\n\t\t\tstatus: \"warning\",\n\t\t\tissues: [{\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tmessage: \"No input validation library found. Without validation, your API may accept malformed data leading to runtime errors or security vulnerabilities.\",\n\t\t\t\tfix: {\n\t\t\t\t\tdescription: \"Add an input validation library and validate all incoming request data\",\n\t\t\t\t\tcommand: \"npm install zod\",\n\t\t\t\t\tnextSteps: \"Add input validation schemas to all incoming request data\"\n\t\t\t\t},\n\t\t\t\treportedBy: [\"node-input-validation\"]\n\t\t\t}],\n\t\t\ttoolsUsed: [\"node-input-validation\"],\n\t\t\tduration: elapsed()\n\t\t};\n\t}\n};\n//#endregion\n//#region src/integrations/node-security.ts\nconst HELMET_PACKAGES = [\n\t\"helmet\",\n\t\"koa-helmet\",\n\t\"fastify-helmet\"\n];\nconst CORS_PACKAGES = [\n\t\"cors\",\n\t\"@koa/cors\",\n\t\"@fastify/cors\",\n\t\"koa2-cors\"\n];\nconst RATE_LIMIT_PACKAGES = [\n\t\"express-rate-limit\",\n\t\"rate-limiter-flexible\",\n\t\"@fastify/rate-limit\",\n\t\"koa-ratelimit\"\n];\nconst HTTP_SERVER_PACKAGES = [\n\t\"express\",\n\t\"fastify\",\n\t\"koa\",\n\t\"hapi\",\n\t\"@hapi/hapi\",\n\t\"restify\",\n\t\"polka\",\n\t\"micro\",\n\t\"@nestjs/core\",\n\t\"h3\"\n];\nvar NodeSecurityRunner = class extends BaseRunner {\n\tname = \"node-security\";\n\tcategory = \"security\";\n\tapplicableRuntimes = [\"node\"];\n\tasync isApplicable(projectPath, _context) {\n\t\tconst pkgPath = join(projectPath, \"package.json\");\n\t\tif (!existsSync(pkgPath)) return false;\n\t\tconst pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n\t\tconst allDeps = {\n\t\t\t...pkg.dependencies ?? {},\n\t\t\t...pkg.devDependencies ?? {}\n\t\t};\n\t\treturn HTTP_SERVER_PACKAGES.some((p) => p in allDeps);\n\t}\n\tasync run(projectPath) {\n\t\tconst elapsed = timer();\n\t\tconst pkgPath = join(projectPath, \"package.json\");\n\t\tif (!existsSync(pkgPath)) return this.skipped(\"No package.json found\");\n\t\tconst pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n\t\tconst allDeps = {\n\t\t\t...pkg.dependencies ?? {},\n\t\t\t...pkg.devDependencies ?? {}\n\t\t};\n\t\tconst hasHelmet = HELMET_PACKAGES.some((p) => p in allDeps);\n\t\tconst hasCors = CORS_PACKAGES.some((p) => p in allDeps);\n\t\tconst hasRateLimit = RATE_LIMIT_PACKAGES.some((p) => p in allDeps);\n\t\tconst issues = [];\n\t\tlet score = 0;\n\t\tif (hasHelmet) score += 35;\n\t\telse issues.push({\n\t\t\tseverity: \"critical\",\n\t\t\tmessage: \"Missing security headers middleware (helmet). HTTP security headers protect against XSS, clickjacking, MIME sniffing, and other common attacks.\",\n\t\t\tfix: {\n\t\t\t\tdescription: \"Install helmet and add app.use(helmet()) before your routes\",\n\t\t\t\tcommand: \"npm install helmet\",\n\t\t\t\tnextSteps: \"Add app.use(helmet()) before your routes\"\n\t\t\t},\n\t\t\treportedBy: [\"node-security\"]\n\t\t});\n\t\tif (hasCors) score += 30;\n\t\telse issues.push({\n\t\t\tseverity: \"warning\",\n\t\t\tmessage: \"Missing CORS middleware. Without explicit CORS configuration your API may be inaccessible from browser clients or accept requests from any origin.\",\n\t\t\tfix: {\n\t\t\t\tdescription: \"Install cors and configure allowed origins explicitly\",\n\t\t\t\tcommand: \"npm install cors\",\n\t\t\t\tnextSteps: \"Configure allowed origins explicitly with cors({ origin: [...] })\"\n\t\t\t},\n\t\t\treportedBy: [\"node-security\"]\n\t\t});\n\t\tif (hasRateLimit) score += 35;\n\t\telse issues.push({\n\t\t\tseverity: \"warning\",\n\t\t\tmessage: \"Missing rate limiting middleware. Without rate limiting your API is vulnerable to DoS attacks and credential brute-forcing.\",\n\t\t\tfix: {\n\t\t\t\tdescription: \"Install express-rate-limit and configure limits per route or globally\",\n\t\t\t\tcommand: \"npm install express-rate-limit\",\n\t\t\t\tnextSteps: \"Configure rate limits per route or globally\"\n\t\t\t},\n\t\t\treportedBy: [\"node-security\"]\n\t\t});\n\t\tconst status = score >= 80 ? \"pass\" : score >= 50 ? \"warning\" : \"fail\";\n\t\treturn {\n\t\t\tid: \"node-security\",\n\t\t\tcategory: this.category,\n\t\t\tname: \"Node Security Middleware\",\n\t\t\tscore,\n\t\t\tstatus,\n\t\t\tissues,\n\t\t\ttoolsUsed: [\"node-security\"],\n\t\t\tduration: elapsed()\n\t\t};\n\t}\n};\n//#endregion\n//#region src/integrations/npm-audit.ts\nvar NpmAuditRunner = class extends BaseRunner {\n\tname = \"npm-audit\";\n\tcategory = \"security\";\n\tasync run(projectPath) {\n\t\tconst elapsed = timer();\n\t\tconst pm = detectPackageManager(projectPath);\n\t\tif (pm === \"yarn\" || pm === \"bun\") return this.skipped(`${pm} audit not supported — run: ${pm} audit`);\n\t\ttry {\n\t\t\tconst { stdout } = await execa(pm, [\"audit\", \"--json\"], {\n\t\t\t\tcwd: projectPath,\n\t\t\t\treject: false,\n\t\t\t\ttimeout: 6e4\n\t\t\t});\n\t\t\tconst raw = parseJsonOutput(stdout, \"{}\");\n\t\t\tconst { issues, vulnerablePackages, meta } = pm === \"pnpm\" ? parsePnpmAudit(raw, projectPath) : parseNpmAudit(raw);\n\t\t\tconst critical = (meta?.critical ?? 0) + (meta?.high ?? 0);\n\t\t\tconst moderate = meta?.moderate ?? 0;\n\t\t\tconst low = meta?.low ?? 0;\n\t\t\tconst filteredCritical = issues.filter((i) => i.severity === \"critical\").length;\n\t\t\tconst filteredWarning = issues.filter((i) => i.severity === \"warning\").length;\n\t\t\tconst hasScopeFiltering = pm === \"pnpm\" && filteredCritical + filteredWarning < critical + moderate + low;\n\t\t\tconst effectiveCritical = hasScopeFiltering ? filteredCritical : critical;\n\t\t\tconst score = effectiveCritical > 0 ? Math.max(0, 60 - effectiveCritical * 15) : Math.max(0, 100 - (hasScopeFiltering ? filteredWarning : moderate) * 10 - (hasScopeFiltering ? 0 : low) * 2);\n\t\t\treturn {\n\t\t\t\tid: \"npm-audit\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Security Vulnerabilities\",\n\t\t\t\tscore,\n\t\t\t\tstatus: effectiveCritical > 0 ? \"fail\" : issues.length > 0 ? \"warning\" : \"pass\",\n\t\t\t\tissues,\n\t\t\t\ttoolsUsed: [`${pm}-audit`],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: {\n\t\t\t\t\t...meta,\n\t\t\t\t\tvulnerablePackages\n\t\t\t\t}\n\t\t\t};\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tid: \"npm-audit\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Security Vulnerabilities\",\n\t\t\t\tscore: 0,\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tissues: [{\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\tmessage: `${pm} audit failed: ${err}`,\n\t\t\t\t\treportedBy: [\"npm-audit\"]\n\t\t\t\t}],\n\t\t\t\ttoolsUsed: [`${pm}-audit`],\n\t\t\t\tduration: elapsed()\n\t\t\t};\n\t\t}\n\t}\n};\nfunction parseNpmAudit(data) {\n\tconst issues = [];\n\tconst meta = data.metadata?.vulnerabilities;\n\tconst vulnerablePackages = {};\n\tfor (const [pkgName, vuln] of Object.entries(data.vulnerabilities ?? {})) {\n\t\tconst advisoryCount = Array.isArray(vuln.via) ? vuln.via.filter((v) => typeof v === \"object\" && v !== null && \"title\" in v).length : 0;\n\t\tvulnerablePackages[pkgName] = Math.max(advisoryCount, 1);\n\t}\n\tfor (const [, vuln] of Object.entries(data.vulnerabilities ?? {})) {\n\t\tconst via = Array.isArray(vuln.via) ? vuln.via[0] : null;\n\t\tconst title = typeof via === \"object\" && via?.title ? via.title : `Vulnerability in ${vuln.name}`;\n\t\tconst url = typeof via === \"object\" && via?.url ? via.url : void 0;\n\t\tissues.push({\n\t\t\tseverity: vuln.severity === \"critical\" || vuln.severity === \"high\" ? \"critical\" : \"warning\",\n\t\t\tmessage: formatAuditMessage(vuln.name, title, url),\n\t\t\tsuppressMatch: vuln.name,\n\t\t\tfix: typeof vuln.fixAvailable === \"object\" ? { description: `Upgrade to ${vuln.fixAvailable.name}@${vuln.fixAvailable.version}` } : { description: \"No automatic fix available\" },\n\t\t\treportedBy: [\"npm-audit\"],\n\t\t\t...url && { file: url }\n\t\t});\n\t}\n\treturn {\n\t\tissues,\n\t\tvulnerablePackages,\n\t\tmeta\n\t};\n}\nfunction parsePnpmAudit(data, projectPath) {\n\tconst issues = [];\n\tconst meta = data.metadata?.vulnerabilities;\n\tconst vulnerablePackages = {};\n\tconst advisories = filterPnpmAdvisories(data.advisories ?? {}, projectPath);\n\tfor (const [, advisory] of Object.entries(advisories)) {\n\t\tconst pkgName = advisory.module_name;\n\t\tvulnerablePackages[pkgName] = (vulnerablePackages[pkgName] ?? 0) + 1;\n\t\tissues.push({\n\t\t\tseverity: advisory.severity === \"critical\" || advisory.severity === \"high\" ? \"critical\" : \"warning\",\n\t\t\tmessage: formatAuditMessage(pkgName, advisory.title || `Vulnerability in ${pkgName}`, advisory.url),\n\t\t\tsuppressMatch: pkgName,\n\t\t\tfix: advisory.recommendation ? { description: advisory.recommendation } : { description: \"No automatic fix available\" },\n\t\t\treportedBy: [\"npm-audit\"],\n\t\t\t...advisory.url && { file: advisory.url }\n\t\t});\n\t}\n\treturn {\n\t\tissues,\n\t\tvulnerablePackages,\n\t\tmeta\n\t};\n}\n/**\n* In a pnpm workspace, `pnpm audit` returns advisories for ALL packages.\n* Each advisory's findings contain paths like `packages__react-app>dep>transitive`.\n* The prefix is the package's relative path from the workspace root with `/` → `__`.\n* Filter to only advisories that affect the target package.\n*/\nfunction filterPnpmAdvisories(advisories, projectPath) {\n\tconst workspaceRoot = findPnpmWorkspaceRoot(projectPath);\n\tif (!workspaceRoot || workspaceRoot === projectPath) return advisories;\n\tconst importerPrefix = relativeFromRoot(workspaceRoot, projectPath).replace(/\\//g, \"__\");\n\tconst filtered = {};\n\tfor (const [id, advisory] of Object.entries(advisories)) if (advisory.findings.some((f) => f.paths.some((p) => p === importerPrefix || p.startsWith(importerPrefix + \">\")))) filtered[id] = advisory;\n\treturn filtered;\n}\nfunction findPnpmWorkspaceRoot(startPath) {\n\tlet dir = startPath;\n\twhile (true) {\n\t\tif (existsSync(join(dir, \"pnpm-workspace.yaml\"))) return dir;\n\t\tconst parent = dirname(dir);\n\t\tif (parent === dir) return null;\n\t\tdir = parent;\n\t}\n}\n/**\n* Format audit message as: [module] title (GHSA-xxxx)\n* Makes suppression easier — users can match on module name, title keywords, or GHSA ID.\n*/\nfunction formatAuditMessage(moduleName, title, url) {\n\tconst ghsaId = url?.match(/GHSA-[\\w-]+/)?.[0];\n\treturn `[${moduleName}] ${title}${ghsaId ? ` (${ghsaId})` : \"\"}`;\n}\n//#endregion\n//#region src/integrations/outdated.ts\nvar OutdatedRunner = class extends BaseRunner {\n\tname = \"outdated\";\n\tcategory = \"dependencies\";\n\tasync run(projectPath, options) {\n\t\tconst elapsed = timer();\n\t\tconst pm = detectPackageManager(projectPath);\n\t\tconst maxOutdated = (options?.checkConfig?.thresholds)?.maxOutdated ?? 15;\n\t\tif (pm === \"yarn\" || pm === \"bun\") return this.skipped(`${pm} outdated not supported — run: ${pm} outdated`);\n\t\ttry {\n\t\t\tconst { stdout } = await execa(pm, [\"outdated\", \"--json\"], {\n\t\t\t\tcwd: projectPath,\n\t\t\t\treject: false,\n\t\t\t\ttimeout: 6e4\n\t\t\t});\n\t\t\tconst issues = parseOutdated(stdout).map((e) => {\n\t\t\t\tconst updateType = getUpdateType(e.current, e.latest);\n\t\t\t\tconst isMajor = updateType === \"major\";\n\t\t\t\treturn {\n\t\t\t\t\tseverity: isMajor ? \"warning\" : \"info\",\n\t\t\t\t\tmessage: `${e.name}: ${e.current} → ${e.latest} (${updateType})`,\n\t\t\t\t\tsuppressMatch: e.name,\n\t\t\t\t\tfix: isMajor ? { description: `Update ${e.name} to ${e.latest} (major — review changelog before upgrading)` } : {\n\t\t\t\t\t\tdescription: `Update ${e.name} to ${e.latest}`,\n\t\t\t\t\t\tcommand: `${pm} update ${e.name}`,\n\t\t\t\t\t\tnextSteps: \"Run tests to verify nothing broke\"\n\t\t\t\t\t},\n\t\t\t\t\treportedBy: [\"outdated\"]\n\t\t\t\t};\n\t\t\t});\n\t\t\tconst count = issues.length;\n\t\t\treturn {\n\t\t\t\tid: \"outdated\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Outdated Packages\",\n\t\t\t\tscore: Math.max(0, 100 - count * 3),\n\t\t\t\tstatus: count === 0 ? \"pass\" : count > maxOutdated ? \"fail\" : \"warning\",\n\t\t\t\tissues,\n\t\t\t\ttoolsUsed: [pm],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: { outdatedCount: count }\n\t\t\t};\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tid: \"outdated\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Outdated Packages\",\n\t\t\t\tscore: 0,\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tissues: [{\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\tmessage: `${pm} outdated failed: ${err}`,\n\t\t\t\t\treportedBy: [\"outdated\"]\n\t\t\t\t}],\n\t\t\t\ttoolsUsed: [pm],\n\t\t\t\tduration: elapsed()\n\t\t\t};\n\t\t}\n\t}\n};\nfunction parseOutdated(stdout) {\n\tif (!stdout.trim()) return [];\n\ttry {\n\t\tconst raw = JSON.parse(stdout);\n\t\treturn Object.entries(raw).filter(([_, info]) => info.current && info.latest && info.current !== info.latest).map(([name, info]) => ({\n\t\t\tname,\n\t\t\tcurrent: info.current,\n\t\t\tlatest: info.latest,\n\t\t\tdev: (info.type ?? info.dependencyType ?? \"\") === \"devDependencies\"\n\t\t}));\n\t} catch {\n\t\treturn [];\n\t}\n}\nfunction getVersionParts(version) {\n\tif (!version) return [\n\t\t0,\n\t\t0,\n\t\t0\n\t];\n\tconst parts = version.replace(/^[^0-9]*/, \"\").split(\".\");\n\treturn [\n\t\tparseInt(parts[0] ?? \"0\", 10),\n\t\tparseInt(parts[1] ?? \"0\", 10),\n\t\tparseInt(parts[2] ?? \"0\", 10)\n\t];\n}\nfunction getUpdateType(current, latest) {\n\tconst [curMaj, curMin, curPatch] = getVersionParts(current);\n\tconst [latMaj, latMin, latPatch] = getVersionParts(latest);\n\tif (curMaj !== latMaj) return \"major\";\n\tif (curMin !== latMin) return \"minor\";\n\tif (curPatch !== latPatch) return \"patch\";\n\treturn \"patch\";\n}\n//#endregion\n//#region src/integrations/react-perf.ts\nconst SOURCE_DIRS = [\n\t\"src\",\n\t\"app\",\n\t\"lib\"\n];\n/**\n* ReactPerfRunner analyzes React component files for common performance anti-patterns.\n* It scans .tsx and .jsx files for issues like inline objects in JSX props, using array index as key in lists, and large component files.\n* The runner provides actionable feedback on how to fix each issue, such as extracting inline objects or using unique keys.\n* It calculates an overall score based on the number and severity of findings, giving insights into the project's React performance health.\n*/\nconst COMPONENT_EXTENSIONS = new Set([\".tsx\", \".jsx\"]);\nvar ReactPerfRunner = class extends BaseRunner {\n\tname = \"react-perf\";\n\tcategory = \"performance\";\n\tapplicableFrameworks = [\n\t\t\"react\",\n\t\t\"next\",\n\t\t\"remix\"\n\t];\n\tasync isApplicable(projectPath) {\n\t\treturn SOURCE_DIRS.some((dir) => existsSync(join(projectPath, dir)));\n\t}\n\tasync run(projectPath, options) {\n\t\tconst elapsed = timer();\n\t\tconst isExcluded = createExcludeFilter(options?.checkConfig?.exclude ?? []);\n\t\ttry {\n\t\t\tconst hasReactCompiler = detectReactCompiler(projectPath);\n\t\t\tconst findings = [];\n\t\t\tconst files = SOURCE_DIRS.flatMap((dir) => existsSync(join(projectPath, dir)) ? scanDirectory$2(join(projectPath, dir), projectPath, isExcluded) : []);\n\t\t\tfor (const file of files) findings.push(...analyzeFile(file.path, file.fullPath, file.lines));\n\t\t\tconst activeFindings = hasReactCompiler ? findings.filter((f) => !f.pattern.includes(\"Inline object\")) : findings;\n\t\t\tconst issues = activeFindings.map((f) => ({\n\t\t\t\tseverity: f.severity,\n\t\t\t\tmessage: f.line > 0 ? `${f.file}:${f.line} — ${f.pattern}` : `${f.file} — ${f.pattern}`,\n\t\t\t\tfile: f.file,\n\t\t\t\tsuppressMatch: f.file,\n\t\t\t\tfix: { description: getFixDescription(f.pattern) },\n\t\t\t\treportedBy: [\"react-perf\"]\n\t\t\t}));\n\t\t\tconst patternCounts = /* @__PURE__ */ new Map();\n\t\t\tfor (const f of activeFindings) {\n\t\t\t\tconst idx = f.pattern.indexOf(\" — \");\n\t\t\t\tconst key = idx >= 0 ? f.pattern.slice(idx + 3) : f.pattern;\n\t\t\t\tconst entry = patternCounts.get(key) ?? {\n\t\t\t\t\twarnings: 0,\n\t\t\t\t\tinfos: 0\n\t\t\t\t};\n\t\t\t\tif (f.severity === \"warning\") entry.warnings++;\n\t\t\t\telse entry.infos++;\n\t\t\t\tpatternCounts.set(key, entry);\n\t\t\t}\n\t\t\tlet penalty = 0;\n\t\t\tfor (const [, counts] of patternCounts) {\n\t\t\t\tif (counts.warnings > 0) penalty += 10 + Math.log2(counts.warnings) * 3;\n\t\t\t\tif (counts.infos > 0) penalty += 3 + Math.log2(counts.infos);\n\t\t\t}\n\t\t\tconst score = Math.max(20, Math.round(100 - penalty));\n\t\t\tconst warningCount = activeFindings.filter((f) => f.severity === \"warning\").length;\n\t\t\tconst infoCount = activeFindings.filter((f) => f.severity === \"info\").length;\n\t\t\treturn {\n\t\t\t\tid: \"react-perf\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"React Performance\",\n\t\t\t\tscore,\n\t\t\t\tstatus: warningCount > 0 ? \"warning\" : infoCount > 0 ? \"warning\" : \"pass\",\n\t\t\t\tissues,\n\t\t\t\ttoolsUsed: [\"react-perf\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: {\n\t\t\t\t\tfilesScanned: files.length,\n\t\t\t\t\treactCompiler: hasReactCompiler,\n\t\t\t\t\ttotalFindings: activeFindings.length,\n\t\t\t\t\tinlineObjects: activeFindings.filter((f) => f.pattern.includes(\"Inline\")).length,\n\t\t\t\t\tindexAsKey: activeFindings.filter((f) => f.pattern.includes(\"index as key\")).length,\n\t\t\t\t\tlargeComponents: activeFindings.filter((f) => f.pattern.includes(\"Large component\")).length\n\t\t\t\t}\n\t\t\t};\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tid: \"react-perf\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"React Performance\",\n\t\t\t\tscore: 0,\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tissues: [{\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\tmessage: `React perf check failed: ${err}`,\n\t\t\t\t\treportedBy: [\"react-perf\"]\n\t\t\t\t}],\n\t\t\t\ttoolsUsed: [\"react-perf\"],\n\t\t\t\tduration: elapsed()\n\t\t\t};\n\t\t}\n\t}\n};\nfunction detectReactCompiler(projectPath) {\n\ttry {\n\t\tconst pkg = JSON.parse(readFileSync(join(projectPath, \"package.json\"), \"utf-8\"));\n\t\tconst allDeps = {\n\t\t\t...pkg.dependencies,\n\t\t\t...pkg.devDependencies\n\t\t};\n\t\treturn \"babel-plugin-react-compiler\" in allDeps || \"@react-compiler/babel\" in allDeps;\n\t} catch {\n\t\treturn false;\n\t}\n}\nfunction scanDirectory$2(dir, projectRoot, isExcluded) {\n\tconst files = [];\n\ttry {\n\t\tfor (const entry of readdirSync(dir)) {\n\t\t\tif (entry.startsWith(\".\") || entry === \"node_modules\" || entry === \"__tests__\" || entry === \"__mocks__\" || entry.includes(\".test.\") || entry.includes(\".spec.\")) continue;\n\t\t\tconst fullPath = join(dir, entry);\n\t\t\tif (isExcluded(relativeFromRoot(projectRoot, fullPath))) continue;\n\t\t\tif (statSync(fullPath).isDirectory()) files.push(...scanDirectory$2(fullPath, projectRoot, isExcluded));\n\t\t\telse if (COMPONENT_EXTENSIONS.has(extname(entry))) try {\n\t\t\t\tconst lineCount = readFileSync(fullPath, \"utf-8\").split(\"\\n\").length;\n\t\t\t\tfiles.push({\n\t\t\t\t\tpath: relativeFromRoot(projectRoot, fullPath),\n\t\t\t\t\tfullPath,\n\t\t\t\t\tlines: lineCount\n\t\t\t\t});\n\t\t\t} catch {}\n\t\t}\n\t} catch {}\n\treturn files;\n}\nfunction analyzeFile(relPath, fullPath, lineCount) {\n\tconst findings = [];\n\ttry {\n\t\tconst content = readFileSync(fullPath, \"utf-8\");\n\t\tconst lines = content.split(\"\\n\");\n\t\tconst { warn } = getThresholds(relPath);\n\t\tif (lineCount > warn) findings.push({\n\t\t\tfile: relPath,\n\t\t\tline: 0,\n\t\t\tpattern: `Large component file (${lineCount} lines, threshold: ${warn}) — consider splitting`,\n\t\t\tseverity: \"info\"\n\t\t});\n\t\tfor (let i = 0; i < lines.length; i++) {\n\t\t\tconst line = lines[i];\n\t\t\tconst trimmed = line.trim();\n\t\t\tif (trimmed.startsWith(\"//\") || trimmed.startsWith(\"*\") || trimmed.startsWith(\"/*\")) continue;\n\t\t\tif (/\\w+=\\{\\{/.test(line) && !trimmed.startsWith(\"//\")) {\n\t\t\t\tif (!/className=\\{\\{/.test(line)) findings.push({\n\t\t\t\t\tfile: relPath,\n\t\t\t\t\tline: i + 1,\n\t\t\t\t\tpattern: \"Inline object in JSX prop — creates new reference every render\",\n\t\t\t\t\tseverity: \"warning\"\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (/\\.map\\s*\\(/.test(line) || i > 0 && /\\.map\\s*\\(/.test(lines[i - 1])) {\n\t\t\t\tif (/key=\\{(?:index|i|idx)\\}/.test(line)) findings.push({\n\t\t\t\t\tfile: relPath,\n\t\t\t\t\tline: i + 1,\n\t\t\t\t\tpattern: \"Using index as key in list — can cause rendering issues with dynamic lists\",\n\t\t\t\t\tseverity: \"warning\"\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tcheckLazyRoutes(content, relPath, findings);\n\t} catch {}\n\treturn findings;\n}\nfunction checkLazyRoutes(content, relPath, findings) {\n\tif (!content.includes(\"<Route\") && !content.includes(\"createBrowserRouter\")) return;\n\tconst hasLazy = content.includes(\"React.lazy\") || content.includes(\"lazy(\");\n\tconst importLines = content.split(\"\\n\").filter((l) => l.startsWith(\"import \") && !l.includes(\"react-router\"));\n\tif (!hasLazy && importLines.length > 3) findings.push({\n\t\tfile: relPath,\n\t\tline: 0,\n\t\tpattern: \"Route file with static imports — consider React.lazy() for code splitting\",\n\t\tseverity: \"info\"\n\t});\n}\nfunction getFixDescription(pattern) {\n\tif (pattern.includes(\"Inline object\")) return \"Extract the object to a constant outside the component or use useMemo()\";\n\tif (pattern.includes(\"index as key\")) return \"Use a unique identifier (id, slug, etc.) as the key instead of the array index\";\n\tif (pattern.includes(\"Large component\")) return \"Break into smaller, focused components to improve readability and render performance\";\n\tif (pattern.includes(\"lazy\")) return \"Use React.lazy() and Suspense for route-level code splitting\";\n\treturn \"Review and optimize for better rendering performance\";\n}\n//#endregion\n//#region src/integrations/secrets.ts\n/**\n* SecretsRunner analyzes the project's source code and configuration files to detect hardcoded secrets such as API keys, tokens, and passwords.\n* It uses a set of regex patterns to identify potential secrets in various file types, including .env files, JavaScript/TypeScript source files, and common configuration formats.\n* The runner provides actionable feedback on how to fix each issue, such as moving secrets to environment variables or using secret management tools.\n* It calculates an overall score based on the number and severity of findings, giving insights into the project's security posture regarding secret management.\n*/\nconst SCAN_EXTENSIONS = new Set([\n\t\".ts\",\n\t\".tsx\",\n\t\".js\",\n\t\".jsx\",\n\t\".mts\",\n\t\".cts\",\n\t\".json\",\n\t\".yaml\",\n\t\".yml\",\n\t\".toml\"\n]);\nconst SKIP_FILES = new Set([\n\t\"package-lock.json\",\n\t\"pnpm-lock.yaml\",\n\t\"yarn.lock\",\n\t\".env.example\",\n\t\".env.sample\",\n\t\".env.template\"\n]);\nconst PATTERNS = [\n\t{\n\t\tname: \"AWS Access Key\",\n\t\tregex: /AKIA[0-9A-Z]{16}/\n\t},\n\t{\n\t\tname: \"GitHub Token\",\n\t\tregex: /gh[pousr]_[A-Za-z0-9_]{36,}/\n\t},\n\t{\n\t\tname: \"Slack Token\",\n\t\tregex: /xox[baprs]-[0-9A-Za-z-]{10,}/\n\t},\n\t{\n\t\tname: \"Google API Key\",\n\t\tregex: /AIza[0-9A-Za-z\\-_]{35}/\n\t},\n\t{\n\t\tname: \"Stripe Key\",\n\t\tregex: /[rs]k_live_[0-9a-zA-Z]{24}/\n\t},\n\t{\n\t\tname: \"Private Key\",\n\t\tregex: /-----BEGIN (?:RSA |EC |OPENSSH )?PRIVATE KEY-----/\n\t},\n\t{\n\t\tname: \"Hardcoded password\",\n\t\tregex: /(?:^|[^a-z])(?:password|passwd|pwd)\\s*[=:]\\s*[\"'][^\"']{8,}[\"']/i\n\t},\n\t{\n\t\tname: \"Hardcoded API key\",\n\t\tregex: /(?:^|[^a-z])(?:api_?key|apikey)\\s*[=:]\\s*[\"'][A-Za-z0-9+/=_-]{16,}[\"']/i\n\t},\n\t{\n\t\tname: \"Hardcoded secret\",\n\t\tregex: /(?:^|[^a-z])(?:secret)\\s*[=:]\\s*[\"'][A-Za-z0-9+/=_-]{16,}[\"']/i\n\t}\n];\nvar SecretsRunner = class extends BaseRunner {\n\tname = \"secrets\";\n\tcategory = \"security\";\n\tasync run(projectPath, options) {\n\t\tconst elapsed = timer();\n\t\tconst isExcluded = createExcludeFilter(options?.checkConfig?.exclude ?? []);\n\t\ttry {\n\t\t\tconst findings = [];\n\t\t\tfor (const envFile of [\n\t\t\t\t\".env\",\n\t\t\t\t\".env.local\",\n\t\t\t\t\".env.production\"\n\t\t\t]) if (existsSync(join(projectPath, envFile))) {\n\t\t\t\tconst gitignorePath = join(projectPath, \".gitignore\");\n\t\t\t\tlet ignored = false;\n\t\t\t\ttry {\n\t\t\t\t\tconst gitignore = readFileSync(gitignorePath, \"utf-8\");\n\t\t\t\t\tignored = gitignore.includes(envFile) || gitignore.includes(\".env\");\n\t\t\t\t} catch {}\n\t\t\t\tif (!ignored) findings.push({\n\t\t\t\t\tfile: envFile,\n\t\t\t\t\tline: 0,\n\t\t\t\t\tpattern: \".env file not in .gitignore\"\n\t\t\t\t});\n\t\t\t}\n\t\t\tfor (const dir of [\n\t\t\t\t\"src\",\n\t\t\t\t\"app\",\n\t\t\t\t\"lib\",\n\t\t\t\t\"config\",\n\t\t\t\t\"scripts\",\n\t\t\t\t\".github/workflows\"\n\t\t\t]) {\n\t\t\t\tconst fullDir = join(projectPath, dir);\n\t\t\t\tif (existsSync(fullDir)) findings.push(...scanDirectory$1(fullDir, projectPath, isExcluded));\n\t\t\t}\n\t\t\tfindings.push(...scanRootFiles(projectPath, isExcluded));\n\t\t\tconst issues = findings.map((f) => ({\n\t\t\t\tseverity: \"critical\",\n\t\t\t\tmessage: f.line > 0 ? `${f.file}:${f.line} — ${f.pattern} detected` : `${f.file} — ${f.pattern}`,\n\t\t\t\tsuppressMatch: f.pattern,\n\t\t\t\tfile: f.file,\n\t\t\t\tfix: { description: \"Move secrets to environment variables\" },\n\t\t\t\treportedBy: [\"secrets\"]\n\t\t\t}));\n\t\t\tconst count = findings.length;\n\t\t\tconst score = Math.max(0, 100 - count * 25);\n\t\t\treturn {\n\t\t\t\tid: \"secrets\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Secrets Detection\",\n\t\t\t\tscore,\n\t\t\t\tstatus: count === 0 ? \"pass\" : \"fail\",\n\t\t\t\tissues,\n\t\t\t\ttoolsUsed: [\"secrets\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: { findings: count }\n\t\t\t};\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tid: \"secrets\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Secrets Detection\",\n\t\t\t\tscore: 0,\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tissues: [{\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\tmessage: `Secrets scan failed: ${err}`,\n\t\t\t\t\treportedBy: [\"secrets\"]\n\t\t\t\t}],\n\t\t\t\ttoolsUsed: [\"secrets\"],\n\t\t\t\tduration: elapsed()\n\t\t\t};\n\t\t}\n\t}\n};\nfunction scanDirectory$1(dir, projectRoot, isExcluded) {\n\tconst findings = [];\n\ttry {\n\t\tfor (const entry of readdirSync(dir)) {\n\t\t\tif (entry.startsWith(\".\") || entry === \"node_modules\" || entry === \"__tests__\" || entry === \"test\" || entry === \"tests\") continue;\n\t\t\tconst fullPath = join(dir, entry);\n\t\t\tif (isExcluded(relativeFromRoot(projectRoot, fullPath))) continue;\n\t\t\tif (statSync(fullPath).isDirectory()) findings.push(...scanDirectory$1(fullPath, projectRoot, isExcluded));\n\t\t\telse if (SCAN_EXTENSIONS.has(extname(entry)) && !SKIP_FILES.has(basename(entry)) && !isTestFile(entry)) findings.push(...scanFile$1(fullPath, projectRoot));\n\t\t}\n\t} catch {}\n\treturn findings;\n}\nfunction isTestFile(filename) {\n\treturn /\\.(test|spec)\\.(ts|tsx|js|jsx|mts|cts)$/.test(filename);\n}\n/**\n* Scan loose files at the project root only — no recursion. Catches things\n* like next.config.js, vite.config.ts, webpack.config.js where developers\n* sometimes inline credentials. Skips package.json and other lock files\n* via the SKIP_FILES set.\n*/\nfunction scanRootFiles(projectRoot, isExcluded) {\n\tconst findings = [];\n\ttry {\n\t\tfor (const entry of readdirSync(projectRoot)) {\n\t\t\tconst fullPath = join(projectRoot, entry);\n\t\t\tlet stat;\n\t\t\ttry {\n\t\t\t\tstat = statSync(fullPath);\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!stat.isFile()) continue;\n\t\t\tif (!SCAN_EXTENSIONS.has(extname(entry))) continue;\n\t\t\tif (SKIP_FILES.has(basename(entry))) continue;\n\t\t\tif (entry === \"package.json\") continue;\n\t\t\tif (isTestFile(entry)) continue;\n\t\t\tif (isExcluded(entry)) continue;\n\t\t\tfindings.push(...scanFile$1(fullPath, projectRoot));\n\t\t}\n\t} catch {}\n\treturn findings;\n}\nfunction scanFile$1(filePath, projectRoot) {\n\tconst findings = [];\n\ttry {\n\t\tconst lines = readFileSync(filePath, \"utf-8\").split(\"\\n\");\n\t\tconst relPath = relativeFromRoot(projectRoot, filePath);\n\t\tfor (let i = 0; i < lines.length; i++) {\n\t\t\tconst line = lines[i];\n\t\t\tif (line.includes(\"process.env\") || line.includes(\"import.meta.env\")) continue;\n\t\t\tif (line.trim().startsWith(\"//\") || line.trim().startsWith(\"#\") || line.trim().startsWith(\"*\")) continue;\n\t\t\tfor (const pattern of PATTERNS) if (pattern.regex.test(line)) {\n\t\t\t\tfindings.push({\n\t\t\t\t\tfile: relPath,\n\t\t\t\t\tline: i + 1,\n\t\t\t\t\tpattern: pattern.name\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} catch {}\n\treturn findings;\n}\n//#endregion\n//#region src/integrations/source-map-explorer.ts\nconst SIZE_THRESHOLD_WARN = 500 * 1024;\nconst SIZE_THRESHOLD_FAIL = 1024 * 1024;\n/**\n* Parses index.html in the build dir to find entry chunk script tags.\n* Returns absolute paths to the entry JS files, or [] if not determinable.\n*/\nfunction findEntryChunks(buildPath) {\n\ttry {\n\t\treturn [...readFileSync(join(buildPath, \"index.html\"), \"utf8\").matchAll(/<script[^>]+src=\"([^\"]+\\.js)\"[^>]*>/gi)].map((m) => join(buildPath, m[1].replace(/^\\//, \"\")));\n\t} catch {\n\t\treturn [];\n\t}\n}\nvar SourceMapExplorerRunner = class extends BaseRunner {\n\tname = \"source-map-explorer\";\n\tdisplayName = \"Bundle Size\";\n\tcategory = \"performance\";\n\tapplicableRuntimes = [\"browser\"];\n\tasync run(projectPath, options) {\n\t\tconst elapsed = timer();\n\t\tconst t = options?.checkConfig?.thresholds;\n\t\tconst warnSize = t?.warnSize ?? SIZE_THRESHOLD_WARN;\n\t\tconst failSize = t?.failSize ?? SIZE_THRESHOLD_FAIL;\n\t\tconst buildDir = fileExists(projectPath, \"dist\") ? \"dist\" : \"build\";\n\t\tconst buildPath = join(projectPath, buildDir);\n\t\tconst hasSourceMaps = (await globby(\"**/*.js.map\", {\n\t\t\tcwd: buildPath,\n\t\t\tabsolute: false\n\t\t})).length > 0;\n\t\tif (hasSourceMaps) {\n\t\t\tif (await isCommandAvailable(\"source-map-explorer\")) try {\n\t\t\t\tconst { stdout } = await execa(\"source-map-explorer\", [`${buildDir}/**/*.js`, \"--json\"], {\n\t\t\t\t\tcwd: projectPath,\n\t\t\t\t\treject: false,\n\t\t\t\t\tpreferLocal: true,\n\t\t\t\t\tlocalDir: coreLocalDir\n\t\t\t\t});\n\t\t\t\tif (stdout && stdout.trim().startsWith(\"{\")) {\n\t\t\t\t\tconst results = parseJsonOutput(stdout, \"{}\").results ?? [];\n\t\t\t\t\tif (results.length > 0) {\n\t\t\t\t\t\tconst totalBytes = results.reduce((sum, r) => sum + r.totalBytes, 0);\n\t\t\t\t\t\tconst largestBytes = Math.max(...results.map((r) => r.totalBytes));\n\t\t\t\t\t\tconst totalKB = Math.round(totalBytes / 1024);\n\t\t\t\t\t\tconst largestKB = Math.round(largestBytes / 1024);\n\t\t\t\t\t\tconst issues = [];\n\t\t\t\t\t\tif (largestBytes > failSize) issues.push({\n\t\t\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\t\t\tmessage: `Largest bundle is ${largestKB}KB — exceeds 1MB threshold`,\n\t\t\t\t\t\t\tfix: { description: \"Use code splitting and lazy imports to reduce bundle size\" },\n\t\t\t\t\t\t\treportedBy: [\"source-map-explorer\"]\n\t\t\t\t\t\t});\n\t\t\t\t\t\telse if (largestBytes > warnSize) issues.push({\n\t\t\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\t\t\tmessage: `Largest bundle is ${largestKB}KB — consider optimizing`,\n\t\t\t\t\t\t\tfix: { description: \"Review large dependencies and consider tree-shaking\" },\n\t\t\t\t\t\t\treportedBy: [\"source-map-explorer\"]\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconst score = largestBytes > failSize ? 40 : largestBytes > warnSize ? 70 : 100;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tid: \"source-map-explorer\",\n\t\t\t\t\t\t\tcategory: this.category,\n\t\t\t\t\t\t\tname: \"Bundle Size\",\n\t\t\t\t\t\t\tscore,\n\t\t\t\t\t\t\tstatus: issues.length === 0 ? \"pass\" : issues[0].severity === \"critical\" ? \"fail\" : \"warning\",\n\t\t\t\t\t\t\tissues,\n\t\t\t\t\t\t\ttoolsUsed: [\"source-map-explorer\"],\n\t\t\t\t\t\t\tduration: elapsed(),\n\t\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\t\tlargestBytes,\n\t\t\t\t\t\t\t\tlargestKB,\n\t\t\t\t\t\t\t\ttotalBytes,\n\t\t\t\t\t\t\t\ttotalKB,\n\t\t\t\t\t\t\t\tbundleCount: results.length,\n\t\t\t\t\t\t\t\tmethod: \"source-map-explorer\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch {}\n\t\t}\n\t\ttry {\n\t\t\tconst jsFiles = await globby(\"**/*.js\", {\n\t\t\t\tcwd: buildPath,\n\t\t\t\tabsolute: true,\n\t\t\t\tignore: [\"**/*.map\"]\n\t\t\t});\n\t\t\tif (jsFiles.length === 0) return this.skipped(`No JavaScript files found in ${buildDir}/`);\n\t\t\tconst totalBytes = jsFiles.reduce((sum, file) => {\n\t\t\t\ttry {\n\t\t\t\t\treturn sum + statSync(file).size;\n\t\t\t\t} catch {\n\t\t\t\t\treturn sum;\n\t\t\t\t}\n\t\t\t}, 0);\n\t\t\tconst entryChunks = findEntryChunks(buildPath);\n\t\t\tconst hasEntryChunkInfo = entryChunks.length > 0;\n\t\t\tconst initialBytes = hasEntryChunkInfo ? entryChunks.reduce((sum, file) => {\n\t\t\t\ttry {\n\t\t\t\t\treturn sum + statSync(file).size;\n\t\t\t\t} catch {\n\t\t\t\t\treturn sum;\n\t\t\t\t}\n\t\t\t}, 0) : totalBytes;\n\t\t\tconst totalKB = Math.round(totalBytes / 1024);\n\t\t\tconst initialKB = Math.round(initialBytes / 1024);\n\t\t\tconst issues = [];\n\t\t\tif (initialBytes > failSize) issues.push({\n\t\t\t\tseverity: \"critical\",\n\t\t\t\tmessage: `Initial bundle is ${initialKB}KB — exceeds 1MB threshold`,\n\t\t\t\tfix: { description: hasSourceMaps ? \"Use code splitting and lazy imports to reduce bundle size\" : \"Use code splitting and lazy imports to reduce bundle size. Enable source maps (sourcemap: true) for detailed analysis\" },\n\t\t\t\treportedBy: [\"bundle-size-check\"]\n\t\t\t});\n\t\t\telse if (initialBytes > warnSize) issues.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tmessage: `Initial bundle is ${initialKB}KB — consider optimizing`,\n\t\t\t\tfix: { description: hasSourceMaps ? \"Review large dependencies and consider tree-shaking\" : \"Review large dependencies and consider tree-shaking. Enable source maps (sourcemap: true) for detailed analysis\" },\n\t\t\t\treportedBy: [\"bundle-size-check\"]\n\t\t\t});\n\t\t\tconst score = initialBytes > failSize ? 40 : initialBytes > warnSize ? 70 : 100;\n\t\t\treturn {\n\t\t\t\tid: \"source-map-explorer\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Bundle Size\",\n\t\t\t\tscore,\n\t\t\t\tstatus: issues.length === 0 ? \"pass\" : issues[0].severity === \"critical\" ? \"fail\" : \"warning\",\n\t\t\t\tissues,\n\t\t\t\ttoolsUsed: [\"file-size-analysis\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: {\n\t\t\t\t\tinitialBytes,\n\t\t\t\t\tinitialKB,\n\t\t\t\t\ttotalBytes,\n\t\t\t\t\ttotalKB,\n\t\t\t\t\tfileCount: jsFiles.length,\n\t\t\t\t\tentryChunks: entryChunks.length,\n\t\t\t\t\tmethod: \"file-size-analysis\",\n\t\t\t\t\tnote: hasEntryChunkInfo ? `Total bundle: ${totalKB}KB across ${jsFiles.length} chunks` : hasSourceMaps ? \"Source maps found but analysis failed\" : \"No source maps — using total bundle size\"\n\t\t\t\t}\n\t\t\t};\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tid: \"source-map-explorer\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Bundle Size\",\n\t\t\t\tscore: 0,\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tissues: [{\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\tmessage: `Bundle analysis failed: ${err}`,\n\t\t\t\t\treportedBy: [\"bundle-size-check\"]\n\t\t\t\t}],\n\t\t\t\ttoolsUsed: [\"file-size-analysis\"],\n\t\t\t\tduration: elapsed()\n\t\t\t};\n\t\t}\n\t}\n};\n//#endregion\n//#region src/integrations/todo-scanner.ts\n/**\n* This module analyzes the project's source code for TODO, FIXME, and HACK comments that indicate technical debt or areas needing attention.\n* It scans through source files in the project, identifying and categorizing these comments based on their type and content.\n* The runner provides actionable feedback on each finding, helping developers prioritize and address technical debt effectively.\n* It calculates an overall score based on the number and severity of findings, giving insights into the project's code quality and maintenance health.\n*/\nconst DEFAULT_PATTERNS = [\n\t\"TODO\",\n\t\"FIXME\",\n\t\"HACK\"\n];\nfunction buildPattern(patterns) {\n\treturn new RegExp(\"\\\\b(\" + patterns.join(\"|\") + \")\\\\b[:\\\\s]*(.*)\", \"i\");\n}\nconst STRING_LITERAL_RE = /(\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*'|`(?:[^`\\\\]|\\\\.)*`)/g;\nfunction stripStringLiterals(line) {\n\treturn line.replace(STRING_LITERAL_RE, (m) => \" \".repeat(m.length));\n}\nconst SOURCE_EXTENSIONS = new Set([\n\t\".ts\",\n\t\".tsx\",\n\t\".js\",\n\t\".jsx\",\n\t\".mts\",\n\t\".cts\"\n]);\nvar TodoScannerRunner = class extends BaseRunner {\n\tname = \"todo-scanner\";\n\tcategory = \"code-quality\";\n\tasync isApplicable(projectPath) {\n\t\treturn existsSync(join(projectPath, \"src\"));\n\t}\n\tasync run(projectPath, options) {\n\t\tconst elapsed = timer();\n\t\tconst pattern = buildPattern((options?.checkConfig?.thresholds)?.patterns ?? DEFAULT_PATTERNS);\n\t\tconst isExcluded = createExcludeFilter(options?.checkConfig?.exclude ?? []);\n\t\ttry {\n\t\t\tconst todos = scanDirectory(join(projectPath, \"src\"), projectPath, pattern, isExcluded);\n\t\t\tconst issues = todos.map((t) => ({\n\t\t\t\tseverity: t.kind === \"FIXME\" || t.kind === \"HACK\" ? \"warning\" : \"info\",\n\t\t\t\tmessage: `${t.file}:${t.line} — ${t.kind}: ${t.text || \"(no description)\"}`,\n\t\t\t\tsuppressMatch: t.file,\n\t\t\t\treportedBy: [\"todo-scanner\"]\n\t\t\t}));\n\t\t\tconst fixmeCount = todos.filter((t) => t.kind === \"FIXME\" || t.kind === \"HACK\").length;\n\t\t\tconst score = Math.max(50, 100 - todos.length * 3);\n\t\t\treturn {\n\t\t\t\tid: \"todo-scanner\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Technical Debt\",\n\t\t\t\tscore,\n\t\t\t\tstatus: todos.length === 0 ? \"pass\" : fixmeCount > 5 || todos.length > 20 ? \"warning\" : \"pass\",\n\t\t\t\tissues,\n\t\t\t\ttoolsUsed: [\"todo-scanner\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: {\n\t\t\t\t\ttotal: todos.length,\n\t\t\t\t\ttodo: todos.filter((t) => t.kind === \"TODO\").length,\n\t\t\t\t\tfixme: fixmeCount,\n\t\t\t\t\thack: todos.filter((t) => t.kind === \"HACK\").length\n\t\t\t\t}\n\t\t\t};\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tid: \"todo-scanner\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Technical Debt\",\n\t\t\t\tscore: 0,\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tissues: [{\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\tmessage: `Todo scan failed: ${err}`,\n\t\t\t\t\treportedBy: [\"todo-scanner\"]\n\t\t\t\t}],\n\t\t\t\ttoolsUsed: [\"todo-scanner\"],\n\t\t\t\tduration: elapsed()\n\t\t\t};\n\t\t}\n\t}\n};\n/** Files that reference TODO/FIXME/HACK as part of their implementation, not as tech debt */\nconst SELF_REFERENCING_FILES = new Set([\"todo-scanner.ts\", \"todo-scanner.test.ts\"]);\nfunction scanDirectory(dir, projectRoot, pattern, isExcluded) {\n\tconst todos = [];\n\ttry {\n\t\tfor (const entry of readdirSync(dir)) {\n\t\t\tif (entry.startsWith(\".\") || entry === \"node_modules\") continue;\n\t\t\tif (SELF_REFERENCING_FILES.has(entry)) continue;\n\t\t\tconst fullPath = join(dir, entry);\n\t\t\tif (isExcluded(relativeFromRoot(projectRoot, fullPath))) continue;\n\t\t\tif (statSync(fullPath).isDirectory()) todos.push(...scanDirectory(fullPath, projectRoot, pattern, isExcluded));\n\t\t\telse if (SOURCE_EXTENSIONS.has(extname(entry))) todos.push(...scanFile(fullPath, projectRoot, pattern));\n\t\t}\n\t} catch {}\n\treturn todos;\n}\nfunction scanFile(filePath, projectRoot, pattern) {\n\tconst todos = [];\n\ttry {\n\t\tconst lines = readFileSync(filePath, \"utf-8\").split(\"\\n\");\n\t\tconst relPath = relativeFromRoot(projectRoot, filePath);\n\t\tfor (let i = 0; i < lines.length; i++) {\n\t\t\tconst match = stripStringLiterals(lines[i]).match(pattern);\n\t\t\tif (match) todos.push({\n\t\t\t\tfile: relPath,\n\t\t\t\tline: i + 1,\n\t\t\t\tkind: match[1].toUpperCase(),\n\t\t\t\ttext: match[2].trim().slice(0, 100)\n\t\t\t});\n\t\t}\n\t} catch {}\n\treturn todos;\n}\n//#endregion\n//#region src/integrations/typescript.ts\n/**\n* TypeScriptRunner uses the TypeScript compiler (tsc) to check for type errors in the project.\n* It runs tsc with --noEmit to perform a type check without generating output files.\n* The runner parses the output of tsc to extract error messages and their locations, reporting them as issues.\n* It calculates an overall score based on the number of type errors, giving insights into the project's type safety health.\n* If tsc fails to run, it reports a critical issue with the error message.\n*/\nvar TypeScriptRunner = class extends BaseRunner {\n\tname = \"typescript\";\n\tcategory = \"code-quality\";\n\tasync isApplicable(projectPath) {\n\t\treturn existsSync(join(projectPath, \"tsconfig.json\"));\n\t}\n\tasync run(projectPath, options) {\n\t\tconst elapsed = timer();\n\t\tconst maxErrors = (options?.checkConfig?.thresholds)?.maxErrors ?? 20;\n\t\ttry {\n\t\t\tconst { stdout, stderr } = await execa(\"tsc\", [\n\t\t\t\t\"--noEmit\",\n\t\t\t\t\"--pretty\",\n\t\t\t\t\"false\"\n\t\t\t], {\n\t\t\t\tcwd: projectPath,\n\t\t\t\treject: false,\n\t\t\t\tpreferLocal: true,\n\t\t\t\ttimeout: 12e4\n\t\t\t});\n\t\t\tconst errorLines = (stdout + stderr).trim().split(\"\\n\").map((l) => l.trim()).filter((l) => l.includes(\": error TS\"));\n\t\t\tconst count = errorLines.length;\n\t\t\tconst issues = errorLines.slice(0, 25).map((line) => {\n\t\t\t\tconst match = line.match(/^(.+)\\((\\d+),\\d+\\): error (TS\\d+: .+)$/);\n\t\t\t\treturn {\n\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\tmessage: match ? `${match[1]}:${match[2]}: ${match[3]}` : line,\n\t\t\t\t\treportedBy: [\"tsc\"]\n\t\t\t\t};\n\t\t\t});\n\t\t\tif (count > 25) issues.push({\n\t\t\t\tseverity: \"info\",\n\t\t\t\tmessage: `...and ${count - 25} more type errors`,\n\t\t\t\treportedBy: [\"tsc\"]\n\t\t\t});\n\t\t\tconst score = Math.max(0, 100 - count * 5);\n\t\t\treturn {\n\t\t\t\tid: \"typescript\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Type Safety\",\n\t\t\t\tscore,\n\t\t\t\tstatus: count === 0 ? \"pass\" : count > maxErrors ? \"fail\" : \"warning\",\n\t\t\t\tissues,\n\t\t\t\ttoolsUsed: [\"tsc\"],\n\t\t\t\tduration: elapsed(),\n\t\t\t\tmetadata: { errors: count }\n\t\t\t};\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tid: \"typescript\",\n\t\t\t\tcategory: this.category,\n\t\t\t\tname: \"Type Safety\",\n\t\t\t\tscore: 0,\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tissues: [{\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\tmessage: `tsc failed: ${err}`,\n\t\t\t\t\treportedBy: [\"tsc\"]\n\t\t\t\t}],\n\t\t\t\ttoolsUsed: [\"tsc\"],\n\t\t\t\tduration: elapsed()\n\t\t\t};\n\t\t}\n\t}\n};\n//#endregion\n//#region src/quotes/startrek.json\nvar startrek_default = {\n\tcritical: [\n\t\t{\n\t\t\t\"text\": \"He's dead, Jim.\",\n\t\t\t\"source\": \"Dr. McCoy\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"I'm a doctor, not a miracle worker!\",\n\t\t\t\"source\": \"Dr. McCoy\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"It's worse than that. He's really dead, Jim.\",\n\t\t\t\"source\": \"Dr. McCoy\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"Please state the nature of the medical emergency.\",\n\t\t\t\"source\": \"The Doctor\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"I swear, this project is held together with spit and baling wire.\",\n\t\t\t\"source\": \"Dr. McCoy\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"If we don't operate immediately, the patient will die.\",\n\t\t\t\"source\": \"Dr. Crusher\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"I'm going to have to ask you to get the hell out of my sickbay.\",\n\t\t\t\"source\": \"T'Ana\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"What you're describing is medically impossible, yet here we are.\",\n\t\t\t\"source\": \"Dr. Bashir\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"The patient is coding! Clear the area!\",\n\t\t\t\"source\": \"Dr. Crusher\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"This isn't a patient, it's a catastrophe with a pulse.\",\n\t\t\t\"source\": \"T'Ana\"\n\t\t}\n\t],\n\twarning: [\n\t\t{\n\t\t\t\"text\": \"I'm a doctor, not an engineer!\",\n\t\t\t\"source\": \"Dr. McCoy\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"You're not seriously going to deploy this, are you?\",\n\t\t\t\"source\": \"The Doctor\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"I don't have a magic wand. I need time and proper resources.\",\n\t\t\t\"source\": \"Dr. Crusher\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"I would advise caution, Captain. The readings are... concerning.\",\n\t\t\t\"source\": \"Dr. Bashir\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"In my medical opinion, this needs bed rest. A lot of it.\",\n\t\t\t\"source\": \"Dr. McCoy\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"The patient will survive, but I wouldn't call this thriving.\",\n\t\t\t\"source\": \"The Doctor\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"Optimism is wonderful, but have you looked at these charts?\",\n\t\t\t\"source\": \"Dr. Phlox\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"I've seen healthier-looking specimens in the morgue.\",\n\t\t\t\"source\": \"T'Ana\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"The prognosis is guarded. I'd recommend close monitoring.\",\n\t\t\t\"source\": \"Dr. Crusher\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"I must say, I've treated Klingon targs in better shape than this.\",\n\t\t\t\"source\": \"Dr. Bashir\"\n\t\t}\n\t],\n\tinfo: [\n\t\t{\n\t\t\t\"text\": \"I'm a doctor, not a DevOps engineer.\",\n\t\t\t\"source\": \"Dr. McCoy\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"The prognosis is... acceptable.\",\n\t\t\t\"source\": \"The Doctor\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"A little suffering is good for the soul.\",\n\t\t\t\"source\": \"Dr. McCoy\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"I've noticed some minor irregularities, but nothing life-threatening.\",\n\t\t\t\"source\": \"Dr. Crusher\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"Fascinating. From a medical perspective, of course.\",\n\t\t\t\"source\": \"Dr. Bashir\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"I find the resilience of this organism quite remarkable!\",\n\t\t\t\"source\": \"Dr. Phlox\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"My diagnosis: mildly irritating, but you'll live.\",\n\t\t\t\"source\": \"T'Ana\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"I've noted some areas for improvement in my medical log.\",\n\t\t\t\"source\": \"The Doctor\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"You're in fair health, but don't let that go to your head.\",\n\t\t\t\"source\": \"Dr. McCoy\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"The patient is stable, though I'd like to run a few more scans.\",\n\t\t\t\"source\": \"Dr. Phlox\"\n\t\t}\n\t],\n\tallClear: [\n\t\t{\n\t\t\t\"text\": \"Vital signs are stable. For now.\",\n\t\t\t\"source\": \"Dr. McCoy\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"Optimism, Captain! It's what keeps me going.\",\n\t\t\t\"source\": \"Dr. Phlox\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"I must say, I'm impressed. Don't let it happen again.\",\n\t\t\t\"source\": \"The Doctor\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"Well, would you look at that. A clean bill of health.\",\n\t\t\t\"source\": \"Dr. Crusher\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"I'm not sure what you did, but keep doing it.\",\n\t\t\t\"source\": \"T'Ana\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"For once, I have nothing to complain about. Medically speaking.\",\n\t\t\t\"source\": \"Dr. McCoy\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"The patient is in remarkable condition. Textbook, even.\",\n\t\t\t\"source\": \"Dr. Bashir\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"This calls for a celebration! Perhaps a nice Denobulan sausage.\",\n\t\t\t\"source\": \"Dr. Phlox\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"All systems nominal. I almost don't know what to do with myself.\",\n\t\t\t\"source\": \"The Doctor\"\n\t\t},\n\t\t{\n\t\t\t\"text\": \"Full marks. Now get out of my sickbay before something breaks.\",\n\t\t\t\"source\": \"T'Ana\"\n\t\t}\n\t]\n};\n//#endregion\n//#region src/quotes/index.ts\n/**\n* Retrieves a quote based on the overall score. The quote's severity is determined by the score, and a random quote from the corresponding severity tier is returned.\n* @param overallScore\n* @returns\n*/\nfunction getQuote(overallScore) {\n\tconst severity = scoreToTier(overallScore);\n\tconst pool = startrek_default[severity];\n\tconst entry = pool[Math.floor(Math.random() * pool.length)];\n\treturn {\n\t\ttext: entry.text,\n\t\tsource: entry.source,\n\t\tseverity\n\t};\n}\nfunction scoreToTier(score) {\n\tif (score < 60) return \"critical\";\n\tif (score < 80) return \"warning\";\n\tif (score < 90) return \"info\";\n\treturn \"allClear\";\n}\n//#endregion\n//#region src/scoring.ts\n/**\n* This module provides functions to calculate the overall health score of a project based on various checks,\n* build a summary of issues found, and determine the appropriate color and emoji representations for the score.\n* The scoring system is designed to give more weight to critical categories like security and dependencies,\n* while still considering code quality, performance, and git-related issues.\n* The getScoreColor and getScoreEmoji functions help in visually representing the health status of the project based on the calculated score.\n*/\nconst CATEGORY_WEIGHTS = {\n\tdependencies: .25,\n\tsecurity: .3,\n\t\"code-quality\": .25,\n\tperformance: .15,\n\tgit: .05\n};\n/**\n* Merge user weight overrides with defaults and normalize to sum to 1.0.\n* User values are absolute weights in the same scale as defaults.\n*/\nfunction normalizeWeights(userWeights, defaults) {\n\tconst merged = { ...defaults };\n\tfor (const [cat, val] of Object.entries(userWeights)) if (val !== void 0) merged[cat] = val;\n\tconst total = Object.values(merged).reduce((sum, v) => sum + v, 0);\n\tif (total === 0) return merged;\n\tfor (const cat of Object.keys(merged)) merged[cat] /= total;\n\treturn merged;\n}\nfunction calculateOverallScore(checks, weights) {\n\tconst active = checks.filter((c) => c.status !== \"skipped\");\n\tif (active.length === 0) return 0;\n\tconst w = weights ?? CATEGORY_WEIGHTS;\n\tlet totalWeight = 0;\n\tlet weightedScore = 0;\n\tfor (const check of active) {\n\t\tconst weight = w[check.category] ?? .1;\n\t\tweightedScore += check.score * weight;\n\t\ttotalWeight += weight;\n\t}\n\treturn totalWeight > 0 ? Math.round(weightedScore / totalWeight) : 0;\n}\nfunction buildSummary(checks) {\n\tconst summary = {\n\t\tcritical: 0,\n\t\twarnings: 0,\n\t\tinfo: 0\n\t};\n\tfor (const check of checks) for (const issue of check.issues) if (issue.severity === \"critical\") summary.critical++;\n\telse if (issue.severity === \"warning\") summary.warnings++;\n\telse summary.info++;\n\treturn summary;\n}\nfunction getScoreColor(score) {\n\tif (score >= 80) return \"green\";\n\tif (score >= 60) return \"yellow\";\n\treturn \"red\";\n}\nfunction getScoreEmoji(score) {\n\tif (score >= 90) return \"Good\";\n\tif (score >= 80) return \"Fair\";\n\tif (score >= 60) return \"Poor\";\n\treturn \"Bad\";\n}\n//#endregion\n//#region src/utils/detect-monorepo.ts\n/**\n* Parse a minimal subset of YAML: an array under a given key.\n* Handles only the simple `packages:` block used in pnpm-workspace.yaml and lerna.json.\n*/\nfunction parseYamlPackagesArray(content) {\n\tconst results = [];\n\tconst lines = content.split(\"\\n\");\n\tlet inPackages = false;\n\tfor (const line of lines) {\n\t\tif (/^packages\\s*:/.test(line)) {\n\t\t\tinPackages = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (inPackages) {\n\t\t\tconst match = /^\\s+-\\s+['\"]?([^'\"#\\n]+?)['\"]?\\s*$/.exec(line);\n\t\t\tif (match) results.push(match[1].trim());\n\t\t\telse if (/^\\S/.test(line)) break;\n\t\t}\n\t}\n\treturn results;\n}\n/**\n* Expand glob patterns relative to rootPath, filter to directories that\n* contain a package.json, and return absolute paths excluding the root itself.\n*/\nasync function discoverPackages(rootPath, patterns) {\n\tif (patterns.length === 0) return [];\n\treturn (await globby(patterns, {\n\t\tcwd: rootPath,\n\t\tonlyDirectories: true,\n\t\texpandDirectories: false,\n\t\tabsolute: true,\n\t\tignore: [\"**/node_modules/**\"]\n\t})).filter((dir) => {\n\t\treturn dir !== resolve(rootPath) && existsSync(join(dir, \"package.json\"));\n\t});\n}\n/**\n* Determine monorepo type and package glob patterns from the root.\n* Returns null if no monorepo signals are found.\n*/\nfunction detectSignals(rootPath) {\n\tconst pnpmWs = join(rootPath, \"pnpm-workspace.yaml\");\n\tif (existsSync(pnpmWs)) try {\n\t\tconst patterns = parseYamlPackagesArray(readFileSync(pnpmWs, \"utf-8\"));\n\t\treturn {\n\t\t\ttype: \"pnpm\",\n\t\t\tpatterns: patterns.length > 0 ? patterns : [\"packages/*\", \"apps/*\"]\n\t\t};\n\t} catch {\n\t\treturn {\n\t\t\ttype: \"pnpm\",\n\t\t\tpatterns: [\"packages/*\", \"apps/*\"]\n\t\t};\n\t}\n\tconst lernaJson = join(rootPath, \"lerna.json\");\n\tif (existsSync(lernaJson)) try {\n\t\tconst lerna = JSON.parse(readFileSync(lernaJson, \"utf-8\"));\n\t\treturn {\n\t\t\ttype: \"lerna\",\n\t\t\tpatterns: Array.isArray(lerna.packages) ? lerna.packages : [\"packages/*\"]\n\t\t};\n\t} catch {\n\t\treturn {\n\t\t\ttype: \"lerna\",\n\t\t\tpatterns: [\"packages/*\"]\n\t\t};\n\t}\n\tconst pkgJson = join(rootPath, \"package.json\");\n\tif (existsSync(pkgJson)) try {\n\t\tconst pkg = JSON.parse(readFileSync(pkgJson, \"utf-8\"));\n\t\tconst workspaces = Array.isArray(pkg.workspaces) ? pkg.workspaces : Array.isArray(pkg.workspaces?.packages) ? pkg.workspaces.packages : void 0;\n\t\tif (workspaces && workspaces.length > 0) {\n\t\t\tif (existsSync(join(rootPath, \"turbo.json\"))) return {\n\t\t\t\ttype: \"turbo\",\n\t\t\t\tpatterns: workspaces\n\t\t\t};\n\t\t\tif (existsSync(join(rootPath, \"nx.json\"))) return {\n\t\t\t\ttype: \"nx\",\n\t\t\t\tpatterns: workspaces\n\t\t\t};\n\t\t\treturn {\n\t\t\t\ttype: existsSync(join(rootPath, \"yarn.lock\")) ? \"yarn\" : \"npm\",\n\t\t\t\tpatterns: workspaces\n\t\t\t};\n\t\t}\n\t} catch {}\n\tif (existsSync(join(rootPath, \"turbo.json\"))) return {\n\t\ttype: \"turbo\",\n\t\tpatterns: [\"packages/*\", \"apps/*\"]\n\t};\n\tif (existsSync(join(rootPath, \"nx.json\"))) return {\n\t\ttype: \"nx\",\n\t\tpatterns: [\n\t\t\t\"packages/*\",\n\t\t\t\"apps/*\",\n\t\t\t\"libs/*\"\n\t\t]\n\t};\n\treturn null;\n}\nasync function detectMonorepo(rootPath) {\n\tconst signals = detectSignals(rootPath);\n\tif (!signals) return { isMonorepo: false };\n\tconst packagePaths = await discoverPackages(rootPath, signals.patterns);\n\tif (packagePaths.length === 0) return { isMonorepo: false };\n\tconst packageManager = detectPackageManager(rootPath);\n\treturn {\n\t\tisMonorepo: true,\n\t\ttype: signals.type,\n\t\tpackageManager,\n\t\tpackagePaths\n\t};\n}\n//#endregion\n//#region src/utils/suppress.ts\nconst SEVERITY_WEIGHT = {\n\tcritical: 10,\n\twarning: 3,\n\tinfo: 1\n};\nfunction issueWeight(issues) {\n\treturn issues.reduce((sum, i) => sum + SEVERITY_WEIGHT[i.severity], 0);\n}\n/**\n* Recalculate a check's score after suppression removes issues.\n* Uses proportional scaling: the penalty (100 − score) is reduced\n* by the same fraction of severity-weight that was suppressed.\n*/\nfunction recalcScoreAfterSuppression(result, originalIssues) {\n\tif (result.issues.length === 0) {\n\t\tresult.score = 100;\n\t\tresult.status = \"pass\";\n\t\treturn;\n\t}\n\tif (result.issues.length === originalIssues.length) return;\n\tconst origWeight = issueWeight(originalIssues);\n\tif (origWeight === 0) return;\n\tconst remainWeight = issueWeight(result.issues);\n\tconst penalty = 100 - result.score;\n\tresult.score = Math.round(100 - penalty * (remainWeight / origWeight));\n\tif (result.issues.some((i) => i.severity === \"critical\")) result.status = \"fail\";\n\telse if (result.issues.length > 0) result.status = \"warning\";\n\telse result.status = \"pass\";\n}\n/**\n* Filter issues against suppression rules.\n* - path: picomatch glob matched against Issue.file\n* - match: case-insensitive substring matched against Issue.message\n* - When both provided: AND logic (both must match)\n* - When only one provided: it alone determines the match\n*/\nfunction applySuppression(issues, rules) {\n\tif (rules.length === 0) return {\n\t\tissues,\n\t\tsuppressedCount: 0\n\t};\n\tconst compiled = rules.map((rule) => ({\n\t\tpathMatch: rule.path ? picomatch(rule.path) : null,\n\t\tmatch: rule.match?.toLowerCase() ?? null\n\t}));\n\tlet suppressedCount = 0;\n\treturn {\n\t\tissues: issues.filter((issue) => {\n\t\t\tconst normalizedFile = issue.file?.replace(/\\\\/g, \"/\");\n\t\t\tconst suppressed = compiled.some((rule) => {\n\t\t\t\tconst pathOk = rule.pathMatch ? normalizedFile ? rule.pathMatch(normalizedFile) : false : true;\n\t\t\t\tconst matchOk = rule.match ? issue.message.toLowerCase().includes(rule.match) : true;\n\t\t\t\treturn pathOk && matchOk;\n\t\t\t});\n\t\t\tif (suppressed) suppressedCount++;\n\t\t\treturn !suppressed;\n\t\t}),\n\t\tsuppressedCount\n\t};\n}\n//#endregion\n//#region src/runner.ts\nconst ALL_RUNNERS = [\n\tnew KnipRunner(),\n\tnew DepcheckRunner(),\n\tnew OutdatedRunner(),\n\tnew NpmAuditRunner(),\n\tnew MadgeRunner(),\n\tnew SourceMapExplorerRunner(),\n\tnew CoverageRunner(),\n\tnew LicenseCheckerRunner(),\n\tnew JscpdRunner(),\n\tnew GitRunner(),\n\tnew ESLintRunner(),\n\tnew TypeScriptRunner(),\n\tnew TodoScannerRunner(),\n\tnew ComplexityRunner(),\n\tnew SecretsRunner(),\n\tnew HeavyDepsRunner(),\n\tnew ReactPerfRunner(),\n\tnew AssetSizeRunner(),\n\tnew NodeSecurityRunner(),\n\tnew NodeInputValidationRunner(),\n\tnew NodeAsyncErrorsRunner(),\n\tnew AngularBuildConfigRunner(),\n\tnew AngularChangeDetectionRunner(),\n\tnew AngularLazyRoutesRunner(),\n\tnew AngularSecurityRunner(),\n\tnew AngularStrictRunner(),\n\tnew AngularSubscriptionsRunner(),\n\tnew AngularTemplatePerformanceRunner(),\n\tnew NextClientComponentsRunner(),\n\tnew NextFontsRunner(),\n\tnew NextImagesRunner(),\n\tnew NextLinkRunner(),\n\tnew NextMissingBoundariesRunner(),\n\tnew NextSecurityHeadersRunner()\n];\nconst ALL_ADVISORS = [\n\tnew ReactBestPracticesAdvisor(),\n\tnew AngularBestPracticesAdvisor(),\n\tnew NextBestPracticesAdvisor(),\n\tnew UniversalBestPracticesAdvisor()\n];\n/**\n* Read the `name` field from a package.json without running the full\n* detectProject pipeline. Used by runSickbayMonorepo to fire onPackageStart\n* before the (relatively slow) per-package scan begins. Falls back to the\n* directory basename if package.json is missing or unreadable.\n*/\nfunction readPackageName(pkgPath) {\n\tconst pkgJsonPath = join(pkgPath, \"package.json\");\n\tif (existsSync(pkgJsonPath)) try {\n\t\tconst pkg = JSON.parse(readFileSync(pkgJsonPath, \"utf-8\"));\n\t\tif (pkg.name) return pkg.name;\n\t} catch {}\n\treturn basename(pkgPath);\n}\nfunction getAvailableChecks(context) {\n\treturn (context ? ALL_RUNNERS.filter((r) => r.isApplicableToContext(context)) : ALL_RUNNERS).map((r) => ({\n\t\tname: r.name,\n\t\tcategory: r.category\n\t}));\n}\nasync function runSickbay(options = {}) {\n\tconst projectPath = options.projectPath ?? process.cwd();\n\tconst projectInfo = await detectProject(projectPath);\n\tconst context = await detectContext(projectPath);\n\tconst config = options._config !== void 0 ? options._config : await loadConfig(projectPath);\n\tconst configMeta = resolveConfigMeta(config);\n\tconst runners = (options.checks ? ALL_RUNNERS.filter((r) => options.checks.includes(r.name)) : ALL_RUNNERS).filter((r) => r.isApplicableToContext(context)).filter((r) => !isCheckDisabled(config, r.name));\n\toptions.onRunnersReady?.(runners.map((r) => r.name));\n\tif (options._config === void 0 && config?.checks) {\n\t\tconst unlisted = getUnlistedChecks(config, runners.map((r) => r.name));\n\t\tif (unlisted.length > 0) process.stderr.write(`Note: ${unlisted.length} check(s) running but not listed in your config: ${unlisted.join(\", \")}. Run \\`sickbay init --sync\\` to add them.\\n`);\n\t}\n\tconst checks = [];\n\tconst results = await Promise.allSettled(runners.map(async (runner) => {\n\t\tif (!await runner.isApplicable(projectPath, context)) return null;\n\t\toptions.onCheckStart?.(runner.name);\n\t\tconst checkCfg = getCheckConfig(config, runner.name);\n\t\tconst globalExclude = config?.exclude ?? [];\n\t\tconst checkExclude = checkCfg?.exclude ?? [];\n\t\tconst mergedExclude = [...globalExclude, ...checkExclude];\n\t\tconst result = await runner.run(projectPath, {\n\t\t\tverbose: options.verbose,\n\t\t\tcheckConfig: checkCfg || mergedExclude.length > 0 ? {\n\t\t\t\tthresholds: checkCfg?.thresholds,\n\t\t\t\texclude: mergedExclude.length > 0 ? mergedExclude : void 0,\n\t\t\t\tsuppress: checkCfg?.suppress\n\t\t\t} : void 0\n\t\t});\n\t\tif (checkCfg?.suppress?.length) {\n\t\t\tconst originalIssues = result.issues;\n\t\t\tconst { issues, suppressedCount } = applySuppression(result.issues, checkCfg.suppress);\n\t\t\tresult.issues = issues;\n\t\t\tif (suppressedCount > 0) {\n\t\t\t\trecalcScoreAfterSuppression(result, originalIssues);\n\t\t\t\tresult.metadata = {\n\t\t\t\t\t...result.metadata,\n\t\t\t\t\tsuppressedCount\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\toptions.onCheckComplete?.(result);\n\t\treturn result;\n\t}));\n\tfor (const result of results) if (result.status === \"fulfilled\" && result.value) checks.push(result.value);\n\tconst applicableAdvisors = ALL_ADVISORS.filter((a) => a.isApplicableToContext(context));\n\tconst advisorResults = await Promise.allSettled(applicableAdvisors.map(async (advisor) => {\n\t\ttry {\n\t\t\treturn await advisor.run(projectPath, context);\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}));\n\tconst recommendations = [];\n\tfor (const result of advisorResults) if (result.status === \"fulfilled\") recommendations.push(...result.value);\n\tconst overallScore = calculateOverallScore(checks, config?.weights ? normalizeWeights(config.weights, CATEGORY_WEIGHTS) : void 0);\n\tconst summary = buildSummary(checks);\n\treturn {\n\t\ttimestamp: (/* @__PURE__ */ new Date()).toISOString(),\n\t\tprojectPath,\n\t\tprojectInfo,\n\t\tchecks,\n\t\toverallScore,\n\t\tsummary,\n\t\tconfig: configMeta.hasCustomConfig ? configMeta : void 0,\n\t\trecommendations: recommendations.length > 0 ? recommendations : void 0,\n\t\tquote: options.quotes !== false ? getQuote(overallScore) : void 0\n\t};\n}\nasync function runSickbayMonorepo(options = {}) {\n\tconst rootPath = options.projectPath ?? process.cwd();\n\tconst monorepoInfo = await detectMonorepo(rootPath);\n\tif (!monorepoInfo.isMonorepo) throw new Error(`Not a monorepo root: ${rootPath}`);\n\tconst rootConfig = await loadConfig(rootPath);\n\tconst configMeta = resolveConfigMeta(rootConfig);\n\tconst packageReports = (await Promise.allSettled(monorepoInfo.packagePaths.map(async (pkgPath) => {\n\t\tconst mergedConfig = mergeConfigs(rootConfig, await loadConfig(pkgPath));\n\t\toptions.onPackageStart?.(readPackageName(pkgPath));\n\t\tconst report = await runSickbay({\n\t\t\t...options,\n\t\t\tprojectPath: pkgPath,\n\t\t\t_config: mergedConfig\n\t\t});\n\t\tconst context = await detectContext(pkgPath);\n\t\tconst packageReport = {\n\t\t\tname: report.projectInfo.name,\n\t\t\tpath: pkgPath,\n\t\t\trelativePath: relativeFromRoot(rootPath, pkgPath),\n\t\t\tframework: report.projectInfo.framework,\n\t\t\truntime: context.runtime,\n\t\t\tchecks: report.checks,\n\t\t\tscore: report.overallScore,\n\t\t\tsummary: report.summary,\n\t\t\tdependencies: report.projectInfo.dependencies,\n\t\t\tdevDependencies: report.projectInfo.devDependencies,\n\t\t\trecommendations: report.recommendations\n\t\t};\n\t\toptions.onPackageComplete?.(packageReport);\n\t\treturn packageReport;\n\t}))).filter((r) => r.status === \"fulfilled\").map((r) => r.value);\n\tconst overallScore = packageReports.length > 0 ? Math.round(packageReports.reduce((sum, p) => sum + p.score, 0) / packageReports.length) : 0;\n\tconst summary = packageReports.reduce((acc, p) => ({\n\t\tcritical: acc.critical + p.summary.critical,\n\t\twarnings: acc.warnings + p.summary.warnings,\n\t\tinfo: acc.info + p.summary.info\n\t}), {\n\t\tcritical: 0,\n\t\twarnings: 0,\n\t\tinfo: 0\n\t});\n\treturn {\n\t\tisMonorepo: true,\n\t\ttimestamp: (/* @__PURE__ */ new Date()).toISOString(),\n\t\trootPath,\n\t\tmonorepoType: monorepoInfo.type,\n\t\tpackageManager: monorepoInfo.packageManager,\n\t\tpackages: packageReports,\n\t\toverallScore,\n\t\tsummary,\n\t\tconfig: configMeta.hasCustomConfig ? configMeta : void 0,\n\t\tquote: options.quotes !== false ? getQuote(overallScore) : void 0\n\t};\n}\n//#endregion\n//#region src/utils/dep-tree.ts\nfunction normalizeDeps(raw) {\n\tif (!raw) return {};\n\tconst result = {};\n\tfor (const [name, info] of Object.entries(raw)) result[name] = {\n\t\tname,\n\t\tversion: info.version ?? \"unknown\",\n\t\t...info.dependencies && Object.keys(info.dependencies).length > 0 ? { dependencies: normalizeDeps(info.dependencies) } : {}\n\t};\n\treturn result;\n}\nasync function getDependencyTree(projectPath, packageManager) {\n\tconst empty = {\n\t\tname: \"\",\n\t\tversion: \"\",\n\t\tpackageManager,\n\t\tdependencies: {}\n\t};\n\tif (packageManager === \"bun\") return empty;\n\ttry {\n\t\tconst { stdout } = await execa(packageManager, packageManager === \"yarn\" ? [\n\t\t\t\"list\",\n\t\t\t\"--json\",\n\t\t\t\"--depth\",\n\t\t\t\"1\"\n\t\t] : [\n\t\t\t\"ls\",\n\t\t\t\"--json\",\n\t\t\t\"--depth\",\n\t\t\t\"1\"\n\t\t], {\n\t\t\tcwd: projectPath,\n\t\t\treject: false,\n\t\t\ttimeout: 3e4\n\t\t});\n\t\tconst parsed = JSON.parse(stdout);\n\t\tconst root = Array.isArray(parsed) ? parsed[0] : parsed;\n\t\treturn {\n\t\t\tname: root.name ?? \"\",\n\t\t\tversion: root.version ?? \"\",\n\t\t\tpackageManager,\n\t\t\tdependencies: normalizeDeps(root.dependencies)\n\t\t};\n\t} catch {\n\t\treturn empty;\n\t}\n}\n//#endregion\nexport { BaseAdvisor, CATEGORY_WEIGHTS, CRITICAL_LINES, SCORE_EXCELLENT, SCORE_FAIR, SCORE_GOOD, WARN_LINES, applySuppression, buildSummary, calculateOverallScore, createExcludeFilter, defineConfig, detectContext, detectMonorepo, detectPackageManager, detectProject, getAvailableChecks, getCheckConfig, getDependencyTree, getScoreColor, getScoreEmoji, getUnlistedChecks, isCheckDisabled, loadConfig, mergeConfigs, normalizeWeights, resolveConfigMeta, runSickbay, runSickbayMonorepo, validateConfig };\n\n//# sourceMappingURL=index.js.map"],"mappings":"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"}