{"version":3,"sources":["../src/types/common.ts","../src/core/context.ts","../src/utils/validation.ts","../src/core/pipeline.ts","../src/utils/parallel.ts","../src/core/engine.ts","../src/utils/http.ts","../src/providers/npm/npm-provider.ts","../src/providers/github/github-provider.ts","../src/utils/hash.ts","../src/providers/cache/file-cache.ts","../src/providers/cache/cache-manager.ts","../src/analyzers/health/metrics.ts","../src/utils/semver.ts","../src/analyzers/health/health-analyzer.ts","../src/providers/npm/types.ts","../src/analyzers/supply-chain/maintainer-tracker.ts","../src/analyzers/supply-chain/provenance-checker.ts","../src/analyzers/supply-chain/release-analyzer.ts","../src/analyzers/supply-chain/supply-chain-analyzer.ts","../src/analyzers/install-scripts/detectors/env-access.ts","../src/analyzers/install-scripts/detectors/filesystem.ts","../src/analyzers/install-scripts/detectors/network.ts","../src/analyzers/install-scripts/detectors/credential.ts","../src/analyzers/install-scripts/detectors/exec.ts","../src/analyzers/install-scripts/detectors/obfuscation.ts","../src/analyzers/install-scripts/detectors/index.ts","../src/analyzers/install-scripts/ast-engine.ts","../src/analyzers/install-scripts/script-analyzer.ts","../src/analyzers/typosquatting/levenshtein.ts","../src/analyzers/typosquatting/popular-packages.ts","../src/analyzers/typosquatting/brand-detector.ts","../src/analyzers/typosquatting/typosquat-analyzer.ts","../src/analyzers/exfiltration/pattern-matcher.ts","../src/analyzers/exfiltration/exfiltration-analyzer.ts","../src/scoring/categories.ts","../src/scoring/weights.ts","../src/scoring/trust-scorer.ts","../src/rules/rule-engine.ts","../src/rules/built-in/health-rules.ts","../src/rules/built-in/supply-chain-rules.ts","../src/rules/built-in/script-rules.ts","../src/rules/built-in/typosquat-rules.ts","../src/rules/rule-registry.ts","../src/cli/ui/badges.ts","../src/cli/ui/table.ts","../src/reporters/terminal-reporter.ts","../src/reporters/json-reporter.ts","../src/reporters/html-reporter.ts","../src/reporters/markdown-reporter.ts","../src/reporters/ci-reporter.ts","../src/plugins/plugin-loader.ts","../src/plugins/plugin-registry.ts","../src/config/defaults.ts","../src/config/loader.ts"],"names":["Severity","AnalysisCategory","AnalysisStatus","ExitCode","ReportFormat","TrustLevel","createHash","mkdir","join","readFile","unlink","writeFile","readdir","stat","parse","traverse","chalk","Table","homedir"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Common types, enums, and constants shared across pkg-sentinel.\n */\n\n/** Severity levels for findings — ordered from lowest to highest risk. */\nexport enum Severity {\n  Info = 'info',\n  Low = 'low',\n  Medium = 'medium',\n  High = 'high',\n  Critical = 'critical',\n}\n\n/** Numeric severity for ordering and comparison. */\nexport const SEVERITY_ORDER: Record<Severity, number> = {\n  [Severity.Info]: 0,\n  [Severity.Low]: 1,\n  [Severity.Medium]: 2,\n  [Severity.High]: 3,\n  [Severity.Critical]: 4,\n};\n\n/** Compare two severities. Returns positive if a > b. */\nexport function compareSeverity(a: Severity, b: Severity): number {\n  return SEVERITY_ORDER[a] - SEVERITY_ORDER[b];\n}\n\n/** Category of analysis being performed. */\nexport enum AnalysisCategory {\n  Health = 'health',\n  SupplyChain = 'supply-chain',\n  InstallScripts = 'install-scripts',\n  Typosquatting = 'typosquatting',\n  Exfiltration = 'exfiltration',\n  Trust = 'trust',\n}\n\n/** Status of an individual analysis run. */\nexport enum AnalysisStatus {\n  Pending = 'pending',\n  Running = 'running',\n  Completed = 'completed',\n  Failed = 'failed',\n  Skipped = 'skipped',\n}\n\n/** CI-friendly exit codes. */\nexport enum ExitCode {\n  Success = 0,\n  Warnings = 1,\n  HighRisk = 2,\n  CriticalRisk = 3,\n  ConfigError = 10,\n  NetworkError = 11,\n}\n\n/** Supported report output formats. */\nexport enum ReportFormat {\n  Terminal = 'terminal',\n  Json = 'json',\n  Html = 'html',\n  Markdown = 'markdown',\n}\n\n/** Trust level classification derived from trust score. */\nexport enum TrustLevel {\n  Trusted = 'trusted',\n  Moderate = 'moderate',\n  Low = 'low',\n  Untrusted = 'untrusted',\n  Unknown = 'unknown',\n}\n\n/** Map numeric trust score ranges to trust levels. */\nexport function trustLevelFromScore(score: number): TrustLevel {\n  if (score >= 80) return TrustLevel.Trusted;\n  if (score >= 60) return TrustLevel.Moderate;\n  if (score >= 40) return TrustLevel.Low;\n  if (score >= 0) return TrustLevel.Untrusted;\n  return TrustLevel.Unknown;\n}\n\n/** Install script lifecycle hooks we inspect. */\nexport const INSTALL_SCRIPT_HOOKS = [\n  'preinstall',\n  'install',\n  'postinstall',\n  'prepare',\n] as const;\n\nexport type InstallScriptHook = (typeof INSTALL_SCRIPT_HOOKS)[number];\n\n/** Package identifier with optional version. */\nexport interface PackageSpec {\n  name: string;\n  version?: string;\n  scope?: string;\n}\n\n/** Parse a package specifier like \"@scope/name@1.2.3\" */\nexport function parsePackageSpec(input: string): PackageSpec {\n  const trimmed = input.trim();\n  let name: string;\n  let version: string | undefined;\n  let scope: string | undefined;\n\n  if (trimmed.startsWith('@')) {\n    // Scoped package: @scope/name@version\n    const withoutAt = trimmed.slice(1);\n    const slashIdx = withoutAt.indexOf('/');\n    if (slashIdx === -1) {\n      throw new Error(`Invalid scoped package specifier: \"${input}\"`);\n    }\n    scope = '@' + withoutAt.slice(0, slashIdx);\n    const rest = withoutAt.slice(slashIdx + 1);\n    const atIdx = rest.lastIndexOf('@');\n    if (atIdx > 0) {\n      name = scope + '/' + rest.slice(0, atIdx);\n      version = rest.slice(atIdx + 1);\n    } else {\n      name = scope + '/' + rest;\n    }\n  } else {\n    const atIdx = trimmed.lastIndexOf('@');\n    if (atIdx > 0) {\n      name = trimmed.slice(0, atIdx);\n      version = trimmed.slice(atIdx + 1);\n    } else {\n      name = trimmed;\n    }\n  }\n\n  return { name, version, scope };\n}\n","/**\n * Analysis context — shared mutable context passed through the pipeline.\n * Holds all fetched data and intermediate results.\n */\n\nimport type { NpmPackageMetadata, NpmDownloads } from '../providers/npm/types.js';\nimport type { GitHubRepoData, GitHubContributor } from '../providers/github/types.js';\nimport type { ScriptAnalysisResult } from '../types/analysis.js';\n\n/**\n * The analysis context carries all data needed by analyzers.\n * It is populated by the pipeline stages and consumed by analyzers.\n */\nexport class AnalysisContext {\n  /** Package name being analyzed. */\n  readonly packageName: string;\n\n  /** Package version being analyzed. */\n  packageVersion: string;\n\n  /** npm registry metadata. */\n  npmMetadata?: NpmPackageMetadata;\n\n  /** npm download stats. */\n  npmDownloads?: NpmDownloads;\n\n  /** GitHub repository data. */\n  githubData?: GitHubRepoData;\n\n  /** GitHub contributors. */\n  githubContributors?: GitHubContributor[];\n\n  /** Recent GitHub commits. */\n  githubCommits?: Array<{ sha: string; date: string; author: string }>;\n\n  /** GitHub issue statistics. */\n  githubIssueStats?: {\n    openCount: number;\n    closedCount: number;\n    avgResponseTimeHours: number;\n  };\n\n  /** Install script analysis results (for exfiltration analyzer). */\n  scriptAnalysisResults?: ScriptAnalysisResult[];\n\n  /** GitHub repository URL (extracted from npm metadata). */\n  repositoryUrl?: string;\n\n  /** Timestamp when analysis started. */\n  readonly startedAt: Date;\n\n  /** Arbitrary metadata store for inter-analyzer communication. */\n  private readonly store = new Map<string, unknown>();\n\n  constructor(packageName: string, version = 'latest') {\n    this.packageName = packageName;\n    this.packageVersion = version;\n    this.startedAt = new Date();\n  }\n\n  /** Store a value for later retrieval by key. */\n  set<T>(key: string, value: T): void {\n    this.store.set(key, value);\n  }\n\n  /** Retrieve a stored value by key. */\n  get<T>(key: string): T | undefined {\n    return this.store.get(key) as T | undefined;\n  }\n\n  /** Check if a key exists in the store. */\n  has(key: string): boolean {\n    return this.store.has(key);\n  }\n\n  /** Get the elapsed time since analysis started. */\n  get elapsedMs(): number {\n    return Date.now() - this.startedAt.getTime();\n  }\n}\n","/**\n * Input validation utilities.\n */\n\n/** Validate that a package name follows npm naming rules. */\nexport function isValidPackageName(name: string): boolean {\n  if (!name || name.length === 0 || name.length > 214) return false;\n\n  // Scoped packages\n  if (name.startsWith('@')) {\n    const scopedRegex = /^@[a-z0-9][\\w.-]*\\/[a-z0-9][\\w.-]*$/;\n    return scopedRegex.test(name);\n  }\n\n  // Unscoped packages\n  const unscopedRegex = /^[a-z0-9][\\w.-]*$/;\n  return unscopedRegex.test(name);\n}\n\n/** Validate a semver-like version string. */\nexport function isValidVersion(version: string): boolean {\n  const semverRegex = /^v?\\d+\\.\\d+\\.\\d+(-[\\w.]+)?(\\+[\\w.]+)?$/;\n  return semverRegex.test(version);\n}\n\n/** Validate a URL string. */\nexport function isValidUrl(url: string): boolean {\n  try {\n    new URL(url);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/** Validate a GitHub repository URL and extract owner/repo. */\nexport function parseGitHubUrl(\n  url: string,\n): { owner: string; repo: string } | null {\n  // Handle various GitHub URL formats\n  const patterns = [\n    // https://github.com/owner/repo\n    /github\\.com\\/([^/]+)\\/([^/\\s#?.]+)/,\n    // git+https://github.com/owner/repo.git\n    /github\\.com[:\\/]([^/]+)\\/([^/\\s#?.]+?)(?:\\.git)?$/,\n    // git://github.com/owner/repo.git\n    /github\\.com\\/([^/]+)\\/([^/\\s#?.]+?)(?:\\.git)?$/,\n  ];\n\n  for (const pattern of patterns) {\n    const match = url.match(pattern);\n    if (match && match[1] && match[2]) {\n      return {\n        owner: match[1],\n        repo: match[2].replace(/\\.git$/, ''),\n      };\n    }\n  }\n\n  return null;\n}\n\n/** Sanitize a string for safe terminal output. */\nexport function sanitizeForTerminal(input: string): string {\n  // Remove ANSI escape sequences and control characters\n  return input.replace(\n    // eslint-disable-next-line no-control-regex\n    /[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]|\\x1B\\[[0-9;]*[A-Za-z]/g,\n    '',\n  );\n}\n\n/** Truncate a string to a maximum length. */\nexport function truncate(str: string, maxLength: number, suffix = '…'): string {\n  if (str.length <= maxLength) return str;\n  return str.slice(0, maxLength - suffix.length) + suffix;\n}\n\n/** Format a number with locale-aware separators. */\nexport function formatNumber(num: number): string {\n  return num.toLocaleString('en-US');\n}\n\n/** Format bytes into human-readable size. */\nexport function formatBytes(bytes: number): string {\n  const units = ['B', 'KB', 'MB', 'GB'];\n  let size = bytes;\n  let unitIndex = 0;\n  while (size >= 1024 && unitIndex < units.length - 1) {\n    size /= 1024;\n    unitIndex++;\n  }\n  return `${size.toFixed(unitIndex === 0 ? 0 : 1)} ${units[unitIndex]}`;\n}\n\n/** Format a duration in milliseconds to human-readable string. */\nexport function formatDuration(ms: number): string {\n  if (ms < 1000) return `${ms}ms`;\n  if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n  const minutes = Math.floor(ms / 60_000);\n  const seconds = ((ms % 60_000) / 1000).toFixed(0);\n  return `${minutes}m ${seconds}s`;\n}\n\n/** Calculate relative time (e.g., \"3 days ago\"). */\nexport function relativeTime(date: string | Date): string {\n  const d = typeof date === 'string' ? new Date(date) : date;\n  const now = Date.now();\n  const diffMs = now - d.getTime();\n  const diffSeconds = Math.floor(diffMs / 1000);\n  const diffMinutes = Math.floor(diffSeconds / 60);\n  const diffHours = Math.floor(diffMinutes / 60);\n  const diffDays = Math.floor(diffHours / 24);\n  const diffWeeks = Math.floor(diffDays / 7);\n  const diffMonths = Math.floor(diffDays / 30);\n  const diffYears = Math.floor(diffDays / 365);\n\n  if (diffYears > 0) return `${diffYears} year${diffYears > 1 ? 's' : ''} ago`;\n  if (diffMonths > 0) return `${diffMonths} month${diffMonths > 1 ? 's' : ''} ago`;\n  if (diffWeeks > 0) return `${diffWeeks} week${diffWeeks > 1 ? 's' : ''} ago`;\n  if (diffDays > 0) return `${diffDays} day${diffDays > 1 ? 's' : ''} ago`;\n  if (diffHours > 0) return `${diffHours} hour${diffHours > 1 ? 's' : ''} ago`;\n  if (diffMinutes > 0) return `${diffMinutes} minute${diffMinutes > 1 ? 's' : ''} ago`;\n  return 'just now';\n}\n","/**\n * Analysis pipeline builder.\n * Constructs and executes the analysis pipeline stages.\n */\n\nimport type { AnalysisContext } from './context.js';\nimport type { INpmProvider, IGitHubProvider } from '../providers/interfaces.js';\nimport { parseGitHubUrl } from '../utils/validation.js';\n\n/** A pipeline stage function. */\nexport type PipelineStage = (context: AnalysisContext) => Promise<void>;\n\n/**\n * Build the data-fetching pipeline stages.\n */\nexport function buildFetchPipeline(\n  npmProvider: INpmProvider,\n  githubProvider?: IGitHubProvider,\n): PipelineStage[] {\n  const stages: PipelineStage[] = [];\n\n  // Stage 1: Fetch npm metadata\n  stages.push(async (ctx) => {\n    ctx.npmMetadata = await npmProvider.getPackageMetadata(ctx.packageName);\n\n    // Resolve 'latest' version\n    if (ctx.packageVersion === 'latest' && ctx.npmMetadata['dist-tags']['latest']) {\n      ctx.packageVersion = ctx.npmMetadata['dist-tags']['latest'];\n    }\n\n    // Extract repository URL\n    const repoUrl = ctx.npmMetadata.repository?.url;\n    if (repoUrl) {\n      ctx.repositoryUrl = repoUrl;\n    }\n  });\n\n  // Stage 2: Fetch npm downloads\n  stages.push(async (ctx) => {\n    try {\n      ctx.npmDownloads = await npmProvider.getDownloads(ctx.packageName);\n    } catch {\n      // Non-fatal — downloads are optional\n    }\n  });\n\n  // Stage 3: Fetch GitHub data (if available)\n  if (githubProvider) {\n    stages.push(async (ctx) => {\n      if (!ctx.repositoryUrl) return;\n\n      const parsed = parseGitHubUrl(ctx.repositoryUrl);\n      if (!parsed) return;\n\n      try {\n        // Fetch all GitHub data in parallel\n        const [repoData, contributors, commits, issueStats] = await Promise.all([\n          githubProvider.getRepoData(`${parsed.owner}/${parsed.repo}`),\n          githubProvider.getContributors(parsed.owner, parsed.repo),\n          githubProvider.getRecentCommits(parsed.owner, parsed.repo),\n          githubProvider.getIssueStats(parsed.owner, parsed.repo),\n        ]);\n\n        ctx.githubData = repoData;\n        ctx.githubContributors = contributors;\n        ctx.githubCommits = commits;\n        ctx.githubIssueStats = issueStats;\n      } catch {\n        // Non-fatal — GitHub data is optional\n      }\n    });\n  }\n\n  return stages;\n}\n\n/**\n * Execute pipeline stages sequentially.\n */\nexport async function executePipeline(\n  stages: PipelineStage[],\n  context: AnalysisContext,\n): Promise<void> {\n  for (const stage of stages) {\n    await stage(context);\n  }\n}\n","/**\n * Parallel execution utilities.\n * Supports concurrency-limited parallel processing.\n */\n\n/** Options for parallel execution. */\nexport interface ParallelOptions {\n  /** Maximum concurrent tasks. Default: 5. */\n  concurrency?: number;\n\n  /** Whether to stop on first error. Default: false. */\n  failFast?: boolean;\n}\n\n/** Result of a parallel task execution. */\nexport interface ParallelResult<T> {\n  /** Index of the task in the original array. */\n  index: number;\n\n  /** Result value (if successful). */\n  value?: T;\n\n  /** Error (if failed). */\n  error?: Error;\n\n  /** Whether the task succeeded. */\n  success: boolean;\n\n  /** Duration in milliseconds. */\n  durationMs: number;\n}\n\n/**\n * Execute an array of async tasks with concurrency control.\n *\n * @param tasks - Array of async functions to execute\n * @param options - Parallel execution options\n * @returns Array of results in the same order as the input tasks\n */\nexport async function parallel<T>(\n  tasks: Array<() => Promise<T>>,\n  options: ParallelOptions = {},\n): Promise<ParallelResult<T>[]> {\n  const { concurrency = 5, failFast = false } = options;\n  const results: ParallelResult<T>[] = new Array(tasks.length);\n  let nextIndex = 0;\n  let aborted = false;\n\n  async function runWorker(): Promise<void> {\n    while (nextIndex < tasks.length && !aborted) {\n      const index = nextIndex++;\n      const task = tasks[index];\n      if (!task) continue;\n\n      const start = Date.now();\n      try {\n        const value = await task();\n        results[index] = {\n          index,\n          value,\n          success: true,\n          durationMs: Date.now() - start,\n        };\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error(String(err));\n        results[index] = {\n          index,\n          error,\n          success: false,\n          durationMs: Date.now() - start,\n        };\n\n        if (failFast) {\n          aborted = true;\n          return;\n        }\n      }\n    }\n  }\n\n  // Launch workers up to the concurrency limit\n  const workerCount = Math.min(concurrency, tasks.length);\n  const workers: Promise<void>[] = [];\n  for (let i = 0; i < workerCount; i++) {\n    workers.push(runWorker());\n  }\n\n  await Promise.all(workers);\n  return results;\n}\n\n/**\n * Map over an array with concurrency-limited async operations.\n */\nexport async function parallelMap<T, R>(\n  items: T[],\n  fn: (item: T, index: number) => Promise<R>,\n  options: ParallelOptions = {},\n): Promise<ParallelResult<R>[]> {\n  const tasks = items.map((item, index) => () => fn(item, index));\n  return parallel(tasks, options);\n}\n\n/**\n * Execute async tasks sequentially (concurrency = 1).\n */\nexport async function sequential<T>(\n  tasks: Array<() => Promise<T>>,\n): Promise<ParallelResult<T>[]> {\n  return parallel(tasks, { concurrency: 1 });\n}\n","/**\n * Core analysis engine — orchestrates the full analysis flow.\n */\n\nimport type { IAnalyzer } from '../analyzers/interfaces.js';\nimport type { INpmProvider, IGitHubProvider } from '../providers/interfaces.js';\nimport type { IScoringEngine } from '../scoring/interfaces.js';\nimport type { IRuleEngine, RuleEvaluationData } from '../rules/interfaces.js';\nimport type { AnalysisResult, AnalyzerResult, AnalysisSummary, Finding } from '../types/analysis.js';\nimport { AnalysisCategory, Severity, SEVERITY_ORDER, compareSeverity } from '../types/common.js';\nimport { AnalysisContext } from './context.js';\nimport { buildFetchPipeline, executePipeline } from './pipeline.js';\nimport { parallel } from '../utils/parallel.js';\n\n/** Options for running the analysis engine. */\nexport interface EngineOptions {\n  /** Maximum parallel analyzers. Default: 5. */\n  concurrency?: number;\n\n  /** Package version to analyze. Default: 'latest'. */\n  version?: string;\n\n  /** Categories to skip. */\n  skipCategories?: AnalysisCategory[];\n}\n\nexport class AnalysisEngine {\n  private readonly analyzers: IAnalyzer[] = [];\n\n  constructor(\n    private readonly npmProvider: INpmProvider,\n    private readonly githubProvider: IGitHubProvider | undefined,\n    private readonly scoringEngine: IScoringEngine,\n    private readonly ruleEngine: IRuleEngine,\n  ) {}\n\n  /** Register an analyzer. */\n  registerAnalyzer(analyzer: IAnalyzer): void {\n    this.analyzers.push(analyzer);\n  }\n\n  /** Register multiple analyzers. */\n  registerAnalyzers(analyzers: IAnalyzer[]): void {\n    this.analyzers.push(...analyzers);\n  }\n\n  /**\n   * Run the full analysis pipeline for a package.\n   */\n  async analyze(\n    packageName: string,\n    options: EngineOptions = {},\n  ): Promise<AnalysisResult> {\n    const { concurrency = 5, version = 'latest', skipCategories = [] } = options;\n\n    // Create analysis context\n    const context = new AnalysisContext(packageName, version);\n\n    // Build and execute data-fetching pipeline\n    const fetchStages = buildFetchPipeline(this.npmProvider, this.githubProvider);\n    await executePipeline(fetchStages, context);\n\n    // Filter analyzers\n    const activeAnalyzers = this.analyzers.filter(\n      (a) => !skipCategories.includes(a.category) && a.canAnalyze(context),\n    );\n\n    // Run analyzers in parallel\n    const tasks = activeAnalyzers.map(\n      (analyzer) => () => analyzer.analyze(context),\n    );\n    const parallelResults = await parallel(tasks, { concurrency });\n\n    const analyzerResults: AnalyzerResult[] = parallelResults\n      .filter((r) => r.success && r.value)\n      .map((r) => r.value!);\n\n    // Store script results back in context for exfiltration analyzer\n    const scriptResult = analyzerResults.find((r) => r.category === AnalysisCategory.InstallScripts);\n    if (scriptResult?.metadata['scriptResults']) {\n      context.scriptAnalysisResults = scriptResult.metadata['scriptResults'] as typeof context.scriptAnalysisResults;\n    }\n\n    // Evaluate rules\n    const ruleData = this.buildRuleData(context, analyzerResults);\n    const ruleFindings = this.ruleEngine.evaluate(ruleData);\n\n    // Gather all findings\n    const allFindings: Finding[] = [\n      ...analyzerResults.flatMap((r) => r.findings),\n      ...ruleFindings,\n    ].sort((a, b) => compareSeverity(b.severity, a.severity));\n\n    // Calculate trust score\n    const trustScore = this.scoringEngine.calculateTrustScore(analyzerResults);\n\n    // Determine highest severity\n    const highestSeverity = allFindings.length > 0\n      ? allFindings[0]!.severity\n      : Severity.Info;\n\n    // Build summary\n    const summary = this.buildSummary(analyzerResults, allFindings);\n\n    return {\n      packageName,\n      packageVersion: context.packageVersion,\n      analyzedAt: context.startedAt.toISOString(),\n      totalDurationMs: context.elapsedMs,\n      analyzerResults,\n      findings: allFindings,\n      trustScore,\n      highestSeverity,\n      summary,\n    };\n  }\n\n  /** Build rule evaluation data from context and analyzer results. */\n  private buildRuleData(\n    context: AnalysisContext,\n    results: AnalyzerResult[],\n  ): RuleEvaluationData {\n    const healthResult = results.find((r) => r.category === AnalysisCategory.Health);\n    const scResult = results.find((r) => r.category === AnalysisCategory.SupplyChain);\n    const scriptResult = results.find((r) => r.category === AnalysisCategory.InstallScripts);\n    const typoResult = results.find((r) => r.category === AnalysisCategory.Typosquatting);\n\n    return {\n      packageName: context.packageName,\n      packageVersion: context.packageVersion,\n      npmData: context.npmMetadata as unknown as Record<string, unknown>,\n      githubData: context.githubData as unknown as Record<string, unknown>,\n      healthMetrics: healthResult?.metadata['metrics'] as Record<string, unknown>,\n      supplyChainMetrics: scResult?.metadata['metrics'] as Record<string, unknown>,\n      scriptResults: scriptResult?.metadata as Record<string, unknown>,\n      typosquatData: typoResult?.metadata as Record<string, unknown>,\n    };\n  }\n\n  /** Build analysis summary statistics. */\n  private buildSummary(\n    results: AnalyzerResult[],\n    findings: Finding[],\n  ): AnalysisSummary {\n    const bySeverity = Object.fromEntries(\n      Object.values(Severity).map((s) => [s, findings.filter((f) => f.severity === s).length]),\n    ) as Record<Severity, number>;\n\n    const byCategory = Object.fromEntries(\n      Object.values(AnalysisCategory).map((c) => [c, findings.filter((f) => f.category === c).length]),\n    ) as Record<AnalysisCategory, number>;\n\n    return {\n      totalFindings: findings.length,\n      bySeverity,\n      byCategory,\n      analyzersRun: results.filter((r) => r.status === 'completed').length,\n      analyzersFailed: results.filter((r) => r.status === 'failed').length,\n      analyzersSkipped: results.filter((r) => r.status === 'skipped').length,\n    };\n  }\n}\n","/**\n * HTTP client with retry, timeout, and rate-limit awareness.\n * Wraps native fetch with production-grade resilience.\n */\n\n/** Options for individual HTTP requests. */\nexport interface HttpRequestOptions {\n  /** HTTP method. */\n  method?: 'GET' | 'POST' | 'PUT' | 'DELETE';\n\n  /** Request headers. */\n  headers?: Record<string, string>;\n\n  /** Request body (will be JSON.stringified if object). */\n  body?: unknown;\n\n  /** Timeout in milliseconds. */\n  timeoutMs?: number;\n\n  /** Maximum retry attempts. */\n  maxRetries?: number;\n\n  /** Base delay between retries in ms (exponential backoff). */\n  retryDelayMs?: number;\n\n  /** AbortSignal for cancellation. */\n  signal?: AbortSignal;\n}\n\n/** HTTP response wrapper. */\nexport interface HttpResponse<T = unknown> {\n  /** HTTP status code. */\n  status: number;\n\n  /** Response headers. */\n  headers: Record<string, string>;\n\n  /** Parsed response body. */\n  data: T;\n\n  /** Whether the request was successful (2xx). */\n  ok: boolean;\n\n  /** Rate limit info if present. */\n  rateLimit?: RateLimitInfo;\n}\n\n/** Rate limit information from API headers. */\nexport interface RateLimitInfo {\n  limit: number;\n  remaining: number;\n  resetAt: Date;\n}\n\n/** Default request options. */\nconst DEFAULTS: Required<Pick<HttpRequestOptions, 'method' | 'timeoutMs' | 'maxRetries' | 'retryDelayMs'>> = {\n  method: 'GET',\n  timeoutMs: 30_000,\n  maxRetries: 3,\n  retryDelayMs: 1_000,\n};\n\n/**\n * Make an HTTP request with retry logic, timeout, and rate-limit awareness.\n */\nexport async function httpRequest<T = unknown>(\n  url: string,\n  options: HttpRequestOptions = {},\n): Promise<HttpResponse<T>> {\n  const {\n    method = DEFAULTS.method,\n    headers = {},\n    body,\n    timeoutMs = DEFAULTS.timeoutMs,\n    maxRetries = DEFAULTS.maxRetries,\n    retryDelayMs = DEFAULTS.retryDelayMs,\n    signal,\n  } = options;\n\n  let lastError: Error | undefined;\n\n  for (let attempt = 0; attempt <= maxRetries; attempt++) {\n    try {\n      const controller = new AbortController();\n      const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n      // Combine external signal with timeout\n      if (signal) {\n        signal.addEventListener('abort', () => controller.abort(), { once: true });\n      }\n\n      const fetchOptions: RequestInit = {\n        method,\n        headers: {\n          'Accept': 'application/json',\n          ...headers,\n        },\n        signal: controller.signal,\n      };\n\n      if (body !== undefined) {\n        fetchOptions.body = typeof body === 'string' ? body : JSON.stringify(body);\n        (fetchOptions.headers as Record<string, string>)['Content-Type'] = 'application/json';\n      }\n\n      const response = await fetch(url, fetchOptions);\n      clearTimeout(timeoutId);\n\n      // Parse rate limit headers\n      const rateLimit = parseRateLimitHeaders(response.headers);\n\n      // If rate-limited, wait and retry\n      if (response.status === 429 && attempt < maxRetries) {\n        const retryAfter = getRetryAfter(response.headers, rateLimit);\n        await sleep(retryAfter);\n        continue;\n      }\n\n      // Parse response body\n      const contentType = response.headers.get('content-type') ?? '';\n      let data: T;\n      if (contentType.includes('application/json')) {\n        data = (await response.json()) as T;\n      } else {\n        data = (await response.text()) as unknown as T;\n      }\n\n      const responseHeaders: Record<string, string> = {};\n      response.headers.forEach((value, key) => {\n        responseHeaders[key] = value;\n      });\n\n      return {\n        status: response.status,\n        headers: responseHeaders,\n        data,\n        ok: response.ok,\n        rateLimit,\n      };\n    } catch (error) {\n      lastError = error instanceof Error ? error : new Error(String(error));\n\n      // Don't retry on abort\n      if (lastError.name === 'AbortError') {\n        throw new HttpError(`Request timed out after ${timeoutMs}ms: ${url}`, 0, url);\n      }\n\n      // Retry on network errors\n      if (attempt < maxRetries) {\n        const delay = retryDelayMs * Math.pow(2, attempt);\n        await sleep(delay);\n        continue;\n      }\n    }\n  }\n\n  throw new HttpError(\n    `Request failed after ${maxRetries + 1} attempts: ${lastError?.message ?? 'Unknown error'}`,\n    0,\n    url,\n  );\n}\n\n/** Parse rate limit headers from common APIs (GitHub, npm). */\nfunction parseRateLimitHeaders(headers: Headers): RateLimitInfo | undefined {\n  const limit = headers.get('x-ratelimit-limit');\n  const remaining = headers.get('x-ratelimit-remaining');\n  const reset = headers.get('x-ratelimit-reset');\n\n  if (limit && remaining && reset) {\n    return {\n      limit: parseInt(limit, 10),\n      remaining: parseInt(remaining, 10),\n      resetAt: new Date(parseInt(reset, 10) * 1000),\n    };\n  }\n  return undefined;\n}\n\n/** Determine how long to wait before retrying a rate-limited request. */\nfunction getRetryAfter(headers: Headers, rateLimit?: RateLimitInfo): number {\n  const retryAfter = headers.get('retry-after');\n  if (retryAfter) {\n    const seconds = parseInt(retryAfter, 10);\n    if (!isNaN(seconds)) return seconds * 1000;\n  }\n\n  if (rateLimit?.resetAt) {\n    const waitMs = rateLimit.resetAt.getTime() - Date.now();\n    return Math.max(waitMs, 1000);\n  }\n\n  return 5000; // Default 5-second wait\n}\n\n/** Sleep for the specified number of milliseconds. */\nfunction sleep(ms: number): Promise<void> {\n  return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/** Custom HTTP error class. */\nexport class HttpError extends Error {\n  constructor(\n    message: string,\n    public readonly statusCode: number,\n    public readonly url: string,\n  ) {\n    super(message);\n    this.name = 'HttpError';\n  }\n}\n","/**\n * npm registry data provider.\n * Fetches package metadata, downloads, and tarball data.\n */\n\nimport type { INpmProvider, ICacheManager } from '../interfaces.js';\nimport type { NpmPackageMetadata, NpmDownloads } from './types.js';\nimport { httpRequest, HttpError } from '../../utils/http.js';\n\nconst NPM_REGISTRY = 'https://registry.npmjs.org';\nconst NPM_API = 'https://api.npmjs.org';\n\nexport class NpmProvider implements INpmProvider {\n  constructor(private readonly cache?: ICacheManager) {}\n\n  async getPackageMetadata(packageName: string): Promise<NpmPackageMetadata> {\n    const cacheKey = `npm:metadata:${packageName}`;\n\n    if (this.cache) {\n      const cached = await this.cache.get<NpmPackageMetadata>(cacheKey);\n      if (cached) return cached;\n    }\n\n    const encodedName = encodePackageName(packageName);\n    const response = await httpRequest<NpmPackageMetadata>(\n      `${NPM_REGISTRY}/${encodedName}`,\n      {\n        headers: {\n          Accept: 'application/json',\n        },\n      },\n    );\n\n    if (!response.ok) {\n      if (response.status === 404) {\n        throw new NpmPackageNotFoundError(packageName);\n      }\n      throw new HttpError(\n        `npm registry returned ${response.status} for ${packageName}`,\n        response.status,\n        `${NPM_REGISTRY}/${encodedName}`,\n      );\n    }\n\n    if (this.cache) {\n      await this.cache.set(cacheKey, response.data, 900); // 15 min TTL\n    }\n\n    return response.data;\n  }\n\n  async getDownloads(\n    packageName: string,\n    period = 'last-week',\n  ): Promise<NpmDownloads> {\n    const cacheKey = `npm:downloads:${packageName}:${period}`;\n\n    if (this.cache) {\n      const cached = await this.cache.get<NpmDownloads>(cacheKey);\n      if (cached) return cached;\n    }\n\n    const encodedName = encodePackageName(packageName);\n    const response = await httpRequest<NpmDownloads>(\n      `${NPM_API}/downloads/point/${period}/${encodedName}`,\n    );\n\n    if (!response.ok) {\n      // Downloads API returns 0 for unknown packages, not 404\n      return {\n        downloads: 0,\n        start: '',\n        end: '',\n        package: packageName,\n      };\n    }\n\n    if (this.cache) {\n      await this.cache.set(cacheKey, response.data, 3600); // 1 hour TTL\n    }\n\n    return response.data;\n  }\n\n  async getTarballUrl(\n    packageName: string,\n    version: string,\n  ): Promise<string> {\n    const metadata = await this.getPackageMetadata(packageName);\n    const versionData = metadata.versions[version];\n\n    if (!versionData) {\n      throw new Error(\n        `Version ${version} not found for package ${packageName}`,\n      );\n    }\n\n    return versionData.dist.tarball;\n  }\n\n  async getPackageFiles(\n    packageName: string,\n    version: string,\n  ): Promise<Map<string, string>> {\n    const metadata = await this.getPackageMetadata(packageName);\n    const versionData = metadata.versions[version];\n\n    if (!versionData) {\n      throw new Error(\n        `Version ${version} not found for package ${packageName}`,\n      );\n    }\n\n    const files = new Map<string, string>();\n    files.set('package.json', JSON.stringify(versionData, null, 2));\n\n    try {\n      const tarballUrl = versionData.dist.tarball;\n      const response = await fetch(tarballUrl);\n      if (!response.ok) {\n        throw new Error(`Failed to fetch tarball from ${tarballUrl}`);\n      }\n\n      const arrayBuffer = await response.arrayBuffer();\n      const buffer = Buffer.from(arrayBuffer);\n\n      const { Readable } = await import('node:stream');\n      const tar = await import('tar');\n\n      await new Promise<void>((resolve, reject) => {\n        const readable = Readable.from(buffer);\n        const parser = new tar.Parser();\n\n        parser.on('entry', (entry: import('tar').ReadEntry) => {\n          const isInteresting =\n            entry.type === 'File' &&\n            (entry.path.endsWith('.js') ||\n              entry.path.endsWith('.ts') ||\n              entry.path.endsWith('.json') ||\n              entry.path.endsWith('.sh') ||\n              entry.path.endsWith('.bat'));\n\n          if (!isInteresting) {\n            entry.resume();\n            return;\n          }\n\n          const chunks: Buffer[] = [];\n          entry.on('data', (chunk: Buffer) => chunks.push(chunk));\n          entry.on('end', () => {\n            const content = Buffer.concat(chunks).toString('utf-8');\n            const cleanPath = entry.path.replace(/^package\\//, '');\n            files.set(cleanPath, content);\n          });\n        });\n\n        parser.on('end', () => resolve());\n        parser.on('error', (err: Error) => reject(err));\n\n        readable.pipe(parser);\n      });\n    } catch {\n      // Fallback to only metadata package.json if download/extraction fails\n    }\n\n    return files;\n  }\n}\n\n/** Properly encode scoped package names for URLs. */\nfunction encodePackageName(name: string): string {\n  if (name.startsWith('@')) {\n    return '@' + encodeURIComponent(name.slice(1));\n  }\n  return encodeURIComponent(name);\n}\n\n/** Error thrown when a package is not found on npm. */\nexport class NpmPackageNotFoundError extends Error {\n  constructor(public readonly packageName: string) {\n    super(`Package \"${packageName}\" not found on npm registry`);\n    this.name = 'NpmPackageNotFoundError';\n  }\n}\n","/**\n * GitHub API data provider.\n * Handles rate limiting, authentication, and response caching.\n */\n\nimport type { IGitHubProvider, ICacheManager } from '../interfaces.js';\nimport type {\n  GitHubRepoData,\n  GitHubContributor,\n  GitHubCommit,\n  GitHubIssue,\n} from './types.js';\nimport { httpRequest } from '../../utils/http.js';\nimport { parseGitHubUrl } from '../../utils/validation.js';\n\nconst GITHUB_API = 'https://api.github.com';\n\nexport class GitHubProvider implements IGitHubProvider {\n  private readonly token: string | undefined;\n  private readonly apiBaseUrl: string;\n\n  constructor(\n    options: { token?: string; apiBaseUrl?: string } = {},\n    private readonly cache?: ICacheManager,\n  ) {\n    this.token = options.token ?? process.env['GITHUB_TOKEN'];\n    this.apiBaseUrl = options.apiBaseUrl ?? GITHUB_API;\n  }\n\n  async getRepoData(repoUrl: string): Promise<GitHubRepoData> {\n    const { owner, repo } = this.parseRepoIdentifier(repoUrl);\n    const cacheKey = `github:repo:${owner}/${repo}`;\n\n    if (this.cache) {\n      const cached = await this.cache.get<GitHubRepoData>(cacheKey);\n      if (cached) return cached;\n    }\n\n    const response = await httpRequest<GitHubRepoData>(\n      `${this.apiBaseUrl}/repos/${owner}/${repo}`,\n      { headers: this.getHeaders() },\n    );\n\n    if (!response.ok) {\n      throw new GitHubApiError(\n        `GitHub API returned ${response.status} for ${owner}/${repo}`,\n        response.status,\n      );\n    }\n\n    if (this.cache) {\n      await this.cache.set(cacheKey, response.data, 3600); // 1 hour\n    }\n\n    return response.data;\n  }\n\n  async getContributors(\n    owner: string,\n    repo: string,\n  ): Promise<GitHubContributor[]> {\n    const cacheKey = `github:contributors:${owner}/${repo}`;\n\n    if (this.cache) {\n      const cached = await this.cache.get<GitHubContributor[]>(cacheKey);\n      if (cached) return cached;\n    }\n\n    const response = await httpRequest<GitHubContributor[]>(\n      `${this.apiBaseUrl}/repos/${owner}/${repo}/contributors?per_page=100`,\n      { headers: this.getHeaders() },\n    );\n\n    if (!response.ok) {\n      return [];\n    }\n\n    if (this.cache) {\n      await this.cache.set(cacheKey, response.data, 3600);\n    }\n\n    return response.data;\n  }\n\n  async getRecentCommits(\n    owner: string,\n    repo: string,\n    since?: Date,\n  ): Promise<Array<{ sha: string; date: string; author: string }>> {\n    const sinceDate = since ?? new Date(Date.now() - 90 * 24 * 60 * 60 * 1000); // 90 days\n    const cacheKey = `github:commits:${owner}/${repo}:${sinceDate.toISOString().split('T')[0]}`;\n\n    if (this.cache) {\n      const cached = await this.cache.get<\n        Array<{ sha: string; date: string; author: string }>\n      >(cacheKey);\n      if (cached) return cached;\n    }\n\n    const response = await httpRequest<GitHubCommit[]>(\n      `${this.apiBaseUrl}/repos/${owner}/${repo}/commits?since=${sinceDate.toISOString()}&per_page=100`,\n      { headers: this.getHeaders() },\n    );\n\n    if (!response.ok) {\n      return [];\n    }\n\n    const commits = response.data.map((c) => ({\n      sha: c.sha,\n      date: c.commit.author.date,\n      author: c.author?.login ?? c.commit.author.name,\n    }));\n\n    if (this.cache) {\n      await this.cache.set(cacheKey, commits, 3600);\n    }\n\n    return commits;\n  }\n\n  async getIssueStats(\n    owner: string,\n    repo: string,\n  ): Promise<{\n    openCount: number;\n    closedCount: number;\n    avgResponseTimeHours: number;\n  }> {\n    const cacheKey = `github:issues:${owner}/${repo}`;\n\n    if (this.cache) {\n      const cached = await this.cache.get<{\n        openCount: number;\n        closedCount: number;\n        avgResponseTimeHours: number;\n      }>(cacheKey);\n      if (cached) return cached;\n    }\n\n    // Fetch open issues (excluding PRs)\n    const openResponse = await httpRequest<GitHubIssue[]>(\n      `${this.apiBaseUrl}/repos/${owner}/${repo}/issues?state=open&per_page=100`,\n      { headers: this.getHeaders() },\n    );\n\n    // Fetch recently closed issues\n    const closedResponse = await httpRequest<GitHubIssue[]>(\n      `${this.apiBaseUrl}/repos/${owner}/${repo}/issues?state=closed&per_page=100&sort=updated&direction=desc`,\n      { headers: this.getHeaders() },\n    );\n\n    const openIssues = (openResponse.ok ? openResponse.data : []).filter(\n      (i) => !i.pull_request,\n    );\n    const closedIssues = (closedResponse.ok ? closedResponse.data : []).filter(\n      (i) => !i.pull_request,\n    );\n\n    // Calculate average response time from closed issues\n    let totalResponseHours = 0;\n    let issuesWithResponse = 0;\n\n    for (const issue of closedIssues) {\n      if (issue.closed_at) {\n        const created = new Date(issue.created_at).getTime();\n        const closed = new Date(issue.closed_at).getTime();\n        const hours = (closed - created) / (1000 * 60 * 60);\n        totalResponseHours += hours;\n        issuesWithResponse++;\n      }\n    }\n\n    const result = {\n      openCount: openIssues.length,\n      closedCount: closedIssues.length,\n      avgResponseTimeHours:\n        issuesWithResponse > 0\n          ? totalResponseHours / issuesWithResponse\n          : 0,\n    };\n\n    if (this.cache) {\n      await this.cache.set(cacheKey, result, 3600);\n    }\n\n    return result;\n  }\n\n  async getRateLimit(): Promise<{\n    remaining: number;\n    limit: number;\n    resetAt: Date;\n  }> {\n    const response = await httpRequest<{\n      rate: { limit: number; remaining: number; reset: number };\n    }>(`${this.apiBaseUrl}/rate_limit`, {\n      headers: this.getHeaders(),\n    });\n\n    if (!response.ok) {\n      return { remaining: 0, limit: 0, resetAt: new Date() };\n    }\n\n    return {\n      remaining: response.data.rate.remaining,\n      limit: response.data.rate.limit,\n      resetAt: new Date(response.data.rate.reset * 1000),\n    };\n  }\n\n  /** Build authentication headers. */\n  private getHeaders(): Record<string, string> {\n    const headers: Record<string, string> = {\n      Accept: 'application/vnd.github.v3+json',\n      'User-Agent': 'pkg-sentinel',\n    };\n\n    if (this.token) {\n      headers['Authorization'] = `Bearer ${this.token}`;\n    }\n\n    return headers;\n  }\n\n  /** Parse a repo identifier from a URL or \"owner/repo\" string. */\n  private parseRepoIdentifier(input: string): {\n    owner: string;\n    repo: string;\n  } {\n    // Try \"owner/repo\" format first\n    const slashParts = input.split('/');\n    if (\n      slashParts.length === 2 &&\n      slashParts[0] &&\n      slashParts[1] &&\n      !input.includes('://')\n    ) {\n      return { owner: slashParts[0], repo: slashParts[1] };\n    }\n\n    // Try URL parsing\n    const parsed = parseGitHubUrl(input);\n    if (parsed) return parsed;\n\n    throw new Error(`Cannot parse GitHub repository from: \"${input}\"`);\n  }\n}\n\n/** GitHub API-specific error. */\nexport class GitHubApiError extends Error {\n  constructor(\n    message: string,\n    public readonly statusCode: number,\n  ) {\n    super(message);\n    this.name = 'GitHubApiError';\n  }\n}\n","/**\n * Hash and integrity utilities.\n */\n\nimport { createHash } from 'node:crypto';\n\n/**\n * Compute SHA-256 hash of a string.\n */\nexport function sha256(data: string): string {\n  return createHash('sha256').update(data, 'utf-8').digest('hex');\n}\n\n/**\n * Compute SHA-512 hash of a string or buffer.\n */\nexport function sha512(data: string | Buffer): string {\n  return createHash('sha512').update(data).digest('hex');\n}\n\n/**\n * Compute SHA-512 hash in base64 format (used in npm integrity).\n */\nexport function sha512Base64(data: string | Buffer): string {\n  return 'sha512-' + createHash('sha512').update(data).digest('base64');\n}\n\n/**\n * Verify an npm-style integrity hash.\n * Format: \"sha512-<base64hash>\"\n */\nexport function verifyIntegrity(data: string | Buffer, expectedIntegrity: string): boolean {\n  const [algorithm, expectedHash] = expectedIntegrity.split('-', 2);\n  if (!algorithm || !expectedHash) return false;\n\n  try {\n    const actualHash = createHash(algorithm).update(data).digest('base64');\n    return actualHash === expectedHash;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Generate a cache key from an object by hashing its JSON representation.\n */\nexport function cacheKey(...parts: string[]): string {\n  return sha256(parts.join(':'));\n}\n","/**\n * Filesystem-backed cache with TTL support.\n * Stores JSON files in a cache directory with expiry metadata.\n */\n\nimport { readFile, writeFile, mkdir, readdir, unlink, stat } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { sha256 } from '../../utils/hash.js';\n\n/** A cached entry stored on disk. */\ninterface CacheEntry<T> {\n  /** The cached data. */\n  data: T;\n\n  /** Expiration timestamp (ms since epoch). */\n  expiresAt: number;\n\n  /** When the entry was created. */\n  createdAt: number;\n}\n\nexport class FileCache {\n  constructor(private readonly directory: string) {}\n\n  /** Ensure the cache directory exists. */\n  private async ensureDir(): Promise<void> {\n    await mkdir(this.directory, { recursive: true });\n  }\n\n  /** Get the file path for a cache key. */\n  private keyToPath(key: string): string {\n    const hash = sha256(key);\n    return join(this.directory, `${hash}.json`);\n  }\n\n  /** Get a cached value. Returns undefined if not found or expired. */\n  async get<T>(key: string): Promise<T | undefined> {\n    try {\n      const filePath = this.keyToPath(key);\n      const content = await readFile(filePath, 'utf-8');\n      const entry = JSON.parse(content) as CacheEntry<T>;\n\n      if (Date.now() > entry.expiresAt) {\n        // Expired — delete async, don't wait\n        unlink(filePath).catch(() => {});\n        return undefined;\n      }\n\n      return entry.data;\n    } catch {\n      return undefined;\n    }\n  }\n\n  /** Set a value in the cache with a TTL in seconds. */\n  async set<T>(key: string, value: T, ttlSeconds: number): Promise<void> {\n    await this.ensureDir();\n\n    const entry: CacheEntry<T> = {\n      data: value,\n      expiresAt: Date.now() + ttlSeconds * 1000,\n      createdAt: Date.now(),\n    };\n\n    const filePath = this.keyToPath(key);\n    await writeFile(filePath, JSON.stringify(entry), 'utf-8');\n  }\n\n  /** Check if a key exists and is not expired. */\n  async has(key: string): Promise<boolean> {\n    const value = await this.get(key);\n    return value !== undefined;\n  }\n\n  /** Delete a specific key. */\n  async delete(key: string): Promise<void> {\n    try {\n      await unlink(this.keyToPath(key));\n    } catch {\n      // Key doesn't exist — that's fine\n    }\n  }\n\n  /** Clear the entire cache. */\n  async clear(): Promise<void> {\n    try {\n      const files = await readdir(this.directory);\n      await Promise.all(\n        files\n          .filter((f) => f.endsWith('.json'))\n          .map((f) => unlink(join(this.directory, f)).catch(() => {})),\n      );\n    } catch {\n      // Directory doesn't exist — that's fine\n    }\n  }\n\n  /** Get cache statistics. */\n  async stats(): Promise<{ size: number; keys: number }> {\n    try {\n      const files = await readdir(this.directory);\n      const jsonFiles = files.filter((f) => f.endsWith('.json'));\n\n      let totalSize = 0;\n      for (const file of jsonFiles) {\n        try {\n          const fileStat = await stat(join(this.directory, file));\n          totalSize += fileStat.size;\n        } catch {\n          // File may have been deleted\n        }\n      }\n\n      return { size: totalSize, keys: jsonFiles.length };\n    } catch {\n      return { size: 0, keys: 0 };\n    }\n  }\n\n  /** Evict expired entries. */\n  async evictExpired(): Promise<number> {\n    let evicted = 0;\n    try {\n      const files = await readdir(this.directory);\n      for (const file of files.filter((f) => f.endsWith('.json'))) {\n        try {\n          const filePath = join(this.directory, file);\n          const content = await readFile(filePath, 'utf-8');\n          const entry = JSON.parse(content) as CacheEntry<unknown>;\n          if (Date.now() > entry.expiresAt) {\n            await unlink(filePath);\n            evicted++;\n          }\n        } catch {\n          // Skip corrupt entries\n        }\n      }\n    } catch {\n      // Directory doesn't exist\n    }\n    return evicted;\n  }\n}\n","/**\n * Unified cache manager implementing ICacheManager.\n * Wraps FileCache with the interface expected by providers.\n */\n\nimport type { ICacheManager } from '../interfaces.js';\nimport { FileCache } from './file-cache.js';\n\nexport class CacheManager implements ICacheManager {\n  private readonly fileCache: FileCache;\n\n  constructor(cacheDirectory: string) {\n    this.fileCache = new FileCache(cacheDirectory);\n  }\n\n  async get<T>(key: string): Promise<T | undefined> {\n    return this.fileCache.get<T>(key);\n  }\n\n  async set<T>(key: string, value: T, ttlSeconds: number): Promise<void> {\n    return this.fileCache.set(key, value, ttlSeconds);\n  }\n\n  async has(key: string): Promise<boolean> {\n    return this.fileCache.has(key);\n  }\n\n  async delete(key: string): Promise<void> {\n    return this.fileCache.delete(key);\n  }\n\n  async clear(): Promise<void> {\n    return this.fileCache.clear();\n  }\n\n  async stats(): Promise<{ size: number; keys: number }> {\n    return this.fileCache.stats();\n  }\n\n  /** Evict expired entries and return count. */\n  async evictExpired(): Promise<number> {\n    return this.fileCache.evictExpired();\n  }\n}\n","/**\n * Health metric calculators.\n * Each function normalizes a raw metric value to a 0–100 score.\n */\n\nimport type { HealthMetrics } from '../../types/analysis.js';\nimport type { MetricScore } from '../../types/scores.js';\n\n/**\n * Calculate all health metric scores from raw metrics.\n */\nexport function calculateHealthMetrics(metrics: HealthMetrics): MetricScore[] {\n  const scores: MetricScore[] = [];\n\n  scores.push(scoreGitHubStars(metrics.githubStars));\n  scores.push(scoreContributorCount(metrics.contributorCount));\n  scores.push(scoreLastCommit(metrics.lastCommitDate));\n  scores.push(scoreReleaseFrequency(metrics.releaseFrequencyDays));\n  scores.push(scoreOpenIssueRatio(metrics.openIssueCount, metrics.closedIssueRatio));\n  scores.push(scoreIssueResponseTime(metrics.avgIssueResponseTimeHours));\n  scores.push(scoreArchivedStatus(metrics.isArchived));\n  scores.push(scoreRepositoryAge(metrics.repositoryAgeDays));\n  scores.push(scoreCommitFrequency(metrics.commitFrequencyPerWeek));\n  scores.push(scoreBusFactor(metrics.busFactorEstimate));\n  scores.push(scoreWeeklyDownloads(metrics.weeklyDownloads));\n  scores.push(scoreMaintainerCount(metrics.maintainerCount));\n\n  return scores;\n}\n\nfunction scoreGitHubStars(stars: number | null): MetricScore {\n  let normalizedScore = 0;\n  if (stars !== null) {\n    if (stars >= 10000) normalizedScore = 100;\n    else if (stars >= 5000) normalizedScore = 90;\n    else if (stars >= 1000) normalizedScore = 80;\n    else if (stars >= 500) normalizedScore = 70;\n    else if (stars >= 100) normalizedScore = 60;\n    else if (stars >= 50) normalizedScore = 50;\n    else if (stars >= 10) normalizedScore = 35;\n    else normalizedScore = 20;\n  }\n\n  return {\n    id: 'github-stars',\n    label: 'GitHub Stars',\n    rawValue: stars,\n    normalizedScore,\n    weight: 8,\n    explanation: stars !== null\n      ? `Repository has ${stars.toLocaleString()} stars`\n      : 'No GitHub repository linked',\n  };\n}\n\nfunction scoreContributorCount(count: number | null): MetricScore {\n  let normalizedScore = 0;\n  if (count !== null) {\n    if (count >= 100) normalizedScore = 100;\n    else if (count >= 50) normalizedScore = 90;\n    else if (count >= 20) normalizedScore = 80;\n    else if (count >= 10) normalizedScore = 70;\n    else if (count >= 5) normalizedScore = 55;\n    else if (count >= 2) normalizedScore = 40;\n    else normalizedScore = 25;\n  }\n\n  return {\n    id: 'contributor-count',\n    label: 'Contributor Count',\n    rawValue: count,\n    normalizedScore,\n    weight: 10,\n    explanation: count !== null\n      ? `${count} contributor${count !== 1 ? 's' : ''} found`\n      : 'Contributor data unavailable',\n  };\n}\n\nfunction scoreLastCommit(lastCommitDate: string | null): MetricScore {\n  let normalizedScore = 0;\n  let explanation = 'No commit data available';\n\n  if (lastCommitDate) {\n    const daysSince = Math.floor(\n      (Date.now() - new Date(lastCommitDate).getTime()) / (1000 * 60 * 60 * 24),\n    );\n\n    if (daysSince <= 7) normalizedScore = 100;\n    else if (daysSince <= 30) normalizedScore = 90;\n    else if (daysSince <= 90) normalizedScore = 75;\n    else if (daysSince <= 180) normalizedScore = 55;\n    else if (daysSince <= 365) normalizedScore = 35;\n    else normalizedScore = 15;\n\n    explanation = `Last commit was ${daysSince} day${daysSince !== 1 ? 's' : ''} ago`;\n  }\n\n  return {\n    id: 'last-commit',\n    label: 'Last Commit Recency',\n    rawValue: lastCommitDate,\n    normalizedScore,\n    weight: 15,\n    explanation,\n  };\n}\n\nfunction scoreReleaseFrequency(days: number | null): MetricScore {\n  let normalizedScore = 0;\n  let explanation = 'No release frequency data available';\n\n  if (days !== null) {\n    if (days <= 7) normalizedScore = 100;\n    else if (days <= 30) normalizedScore = 85;\n    else if (days <= 90) normalizedScore = 70;\n    else if (days <= 180) normalizedScore = 50;\n    else if (days <= 365) normalizedScore = 30;\n    else normalizedScore = 15;\n\n    explanation = `Average release frequency: every ${days} day${days !== 1 ? 's' : ''}`;\n  }\n\n  return {\n    id: 'release-frequency',\n    label: 'Release Frequency',\n    rawValue: days,\n    normalizedScore,\n    weight: 10,\n    explanation,\n  };\n}\n\nfunction scoreOpenIssueRatio(\n  openCount: number | null,\n  closedRatio: number | null,\n): MetricScore {\n  let normalizedScore = 50;\n  let explanation = 'Issue data unavailable';\n\n  if (closedRatio !== null) {\n    // closedRatio is between 0 and 1 (proportion closed)\n    normalizedScore = Math.round(closedRatio * 100);\n    explanation = `${Math.round(closedRatio * 100)}% of issues have been closed`;\n    if (openCount !== null) {\n      explanation += ` (${openCount} open)`;\n    }\n  }\n\n  return {\n    id: 'issue-ratio',\n    label: 'Issue Close Ratio',\n    rawValue: { openCount, closedRatio },\n    normalizedScore,\n    weight: 8,\n    explanation,\n  };\n}\n\nfunction scoreIssueResponseTime(hours: number | null): MetricScore {\n  let normalizedScore = 0;\n  let explanation = 'Response time data unavailable';\n\n  if (hours !== null) {\n    if (hours <= 24) normalizedScore = 100;\n    else if (hours <= 72) normalizedScore = 85;\n    else if (hours <= 168) normalizedScore = 70;\n    else if (hours <= 720) normalizedScore = 50;\n    else normalizedScore = 25;\n\n    const displayHours = Math.round(hours);\n    explanation = displayHours <= 48\n      ? `Average issue response: ${displayHours} hour${displayHours !== 1 ? 's' : ''}`\n      : `Average issue response: ${Math.round(hours / 24)} days`;\n  }\n\n  return {\n    id: 'issue-response-time',\n    label: 'Issue Response Time',\n    rawValue: hours,\n    normalizedScore,\n    weight: 7,\n    explanation,\n  };\n}\n\nfunction scoreArchivedStatus(isArchived: boolean | null): MetricScore {\n  const normalizedScore = isArchived === true ? 0 : isArchived === false ? 100 : 50;\n\n  return {\n    id: 'archived-status',\n    label: 'Archived Status',\n    rawValue: isArchived,\n    normalizedScore,\n    weight: 12,\n    explanation: isArchived === true\n      ? '⚠ Repository is archived — no further maintenance expected'\n      : isArchived === false\n        ? 'Repository is active (not archived)'\n        : 'Archive status unknown',\n  };\n}\n\nfunction scoreRepositoryAge(days: number | null): MetricScore {\n  let normalizedScore = 0;\n  let explanation = 'Repository age unknown';\n\n  if (days !== null) {\n    if (days >= 1825) normalizedScore = 100;  // 5+ years\n    else if (days >= 1095) normalizedScore = 90;  // 3+ years\n    else if (days >= 730) normalizedScore = 80;   // 2+ years\n    else if (days >= 365) normalizedScore = 65;   // 1+ year\n    else if (days >= 180) normalizedScore = 50;   // 6+ months\n    else if (days >= 90) normalizedScore = 35;    // 3+ months\n    else normalizedScore = 20;\n\n    const years = (days / 365).toFixed(1);\n    explanation = `Repository is ${years} years old`;\n  }\n\n  return {\n    id: 'repository-age',\n    label: 'Repository Age',\n    rawValue: days,\n    normalizedScore,\n    weight: 8,\n    explanation,\n  };\n}\n\nfunction scoreCommitFrequency(perWeek: number | null): MetricScore {\n  let normalizedScore = 0;\n  let explanation = 'Commit frequency data unavailable';\n\n  if (perWeek !== null) {\n    if (perWeek >= 10) normalizedScore = 100;\n    else if (perWeek >= 5) normalizedScore = 85;\n    else if (perWeek >= 2) normalizedScore = 70;\n    else if (perWeek >= 1) normalizedScore = 55;\n    else if (perWeek >= 0.25) normalizedScore = 35;\n    else normalizedScore = 15;\n\n    explanation = `${perWeek.toFixed(1)} commits per week`;\n  }\n\n  return {\n    id: 'commit-frequency',\n    label: 'Commit Frequency',\n    rawValue: perWeek,\n    normalizedScore,\n    weight: 10,\n    explanation,\n  };\n}\n\nfunction scoreBusFactor(estimate: number | null): MetricScore {\n  let normalizedScore = 0;\n  let explanation = 'Bus factor unknown';\n\n  if (estimate !== null) {\n    if (estimate >= 5) normalizedScore = 100;\n    else if (estimate >= 3) normalizedScore = 80;\n    else if (estimate >= 2) normalizedScore = 60;\n    else normalizedScore = 30;\n\n    explanation = `Estimated bus factor: ${estimate}`;\n  }\n\n  return {\n    id: 'bus-factor',\n    label: 'Bus Factor',\n    rawValue: estimate,\n    normalizedScore,\n    weight: 7,\n    explanation,\n  };\n}\n\nfunction scoreWeeklyDownloads(downloads: number | null): MetricScore {\n  let normalizedScore = 0;\n\n  if (downloads !== null) {\n    if (downloads >= 1_000_000) normalizedScore = 100;\n    else if (downloads >= 500_000) normalizedScore = 90;\n    else if (downloads >= 100_000) normalizedScore = 80;\n    else if (downloads >= 10_000) normalizedScore = 70;\n    else if (downloads >= 1_000) normalizedScore = 55;\n    else if (downloads >= 100) normalizedScore = 35;\n    else normalizedScore = 15;\n  }\n\n  return {\n    id: 'weekly-downloads',\n    label: 'Weekly Downloads',\n    rawValue: downloads,\n    normalizedScore,\n    weight: 5,\n    explanation: downloads !== null\n      ? `${downloads.toLocaleString()} weekly downloads`\n      : 'Download data unavailable',\n  };\n}\n\nfunction scoreMaintainerCount(count: number | null): MetricScore {\n  let normalizedScore = 0;\n  if (count !== null) {\n    if (count >= 5) normalizedScore = 90;\n    else if (count >= 3) normalizedScore = 80;\n    else if (count >= 2) normalizedScore = 65;\n    else normalizedScore = 40;\n  }\n\n  return {\n    id: 'maintainer-count',\n    label: 'Maintainer Count',\n    rawValue: count,\n    normalizedScore,\n    weight: 10,\n    explanation: count !== null\n      ? `${count} npm maintainer${count !== 1 ? 's' : ''}`\n      : 'Maintainer count unknown',\n  };\n}\n","/**\n * Semver utility functions.\n */\n\n/** Parsed semantic version. */\nexport interface ParsedVersion {\n  major: number;\n  minor: number;\n  patch: number;\n  prerelease: string[];\n  build: string[];\n  raw: string;\n}\n\n/** Regex for semver parsing. */\nconst SEMVER_REGEX =\n  /^v?(\\d+)\\.(\\d+)\\.(\\d+)(?:-([a-zA-Z0-9.]+))?(?:\\+([a-zA-Z0-9.]+))?$/;\n\n/**\n * Parse a semver string into its components.\n * Returns null if the string is not a valid semver.\n */\nexport function parseSemver(version: string): ParsedVersion | null {\n  const match = version.trim().match(SEMVER_REGEX);\n  if (!match) return null;\n\n  return {\n    major: parseInt(match[1]!, 10),\n    minor: parseInt(match[2]!, 10),\n    patch: parseInt(match[3]!, 10),\n    prerelease: match[4] ? match[4].split('.') : [],\n    build: match[5] ? match[5].split('.') : [],\n    raw: version.trim(),\n  };\n}\n\n/**\n * Compare two semver strings.\n * Returns: negative if a < b, 0 if equal, positive if a > b.\n */\nexport function compareSemver(a: string, b: string): number {\n  const pa = parseSemver(a);\n  const pb = parseSemver(b);\n  if (!pa || !pb) return 0;\n\n  if (pa.major !== pb.major) return pa.major - pb.major;\n  if (pa.minor !== pb.minor) return pa.minor - pb.minor;\n  if (pa.patch !== pb.patch) return pa.patch - pb.patch;\n\n  // Pre-release versions have lower precedence\n  if (pa.prerelease.length > 0 && pb.prerelease.length === 0) return -1;\n  if (pa.prerelease.length === 0 && pb.prerelease.length > 0) return 1;\n\n  return 0;\n}\n\n/**\n * Sort an array of version strings in descending order (newest first).\n */\nexport function sortVersionsDesc(versions: string[]): string[] {\n  return [...versions].sort((a, b) => compareSemver(b, a));\n}\n\n/**\n * Check if a version is a pre-release version.\n */\nexport function isPrerelease(version: string): boolean {\n  const parsed = parseSemver(version);\n  return parsed !== null && parsed.prerelease.length > 0;\n}\n\n/**\n * Get the latest stable version from an array of versions.\n */\nexport function getLatestStable(versions: string[]): string | undefined {\n  const stable = versions.filter((v) => !isPrerelease(v));\n  const sorted = sortVersionsDesc(stable);\n  return sorted[0];\n}\n\n/**\n * Calculate the number of days between two version release dates.\n */\nexport function daysBetween(dateA: string | Date, dateB: string | Date): number {\n  const a = typeof dateA === 'string' ? new Date(dateA) : dateA;\n  const b = typeof dateB === 'string' ? new Date(dateB) : dateB;\n  const diffMs = Math.abs(a.getTime() - b.getTime());\n  return Math.floor(diffMs / (1000 * 60 * 60 * 24));\n}\n","/**\n * Health analyzer — evaluates repository and package health.\n */\n\nimport type { IAnalyzer } from '../interfaces.js';\nimport type { AnalyzerResult, HealthMetrics } from '../../types/analysis.js';\nimport { AnalysisCategory, AnalysisStatus } from '../../types/common.js';\nimport type { AnalysisContext } from '../../core/context.js';\nimport { calculateHealthMetrics } from './metrics.js';\nimport { daysBetween } from '../../utils/semver.js';\n\nexport class HealthAnalyzer implements IAnalyzer {\n  readonly name = 'health';\n  readonly description = 'Evaluates repository health, maintainer activity, and community adoption';\n  readonly category = AnalysisCategory.Health;\n\n  canAnalyze(context: AnalysisContext): boolean {\n    // Can analyze if we have npm metadata (always), but deeper analysis needs GitHub\n    return context.npmMetadata !== undefined;\n  }\n\n  async analyze(context: AnalysisContext): Promise<AnalyzerResult> {\n    const start = Date.now();\n\n    try {\n      const metrics = await this.collectMetrics(context);\n      const metricScores = calculateHealthMetrics(metrics);\n\n      return {\n        analyzer: this.name,\n        category: this.category,\n        status: AnalysisStatus.Completed,\n        findings: [],\n        durationMs: Date.now() - start,\n        metadata: {\n          metrics,\n          metricScores,\n        },\n      };\n    } catch (error) {\n      return {\n        analyzer: this.name,\n        category: this.category,\n        status: AnalysisStatus.Failed,\n        findings: [],\n        durationMs: Date.now() - start,\n        error: error instanceof Error ? error.message : String(error),\n        metadata: {},\n      };\n    }\n  }\n\n  private async collectMetrics(context: AnalysisContext): Promise<HealthMetrics> {\n    const { npmMetadata, githubData, githubContributors, githubCommits, githubIssueStats, npmDownloads } = context;\n\n    // Calculate release frequency from npm time data\n    let releaseFrequencyDays: number | null = null;\n    let recentReleaseCadenceDays: number | null = null;\n    if (npmMetadata?.time) {\n      const versions = Object.entries(npmMetadata.time)\n        .filter(([key]) => key !== 'created' && key !== 'modified')\n        .sort((a, b) => new Date(b[1]).getTime() - new Date(a[1]).getTime());\n\n      if (versions.length >= 2) {\n        const newest = versions[0]!;\n        const oldest = versions[versions.length - 1]!;\n        const totalDays = daysBetween(oldest[1], newest[1]);\n        releaseFrequencyDays = Math.round(totalDays / (versions.length - 1));\n\n        // Recent cadence: last 5 releases\n        const recent = versions.slice(0, Math.min(5, versions.length));\n        if (recent.length >= 2) {\n          const recentDays = daysBetween(recent[recent.length - 1]![1], recent[0]![1]);\n          recentReleaseCadenceDays = Math.round(recentDays / (recent.length - 1));\n        }\n      }\n    }\n\n    // Calculate commit frequency\n    let commitFrequencyPerWeek: number | null = null;\n    if (githubCommits && githubCommits.length > 0) {\n      const oldest = githubCommits[githubCommits.length - 1]!;\n      const days = daysBetween(oldest.date, new Date().toISOString());\n      const weeks = Math.max(days / 7, 1);\n      commitFrequencyPerWeek = Math.round((githubCommits.length / weeks) * 10) / 10;\n    }\n\n    // Estimate bus factor from contributor distribution\n    let busFactorEstimate: number | null = null;\n    if (githubContributors && githubContributors.length > 0) {\n      const totalContributions = githubContributors.reduce((sum, c) => sum + c.contributions, 0);\n      let accumulated = 0;\n      let busFactor = 0;\n      for (const contributor of githubContributors) {\n        accumulated += contributor.contributions;\n        busFactor++;\n        if (accumulated >= totalContributions * 0.5) break;\n      }\n      busFactorEstimate = busFactor;\n    }\n\n    // Calculate closed issue ratio\n    let closedIssueRatio: number | null = null;\n    if (githubIssueStats) {\n      const total = githubIssueStats.openCount + githubIssueStats.closedCount;\n      if (total > 0) {\n        closedIssueRatio = githubIssueStats.closedCount / total;\n      }\n    }\n\n    // Repository age\n    let repositoryAgeDays: number | null = null;\n    if (githubData?.created_at) {\n      repositoryAgeDays = daysBetween(githubData.created_at, new Date().toISOString());\n    }\n\n    return {\n      githubStars: githubData?.stargazers_count ?? null,\n      contributorCount: githubContributors?.length ?? null,\n      activeMaintainers: npmMetadata?.maintainers?.length ?? null,\n      lastCommitDate: githubData?.pushed_at ?? null,\n      releaseFrequencyDays,\n      openIssueCount: githubIssueStats?.openCount ?? null,\n      closedIssueRatio,\n      avgIssueResponseTimeHours: githubIssueStats?.avgResponseTimeHours ?? null,\n      isArchived: githubData?.archived ?? null,\n      repositoryAgeDays,\n      commitFrequencyPerWeek,\n      maintainerCount: npmMetadata?.maintainers?.length ?? null,\n      busFactorEstimate,\n      weeklyDownloads: npmDownloads?.downloads ?? null,\n      recentReleaseCadenceDays,\n    };\n  }\n}\n","/**\n * Type definitions for npm registry API responses.\n */\n\n/** Full npm package metadata (from GET https://registry.npmjs.org/{package}). */\nexport interface NpmPackageMetadata {\n  /** Package name. */\n  name: string;\n\n  /** Description. */\n  description?: string;\n\n  /** Distribution tags (e.g., { latest: '1.2.3' }). */\n  'dist-tags': Record<string, string>;\n\n  /** All published versions. */\n  versions: Record<string, NpmVersionMetadata>;\n\n  /** Maintainers of the package. */\n  maintainers: NpmUser[];\n\n  /** Creation and modification timestamps. */\n  time: Record<string, string>;\n\n  /** Package author. */\n  author?: NpmUser;\n\n  /** Repository URL info. */\n  repository?: {\n    type: string;\n    url: string;\n    directory?: string;\n  };\n\n  /** Package home page. */\n  homepage?: string;\n\n  /** Keywords. */\n  keywords?: string[];\n\n  /** License. */\n  license?: string;\n\n  /** Readme content. */\n  readme?: string;\n\n  /** Bug tracker URL. */\n  bugs?: { url: string };\n\n  /** Users who starred the package. */\n  users?: Record<string, boolean>;\n}\n\n/** Metadata for a specific version of a package. */\nexport interface NpmVersionMetadata {\n  /** Package name. */\n  name: string;\n\n  /** Version string. */\n  version: string;\n\n  /** Description. */\n  description?: string;\n\n  /** Main entry point. */\n  main?: string;\n\n  /** Scripts defined in package.json. */\n  scripts?: Record<string, string>;\n\n  /** Dependencies. */\n  dependencies?: Record<string, string>;\n\n  /** Dev dependencies. */\n  devDependencies?: Record<string, string>;\n\n  /** Peer dependencies. */\n  peerDependencies?: Record<string, string>;\n\n  /** Optional dependencies. */\n  optionalDependencies?: Record<string, string>;\n\n  /** Distribution info. */\n  dist: NpmDistInfo;\n\n  /** Maintainers at the time of publish. */\n  maintainers?: NpmUser[];\n\n  /** npm user who published this version. */\n  _npmUser?: NpmUser;\n\n  /** Whether this version has an npm signature. */\n  _hasShrinkwrap?: boolean;\n\n  /** npm operation user. */\n  _npmOperationalInternal?: {\n    host: string;\n    tmp: string;\n  };\n\n  /** Node.js version used to publish. */\n  _nodeVersion?: string;\n\n  /** npm version used to publish. */\n  _npmVersion?: string;\n\n  /** Repository info. */\n  repository?: {\n    type: string;\n    url: string;\n    directory?: string;\n  };\n\n  /** Engines requirements. */\n  engines?: Record<string, string>;\n\n  /** Deprecated message if any. */\n  deprecated?: string;\n\n  /** Has install scripts flag. */\n  hasInstallScript?: boolean;\n\n  /** License. */\n  license?: string;\n}\n\n/** Distribution info for a package version. */\nexport interface NpmDistInfo {\n  /** Integrity hash (SRI format, e.g., sha512-...). */\n  integrity?: string;\n\n  /** SHA-1 hash (legacy). */\n  shasum: string;\n\n  /** Tarball download URL. */\n  tarball: string;\n\n  /** Number of files in the tarball. */\n  fileCount?: number;\n\n  /** Unpacked size in bytes. */\n  unpackedSize?: number;\n\n  /** npm signatures. */\n  signatures?: Array<{\n    keyid: string;\n    sig: string;\n  }>;\n\n  /** Attestations URL. */\n  attestations?: {\n    url: string;\n    provenance: {\n      predicateType: string;\n    };\n  };\n}\n\n/** npm user object. */\nexport interface NpmUser {\n  name?: string;\n  username?: string;\n  email?: string;\n  url?: string;\n}\n\n/** Download count response from npm API. */\nexport interface NpmDownloads {\n  /** Total downloads in the period. */\n  downloads: number;\n\n  /** Start date of the period. */\n  start: string;\n\n  /** End date of the period. */\n  end: string;\n\n  /** Package name. */\n  package: string;\n}\n\n/** Extract the npm username from an NpmUser. */\nexport function getNpmUsername(user: NpmUser): string {\n  return user.username ?? user.name ?? 'unknown';\n}\n","/**\n * Maintainer change tracker.\n * Compares maintainer lists between versions to detect additions and removals.\n */\n\nimport type { MaintainerChange } from '../../types/analysis.js';\nimport type { NpmPackageMetadata } from '../../providers/npm/types.js';\nimport { getNpmUsername } from '../../providers/npm/types.js';\n\n/**\n * Detect maintainer changes across package versions.\n */\nexport function detectMaintainerChanges(\n  metadata: NpmPackageMetadata,\n): MaintainerChange[] {\n  const changes: MaintainerChange[] = [];\n\n  // Get versions sorted by time\n  const sortedVersions = Object.entries(metadata.time)\n    .filter(([key]) => key !== 'created' && key !== 'modified')\n    .sort((a, b) => new Date(a[1]).getTime() - new Date(b[1]).getTime());\n\n  let previousMaintainers = new Set<string>();\n\n  for (const [version] of sortedVersions) {\n    const versionData = metadata.versions[version];\n    if (!versionData?.maintainers) continue;\n\n    const currentMaintainers = new Set(\n      versionData.maintainers.map(getNpmUsername),\n    );\n\n    // Detect additions\n    for (const maintainer of currentMaintainers) {\n      if (!previousMaintainers.has(maintainer) && previousMaintainers.size > 0) {\n        changes.push({\n          type: 'added',\n          username: maintainer,\n          version,\n          detectedAt: metadata.time[version] ?? '',\n        });\n      }\n    }\n\n    // Detect removals\n    for (const maintainer of previousMaintainers) {\n      if (!currentMaintainers.has(maintainer)) {\n        changes.push({\n          type: 'removed',\n          username: maintainer,\n          version,\n          detectedAt: metadata.time[version] ?? '',\n        });\n      }\n    }\n\n    previousMaintainers = currentMaintainers;\n  }\n\n  return changes;\n}\n","/**\n * Provenance and publisher verification checker.\n */\n\nimport type { NpmPackageMetadata, NpmVersionMetadata } from '../../providers/npm/types.js';\nimport type { PublisherChange } from '../../types/analysis.js';\nimport { getNpmUsername } from '../../providers/npm/types.js';\n\n/**\n * Check if a version has publishing provenance (SLSA/Sigstore attestation).\n */\nexport function hasProvenance(versionData: NpmVersionMetadata): boolean {\n  return versionData.dist.attestations?.provenance !== undefined;\n}\n\n/**\n * Detect publisher changes across versions.\n */\nexport function detectPublisherChanges(\n  metadata: NpmPackageMetadata,\n): PublisherChange[] {\n  const changes: PublisherChange[] = [];\n\n  const sortedVersions = Object.entries(metadata.time)\n    .filter(([key]) => key !== 'created' && key !== 'modified')\n    .sort((a, b) => new Date(a[1]).getTime() - new Date(b[1]).getTime());\n\n  let previousPublisher: string | null = null;\n\n  for (const [version] of sortedVersions) {\n    const versionData = metadata.versions[version];\n    if (!versionData?._npmUser) continue;\n\n    const currentPublisher = getNpmUsername(versionData._npmUser);\n\n    if (previousPublisher !== null && currentPublisher !== previousPublisher) {\n      changes.push({\n        previousPublisher,\n        newPublisher: currentPublisher,\n        version,\n        detectedAt: metadata.time[version] ?? '',\n      });\n    }\n\n    previousPublisher = currentPublisher;\n  }\n\n  return changes;\n}\n\n/**\n * Analyze release timing for anomalies.\n * Flags releases published at unusual times (weekends, odd hours, etc.).\n */\nexport function detectReleaseTimingAnomalies(\n  metadata: NpmPackageMetadata,\n): string[] {\n  const anomalies: string[] = [];\n\n  const sortedVersions = Object.entries(metadata.time)\n    .filter(([key]) => key !== 'created' && key !== 'modified')\n    .sort((a, b) => new Date(b[1]).getTime() - new Date(a[1]).getTime());\n\n  // Check the most recent 10 versions\n  const recentVersions = sortedVersions.slice(0, 10);\n\n  for (const [version, timestamp] of recentVersions) {\n    const date = new Date(timestamp);\n    const hour = date.getUTCHours();\n    const day = date.getUTCDay();\n\n    // Unusual publish time: between midnight and 5am UTC\n    if (hour >= 0 && hour < 5) {\n      anomalies.push(\n        `Version ${version} published at unusual hour (${hour}:00 UTC)`,\n      );\n    }\n\n    // Weekend publish (less common for legitimate packages)\n    if (day === 0 || day === 6) {\n      // This is informational only — many legitimate publishes happen on weekends\n    }\n  }\n\n  // Check for rapid-fire publishes (multiple versions in < 1 hour)\n  for (let i = 0; i < recentVersions.length - 1; i++) {\n    const current = recentVersions[i]!;\n    const next = recentVersions[i + 1]!;\n    const diffMs = new Date(current[1]).getTime() - new Date(next[1]).getTime();\n    const diffMinutes = diffMs / (1000 * 60);\n\n    if (diffMinutes < 60 && diffMinutes >= 0) {\n      anomalies.push(\n        `Versions ${next[0]} and ${current[0]} published within ${Math.round(diffMinutes)} minutes`,\n      );\n    }\n  }\n\n  return anomalies;\n}\n","/**\n * Release and dependency change analyzer.\n */\n\nimport type { NpmPackageMetadata } from '../../providers/npm/types.js';\nimport type { DependencyChange } from '../../types/analysis.js';\n\n/**\n * Detect dependency additions and removals between consecutive versions.\n */\nexport function detectDependencyChanges(\n  metadata: NpmPackageMetadata,\n): { additions: DependencyChange[]; removals: DependencyChange[] } {\n  const additions: DependencyChange[] = [];\n  const removals: DependencyChange[] = [];\n\n  const sortedVersions = Object.entries(metadata.time)\n    .filter(([key]) => key !== 'created' && key !== 'modified')\n    .sort((a, b) => new Date(a[1]).getTime() - new Date(b[1]).getTime());\n\n  let previousDeps = new Map<string, string>();\n\n  for (const [version] of sortedVersions) {\n    const versionData = metadata.versions[version];\n    if (!versionData) continue;\n\n    const currentDeps = new Map<string, string>(\n      Object.entries(versionData.dependencies ?? {}),\n    );\n\n    // Detect additions\n    for (const [dep, depVersion] of currentDeps) {\n      if (!previousDeps.has(dep)) {\n        additions.push({\n          name: dep,\n          type: 'added',\n          version: depVersion,\n          inVersion: version,\n        });\n      }\n    }\n\n    // Detect removals\n    for (const [dep, depVersion] of previousDeps) {\n      if (!currentDeps.has(dep)) {\n        removals.push({\n          name: dep,\n          type: 'removed',\n          version: depVersion,\n          inVersion: version,\n        });\n      }\n    }\n\n    previousDeps = currentDeps;\n  }\n\n  return { additions, removals };\n}\n\n/**\n * Detect significant package size changes between versions.\n * Returns a message if the latest version has a significantly different size.\n */\nexport function detectSizeAnomalies(\n  metadata: NpmPackageMetadata,\n): { currentSize: number | null; previousSize: number | null; changePercent: number | null } {\n  const sortedVersions = Object.entries(metadata.time)\n    .filter(([key]) => key !== 'created' && key !== 'modified')\n    .sort((a, b) => new Date(b[1]).getTime() - new Date(a[1]).getTime());\n\n  if (sortedVersions.length < 2) {\n    return { currentSize: null, previousSize: null, changePercent: null };\n  }\n\n  const latestVersion = sortedVersions[0]![0];\n  const previousVersion = sortedVersions[1]![0];\n\n  const latestData = metadata.versions[latestVersion];\n  const previousData = metadata.versions[previousVersion];\n\n  const currentSize = latestData?.dist?.unpackedSize ?? null;\n  const previousSize = previousData?.dist?.unpackedSize ?? null;\n\n  if (currentSize === null || previousSize === null || previousSize === 0) {\n    return { currentSize, previousSize, changePercent: null };\n  }\n\n  const changePercent = ((currentSize - previousSize) / previousSize) * 100;\n\n  return { currentSize, previousSize, changePercent };\n}\n","/**\n * Supply chain analyzer — evaluates publishing integrity and metadata trust.\n */\n\nimport type { IAnalyzer } from '../interfaces.js';\nimport type { AnalyzerResult, SupplyChainMetrics } from '../../types/analysis.js';\nimport { AnalysisCategory, AnalysisStatus } from '../../types/common.js';\nimport type { AnalysisContext } from '../../core/context.js';\nimport { detectMaintainerChanges } from './maintainer-tracker.js';\nimport { detectPublisherChanges, hasProvenance, detectReleaseTimingAnomalies } from './provenance-checker.js';\nimport { detectDependencyChanges, detectSizeAnomalies } from './release-analyzer.js';\n\nexport class SupplyChainAnalyzer implements IAnalyzer {\n  readonly name = 'supply-chain';\n  readonly description = 'Evaluates supply chain integrity: maintainer changes, publishing provenance, dependency mutations';\n  readonly category = AnalysisCategory.SupplyChain;\n\n  canAnalyze(context: AnalysisContext): boolean {\n    return context.npmMetadata !== undefined;\n  }\n\n  async analyze(context: AnalysisContext): Promise<AnalyzerResult> {\n    const start = Date.now();\n\n    try {\n      if (!context.npmMetadata) {\n        return {\n          analyzer: this.name,\n          category: this.category,\n          status: AnalysisStatus.Skipped,\n          findings: [],\n          durationMs: Date.now() - start,\n          metadata: {},\n        };\n      }\n\n      const metrics = this.collectMetrics(context);\n\n      return {\n        analyzer: this.name,\n        category: this.category,\n        status: AnalysisStatus.Completed,\n        findings: [],\n        durationMs: Date.now() - start,\n        metadata: { metrics },\n      };\n    } catch (error) {\n      return {\n        analyzer: this.name,\n        category: this.category,\n        status: AnalysisStatus.Failed,\n        findings: [],\n        durationMs: Date.now() - start,\n        error: error instanceof Error ? error.message : String(error),\n        metadata: {},\n      };\n    }\n  }\n\n  private collectMetrics(context: AnalysisContext): SupplyChainMetrics {\n    const metadata = context.npmMetadata!;\n    const latestVersion = metadata['dist-tags']['latest'] ?? '';\n    const latestData = metadata.versions[latestVersion];\n\n    // Maintainer and publisher changes\n    const maintainerChanges = detectMaintainerChanges(metadata);\n    const publisherChanges = detectPublisherChanges(metadata);\n\n    // Provenance\n    const latestHasProvenance = latestData ? hasProvenance(latestData) : null;\n\n    // Dependencies\n    const { additions, removals } = detectDependencyChanges(metadata);\n\n    // Size anomalies\n    const sizeData = detectSizeAnomalies(metadata);\n\n    // Release timing anomalies\n    const releaseTimingAnomalies = detectReleaseTimingAnomalies(metadata);\n\n    // Version count\n    const versionCount = Object.keys(metadata.versions).length;\n\n    // Integrity\n    const integrityHash = latestData?.dist?.integrity ?? null;\n\n    return {\n      maintainerChanges,\n      publisherChanges,\n      isPublisherVerified: null, // Requires additional API check\n      hasProvenance: latestHasProvenance,\n      isOidcPublisher: null, // Would require provenance attestation parsing\n      isCliPublish: null, // Would require attestation parsing\n      dependencyAdditions: additions,\n      dependencyRemovals: removals,\n      packageSizeBytes: sizeData.currentSize,\n      previousPackageSizeBytes: sizeData.previousSize,\n      releaseTimingAnomalies,\n      versionCount,\n      ownershipChanges: [],\n      integrityHash,\n    };\n  }\n}\n","/**\n * AST detector: Environment variable access.\n * Detects process.env reads, .env file reads, and dotenv usage.\n */\n\nimport type { IDetector, DetectorContext } from '../../interfaces.js';\n\nexport class EnvAccessDetector implements IDetector {\n  readonly name = 'env-access';\n  readonly description = 'Detects access to environment variables and .env files';\n\n  getVisitors(ctx: DetectorContext): Record<string, (...args: unknown[]) => void> {\n    return {\n      // Detect process.env access\n      MemberExpression(path: { node: { object: { type: string; object?: { name?: string }; name?: string }; property: { name?: string; value?: string } } }) {\n        const node = path.node;\n\n        // process.env\n        if (\n          node.object.type === 'MemberExpression' &&\n          node.object.object?.name === 'process' &&\n          node.object.property?.name === 'env'\n        ) {\n          ctx.report({\n            detector: 'env-access',\n            type: 'process-env-read',\n            severity: 'medium',\n            description: `Reads environment variable: process.env.${node.property.name ?? node.property.value ?? '?'}`,\n            location: (node as unknown as { loc?: { start: { line: number; column: number } } }).loc?.start,\n          });\n        }\n\n        // Direct process.env reference\n        if (\n          node.object.name === 'process' &&\n          node.property.name === 'env'\n        ) {\n          ctx.report({\n            detector: 'env-access',\n            type: 'process-env-access',\n            severity: 'medium',\n            description: 'Accesses process.env object',\n            location: (node as unknown as { loc?: { start: { line: number; column: number } } }).loc?.start,\n          });\n        }\n      },\n\n      // Detect require('dotenv') or import 'dotenv'\n      CallExpression(path: { node: { callee: { name?: string }; arguments: Array<{ value?: string }> } }) {\n        const node = path.node;\n        if (\n          node.callee.name === 'require' &&\n          node.arguments[0]?.value === 'dotenv'\n        ) {\n          ctx.report({\n            detector: 'env-access',\n            type: 'dotenv-usage',\n            severity: 'medium',\n            description: 'Uses dotenv to load .env file',\n            location: (node as unknown as { loc?: { start: { line: number; column: number } } }).loc?.start,\n          });\n        }\n      },\n\n      // Detect fs.readFileSync('.env')\n      StringLiteral(path: { node: { value: string; loc?: { start: { line: number; column: number } } } }) {\n        const value = path.node.value;\n        if (value.includes('.env') && !value.includes('node_modules')) {\n          ctx.report({\n            detector: 'env-access',\n            type: 'env-file-reference',\n            severity: 'medium',\n            description: `References .env file: \"${value}\"`,\n            location: path.node.loc?.start,\n          });\n        }\n      },\n    };\n  }\n}\n","/**\n * AST detector: Filesystem access.\n * Detects reading sensitive files (SSH keys, credentials, configs).\n */\n\nimport type { IDetector, DetectorContext } from '../../interfaces.js';\n\n/** Sensitive file paths that should raise concerns. */\nconst SENSITIVE_PATHS = [\n  '.ssh',\n  'id_rsa',\n  'id_ed25519',\n  'known_hosts',\n  '.npmrc',\n  '.yarnrc',\n  '.gitconfig',\n  '.git-credentials',\n  '.netrc',\n  '.aws/credentials',\n  '.docker/config.json',\n  '.kube/config',\n  '.gnupg',\n  'authorized_keys',\n  '.bash_history',\n  '.zsh_history',\n  'passwd',\n  'shadow',\n  '/etc/hosts',\n];\n\nexport class FilesystemDetector implements IDetector {\n  readonly name = 'filesystem';\n  readonly description = 'Detects filesystem access to sensitive files and directories';\n\n  getVisitors(ctx: DetectorContext): Record<string, (...args: unknown[]) => void> {\n    return {\n      // Detect require('fs') / require('fs/promises')\n      CallExpression(path: { node: { callee: { name?: string }; arguments: Array<{ value?: string }> } }) {\n        const node = path.node;\n        if (\n          node.callee.name === 'require' &&\n          (node.arguments[0]?.value === 'fs' ||\n            node.arguments[0]?.value === 'fs/promises' ||\n            node.arguments[0]?.value === 'node:fs' ||\n            node.arguments[0]?.value === 'node:fs/promises')\n        ) {\n          ctx.report({\n            detector: 'filesystem',\n            type: 'fs-module-import',\n            severity: 'low',\n            description: `Imports filesystem module: ${node.arguments[0].value}`,\n            location: (node as unknown as { loc?: { start: { line: number; column: number } } }).loc?.start,\n          });\n        }\n      },\n\n      // Detect references to sensitive file paths\n      StringLiteral(path: { node: { value: string; loc?: { start: { line: number; column: number } } } }) {\n        const value = path.node.value;\n        for (const sensitivePath of SENSITIVE_PATHS) {\n          if (value.includes(sensitivePath)) {\n            ctx.report({\n              detector: 'filesystem',\n              type: 'sensitive-file-access',\n              severity: 'high',\n              description: `References sensitive path: \"${value}\" (matches: ${sensitivePath})`,\n              location: path.node.loc?.start,\n            });\n            break;\n          }\n        }\n      },\n\n      // Detect homedir resolution (often used to find credential files)\n      MemberExpression(path: { node: { object: { name?: string }; property: { name?: string } } }) {\n        const node = path.node;\n        if (\n          node.object.name === 'os' &&\n          node.property.name === 'homedir'\n        ) {\n          ctx.report({\n            detector: 'filesystem',\n            type: 'homedir-access',\n            severity: 'low',\n            description: 'Resolves user home directory (os.homedir)',\n            location: (node as unknown as { loc?: { start: { line: number; column: number } } }).loc?.start,\n          });\n        }\n      },\n    };\n  }\n}\n","/**\n * AST detector: Network access.\n * Detects outbound HTTP requests, URL construction, and data exfiltration patterns.\n */\n\nimport type { IDetector, DetectorContext } from '../../interfaces.js';\n\n/** Known data exfiltration patterns. */\nconst SUSPICIOUS_DOMAINS = [\n  'ngrok.io',\n  'requestbin.com',\n  'pipedream.com',\n  'webhook.site',\n  'burpcollaborator.net',\n  'interact.sh',\n  'oastify.com',\n  'canarytokens.com',\n];\n\nexport class NetworkDetector implements IDetector {\n  readonly name = 'network';\n  readonly description = 'Detects outbound network requests and suspicious URL patterns';\n\n  getVisitors(ctx: DetectorContext): Record<string, (...args: unknown[]) => void> {\n    return {\n      CallExpression(path: { node: { callee: { name?: string; object?: { name?: string }; property?: { name?: string } }; arguments: Array<{ value?: string }> } }) {\n        const node = path.node;\n        const callee = node.callee;\n\n        // require('http') / require('https') / require('node-fetch') / require('axios')\n        if (\n          callee.name === 'require' &&\n          ['http', 'https', 'http2', 'node:http', 'node:https', 'node-fetch', 'axios', 'got', 'undici'].includes(\n            node.arguments[0]?.value ?? '',\n          )\n        ) {\n          ctx.report({\n            detector: 'network',\n            type: 'network-module-import',\n            severity: 'medium',\n            description: `Imports network module: ${node.arguments[0]?.value}`,\n            location: (node as unknown as { loc?: { start: { line: number; column: number } } }).loc?.start,\n          });\n        }\n\n        // fetch() call\n        if (callee.name === 'fetch') {\n          ctx.report({\n            detector: 'network',\n            type: 'fetch-call',\n            severity: 'medium',\n            description: 'Makes outbound HTTP request using fetch()',\n            location: (node as unknown as { loc?: { start: { line: number; column: number } } }).loc?.start,\n          });\n        }\n\n        // XMLHttpRequest, http.request, https.request\n        if (\n          callee.property?.name === 'request' &&\n          ['http', 'https'].includes(callee.object?.name ?? '')\n        ) {\n          ctx.report({\n            detector: 'network',\n            type: 'http-request',\n            severity: 'medium',\n            description: `Makes HTTP request via ${callee.object?.name}.request()`,\n            location: (node as unknown as { loc?: { start: { line: number; column: number } } }).loc?.start,\n          });\n        }\n\n        // http.get, https.get\n        if (\n          callee.property?.name === 'get' &&\n          ['http', 'https'].includes(callee.object?.name ?? '')\n        ) {\n          ctx.report({\n            detector: 'network',\n            type: 'http-get',\n            severity: 'medium',\n            description: `Makes HTTP GET via ${callee.object?.name}.get()`,\n            location: (node as unknown as { loc?: { start: { line: number; column: number } } }).loc?.start,\n          });\n        }\n      },\n\n      // Detect URLs as string literals\n      StringLiteral(path: { node: { value: string; loc?: { start: { line: number; column: number } } } }) {\n        const value = path.node.value;\n\n        // HTTP/HTTPS URL detection\n        if (/^https?:\\/\\//i.test(value)) {\n          let severity: 'low' | 'medium' | 'high' | 'critical' = 'low';\n          let description = `Contains URL: ${value}`;\n\n          // Check for suspicious domains\n          for (const domain of SUSPICIOUS_DOMAINS) {\n            if (value.includes(domain)) {\n              severity = 'critical';\n              description = `Contains suspicious exfiltration URL: ${value}`;\n              break;\n            }\n          }\n\n          // IP address URLs are suspicious\n          if (/https?:\\/\\/\\d+\\.\\d+\\.\\d+\\.\\d+/.test(value)) {\n            severity = 'high';\n            description = `Contains IP-based URL (potential exfiltration): ${value}`;\n          }\n\n          ctx.report({\n            detector: 'network',\n            type: 'url-literal',\n            severity,\n            description,\n            location: path.node.loc?.start,\n          });\n        }\n      },\n\n      // Detect DNS lookups\n      MemberExpression(path: { node: { object: { name?: string }; property: { name?: string } } }) {\n        const node = path.node;\n        if (\n          node.object.name === 'dns' &&\n          ['resolve', 'lookup', 'resolve4', 'resolveMx'].includes(node.property.name ?? '')\n        ) {\n          ctx.report({\n            detector: 'network',\n            type: 'dns-lookup',\n            severity: 'medium',\n            description: `Performs DNS lookup via dns.${node.property.name}()`,\n            location: (node as unknown as { loc?: { start: { line: number; column: number } } }).loc?.start,\n          });\n        }\n      },\n    };\n  }\n}\n","/**\n * AST detector: Credential access.\n * Detects access to SSH keys, npm tokens, git credentials, and browser storage.\n */\n\nimport type { IDetector, DetectorContext } from '../../interfaces.js';\n\n/** Patterns that indicate credential access. */\nconst CREDENTIAL_PATTERNS = [\n  { pattern: 'NPM_TOKEN', type: 'npm-token', severity: 'critical' as const },\n  { pattern: 'npm_token', type: 'npm-token', severity: 'critical' as const },\n  { pattern: 'NODE_AUTH_TOKEN', type: 'npm-token', severity: 'critical' as const },\n  { pattern: 'GITHUB_TOKEN', type: 'github-token', severity: 'critical' as const },\n  { pattern: 'GH_TOKEN', type: 'github-token', severity: 'critical' as const },\n  { pattern: 'AWS_ACCESS_KEY', type: 'aws-key', severity: 'critical' as const },\n  { pattern: 'AWS_SECRET_ACCESS_KEY', type: 'aws-secret', severity: 'critical' as const },\n  { pattern: 'DOCKER_PASSWORD', type: 'docker-cred', severity: 'critical' as const },\n  { pattern: 'SLACK_TOKEN', type: 'slack-token', severity: 'high' as const },\n  { pattern: 'DISCORD_TOKEN', type: 'discord-token', severity: 'high' as const },\n  { pattern: 'API_KEY', type: 'api-key', severity: 'high' as const },\n  { pattern: 'api_key', type: 'api-key', severity: 'high' as const },\n  { pattern: 'SECRET_KEY', type: 'secret-key', severity: 'high' as const },\n  { pattern: 'PRIVATE_KEY', type: 'private-key', severity: 'high' as const },\n  { pattern: 'PASSWORD', type: 'password', severity: 'high' as const },\n  { pattern: 'REGISTRY_TOKEN', type: 'registry-token', severity: 'critical' as const },\n];\n\nexport class CredentialDetector implements IDetector {\n  readonly name = 'credential';\n  readonly description = 'Detects access to SSH keys, API tokens, npm credentials, and secrets';\n\n  getVisitors(ctx: DetectorContext): Record<string, (...args: unknown[]) => void> {\n    return {\n      // Detect credential-like environment variable names\n      MemberExpression(path: { node: { object: { type: string; object?: { name?: string }; property?: { name?: string } }; property: { name?: string; value?: string } } }) {\n        const node = path.node;\n\n        // process.env.NPM_TOKEN etc.\n        if (\n          node.object.type === 'MemberExpression' &&\n          node.object.object?.name === 'process' &&\n          node.object.property?.name === 'env'\n        ) {\n          const envVar = node.property.name ?? node.property.value ?? '';\n          for (const cred of CREDENTIAL_PATTERNS) {\n            if (envVar.includes(cred.pattern)) {\n              ctx.report({\n                detector: 'credential',\n                type: cred.type,\n                severity: cred.severity,\n                description: `Reads credential from environment: process.env.${envVar}`,\n                location: (node as unknown as { loc?: { start: { line: number; column: number } } }).loc?.start,\n              });\n              break;\n            }\n          }\n        }\n      },\n\n      // Detect SSH key and credential file references\n      StringLiteral(path: { node: { value: string; loc?: { start: { line: number; column: number } } } }) {\n        const value = path.node.value;\n\n        // SSH key files\n        if (\n          value.includes('id_rsa') ||\n          value.includes('id_ed25519') ||\n          value.includes('id_ecdsa') ||\n          value.includes('.ssh/') ||\n          value.includes('authorized_keys')\n        ) {\n          ctx.report({\n            detector: 'credential',\n            type: 'ssh-key-access',\n            severity: 'critical',\n            description: `References SSH key file: \"${value}\"`,\n            location: path.node.loc?.start,\n          });\n        }\n\n        // npm credentials\n        if (value.includes('.npmrc') || value.includes('npm-token')) {\n          ctx.report({\n            detector: 'credential',\n            type: 'npmrc-access',\n            severity: 'critical',\n            description: `References npm credential file: \"${value}\"`,\n            location: path.node.loc?.start,\n          });\n        }\n\n        // Git credentials\n        if (value.includes('.git-credentials') || value.includes('.gitconfig')) {\n          ctx.report({\n            detector: 'credential',\n            type: 'git-credential-access',\n            severity: 'high',\n            description: `References git credential file: \"${value}\"`,\n            location: path.node.loc?.start,\n          });\n        }\n\n        // Browser storage paths\n        if (\n          value.includes('Chrome') && (value.includes('Login Data') || value.includes('Cookies')) ||\n          value.includes('Firefox') && value.includes('logins.json')\n        ) {\n          ctx.report({\n            detector: 'credential',\n            type: 'browser-credential-access',\n            severity: 'critical',\n            description: `References browser credential storage: \"${value}\"`,\n            location: path.node.loc?.start,\n          });\n        }\n      },\n    };\n  }\n}\n","/**\n * AST detector: Shell/process execution.\n * Detects child_process usage, shell commands, and system utilities.\n */\n\nimport type { IDetector, DetectorContext } from '../../interfaces.js';\n\n/** Dangerous shell commands that may indicate malicious behavior. */\nconst DANGEROUS_COMMANDS = [\n  'curl',\n  'wget',\n  'powershell',\n  'certutil',\n  'bitsadmin',\n  'cmd.exe',\n  'bash -c',\n  '/bin/sh',\n  '/bin/bash',\n  'cmd /c',\n  'Start-Process',\n  'Invoke-WebRequest',\n  'Invoke-Expression',\n  'IEX',\n  'nslookup',\n  'whoami',\n  'hostname',\n  'ifconfig',\n  'ipconfig',\n];\n\nexport class ExecDetector implements IDetector {\n  readonly name = 'exec';\n  readonly description = 'Detects child_process usage, shell execution, and dangerous system commands';\n\n  getVisitors(ctx: DetectorContext): Record<string, (...args: unknown[]) => void> {\n    return {\n      CallExpression(path: { node: { callee: { name?: string; object?: { name?: string }; property?: { name?: string } }; arguments: Array<{ value?: string }> } }) {\n        const node = path.node;\n        const callee = node.callee;\n\n        // require('child_process')\n        if (\n          callee.name === 'require' &&\n          (node.arguments[0]?.value === 'child_process' ||\n            node.arguments[0]?.value === 'node:child_process')\n        ) {\n          ctx.report({\n            detector: 'exec',\n            type: 'child-process-import',\n            severity: 'high',\n            description: `Imports child_process module`,\n            location: (node as unknown as { loc?: { start: { line: number; column: number } } }).loc?.start,\n          });\n        }\n\n        // exec(), execSync(), spawn(), spawnSync(), execFile()\n        const execMethods = ['exec', 'execSync', 'spawn', 'spawnSync', 'execFile', 'execFileSync', 'fork'];\n        if (\n          callee.property?.name &&\n          execMethods.includes(callee.property.name)\n        ) {\n          const command = node.arguments[0]?.value ?? '<dynamic>';\n          const severity = isDangerousCommand(command) ? 'critical' : 'high';\n\n          ctx.report({\n            detector: 'exec',\n            type: 'process-execution',\n            severity,\n            description: `Executes shell command via ${callee.property.name}(): \"${command}\"`,\n            location: (node as unknown as { loc?: { start: { line: number; column: number } } }).loc?.start,\n          });\n        }\n\n        // Direct exec/execSync calls (destructured)\n        if (\n          callee.name &&\n          execMethods.includes(callee.name)\n        ) {\n          const command = node.arguments[0]?.value ?? '<dynamic>';\n          const severity = isDangerousCommand(command) ? 'critical' : 'high';\n\n          ctx.report({\n            detector: 'exec',\n            type: 'process-execution',\n            severity,\n            description: `Executes shell command via ${callee.name}(): \"${command}\"`,\n            location: (node as unknown as { loc?: { start: { line: number; column: number } } }).loc?.start,\n          });\n        }\n      },\n\n      // Detect dangerous shell command strings\n      StringLiteral(path: { node: { value: string; loc?: { start: { line: number; column: number } } } }) {\n        const value = path.node.value;\n        for (const cmd of DANGEROUS_COMMANDS) {\n          if (value.includes(cmd)) {\n            ctx.report({\n              detector: 'exec',\n              type: 'dangerous-command-string',\n              severity: 'high',\n              description: `Contains dangerous command reference: \"${cmd}\" in \"${value}\"`,\n              location: path.node.loc?.start,\n            });\n            break;\n          }\n        }\n      },\n    };\n  }\n}\n\n/** Check if a command string contains dangerous patterns. */\nfunction isDangerousCommand(command: string): boolean {\n  return DANGEROUS_COMMANDS.some((cmd) => command.includes(cmd));\n}\n","/**\n * AST detector: Code obfuscation.\n * Detects eval(), Function constructor, obfuscated code patterns, and high entropy strings.\n */\n\nimport type { IDetector, DetectorContext } from '../../interfaces.js';\n\nexport class ObfuscationDetector implements IDetector {\n  readonly name = 'obfuscation';\n  readonly description = 'Detects eval(), dynamic code execution, obfuscated code, and high-entropy strings';\n\n  getVisitors(ctx: DetectorContext): Record<string, (...args: unknown[]) => void> {\n    return {\n      CallExpression(path: { node: { callee: { name?: string; type?: string; property?: { name?: string } }; arguments: Array<{ value?: string; type?: string }> } }) {\n        const node = path.node;\n        const callee = node.callee;\n\n        // eval()\n        if (callee.name === 'eval') {\n          ctx.report({\n            detector: 'obfuscation',\n            type: 'eval-usage',\n            severity: 'critical',\n            description: 'Uses eval() for dynamic code execution',\n            location: (node as unknown as { loc?: { start: { line: number; column: number } } }).loc?.start,\n          });\n        }\n\n        // Function constructor called without new\n        if (callee.name === 'Function' && callee.type === 'Identifier') {\n          ctx.report({\n            detector: 'obfuscation',\n            type: 'function-constructor',\n            severity: 'critical',\n            description: 'Uses Function constructor for dynamic code execution',\n            location: (node as unknown as { loc?: { start: { line: number; column: number } } }).loc?.start,\n          });\n        }\n\n        // setTimeout/setInterval with string argument (dynamic eval)\n        if (\n          (callee.name === 'setTimeout' || callee.name === 'setInterval') &&\n          node.arguments[0]?.type === 'StringLiteral'\n        ) {\n          ctx.report({\n            detector: 'obfuscation',\n            type: 'timer-eval',\n            severity: 'high',\n            description: `Uses ${callee.name}() with string argument (implicit eval)`,\n            location: (node as unknown as { loc?: { start: { line: number; column: number } } }).loc?.start,\n          });\n        }\n\n        // Buffer.from + toString for encoding\n        if (\n          callee.property?.name === 'from' &&\n          callee.type === 'MemberExpression'\n        ) {\n          // Check if it's Buffer.from('base64string', 'base64')\n          if (\n            node.arguments[1]?.value === 'base64' ||\n            node.arguments[1]?.value === 'hex'\n          ) {\n            ctx.report({\n              detector: 'obfuscation',\n              type: 'encoded-data',\n              severity: 'medium',\n              description: `Decodes ${node.arguments[1].value}-encoded data`,\n              location: (node as unknown as { loc?: { start: { line: number; column: number } } }).loc?.start,\n            });\n          }\n        }\n\n        // atob / btoa\n        if (callee.name === 'atob' || callee.name === 'btoa') {\n          ctx.report({\n            detector: 'obfuscation',\n            type: 'base64-encoding',\n            severity: 'low',\n            description: `Uses ${callee.name}() for base64 encoding/decoding`,\n            location: (node as unknown as { loc?: { start: { line: number; column: number } } }).loc?.start,\n          });\n        }\n      },\n\n      NewExpression(path: { node: { callee: { name?: string; type?: string }; loc?: { start: { line: number; column: number } } } }) {\n        const node = path.node;\n        const callee = node.callee;\n        if (callee.name === 'Function' && callee.type === 'Identifier') {\n          ctx.report({\n            detector: 'obfuscation',\n            type: 'function-constructor',\n            severity: 'critical',\n            description: 'Uses Function constructor for dynamic code execution',\n            location: node.loc?.start,\n          });\n        }\n      },\n\n      // Detect high-entropy strings (potential obfuscated payloads)\n      StringLiteral(path: { node: { value: string; loc?: { start: { line: number; column: number } } } }) {\n        const value = path.node.value;\n\n        // Skip short strings and common patterns\n        if (value.length < 50) return;\n\n        // Check for hex-encoded strings\n        if (/^[0-9a-fA-F]+$/.test(value) && value.length > 64) {\n          ctx.report({\n            detector: 'obfuscation',\n            type: 'hex-encoded-string',\n            severity: 'medium',\n            description: `Contains long hex-encoded string (${value.length} chars)`,\n            location: path.node.loc?.start,\n          });\n          return;\n        }\n\n        // Check for base64-encoded strings\n        if (/^[A-Za-z0-9+/=]+$/.test(value) && value.length > 100) {\n          ctx.report({\n            detector: 'obfuscation',\n            type: 'base64-string',\n            severity: 'medium',\n            description: `Contains long base64-like string (${value.length} chars)`,\n            location: path.node.loc?.start,\n          });\n          return;\n        }\n\n        // Shannon entropy check for obfuscated code\n        const entropy = calculateEntropy(value);\n        if (entropy > 5.5 && value.length > 100) {\n          ctx.report({\n            detector: 'obfuscation',\n            type: 'high-entropy-string',\n            severity: 'medium',\n            description: `Contains high-entropy string (entropy: ${entropy.toFixed(2)}, length: ${value.length})`,\n            location: path.node.loc?.start,\n          });\n        }\n      },\n\n      // Detect computed property access chains (typical in obfuscation)\n      MemberExpression(path: { node: { computed: boolean; property: { type?: string } } }) {\n        // Track heavily computed access for heuristic scoring\n        if (path.node.computed && path.node.property.type === 'StringLiteral') {\n          // obj[\"property\"] — common in obfuscated code\n          // Low severity on its own, but contributes to combination scoring\n        }\n      },\n    };\n  }\n}\n\n/**\n * Calculate Shannon entropy of a string.\n * Higher entropy = more randomness = potentially obfuscated.\n */\nfunction calculateEntropy(str: string): number {\n  const freq = new Map<string, number>();\n  for (const char of str) {\n    freq.set(char, (freq.get(char) ?? 0) + 1);\n  }\n\n  let entropy = 0;\n  for (const count of freq.values()) {\n    const p = count / str.length;\n    entropy -= p * Math.log2(p);\n  }\n\n  return entropy;\n}\n","/**\n * Detector registry — central registration of all AST detectors.\n */\n\nimport type { IDetector } from '../../interfaces.js';\nimport { EnvAccessDetector } from './env-access.js';\nimport { FilesystemDetector } from './filesystem.js';\nimport { NetworkDetector } from './network.js';\nimport { CredentialDetector } from './credential.js';\nimport { ExecDetector } from './exec.js';\nimport { ObfuscationDetector } from './obfuscation.js';\n\n/**\n * Get all built-in AST detectors.\n */\nexport function getBuiltInDetectors(): IDetector[] {\n  return [\n    new EnvAccessDetector(),\n    new FilesystemDetector(),\n    new NetworkDetector(),\n    new CredentialDetector(),\n    new ExecDetector(),\n    new ObfuscationDetector(),\n  ];\n}\n\n/**\n * Get a detector by name.\n */\nexport function getDetectorByName(\n  name: string,\n  detectors: IDetector[] = getBuiltInDetectors(),\n): IDetector | undefined {\n  return detectors.find((d) => d.name === name);\n}\n","/**\n * AST engine — parses JavaScript/TypeScript code and runs detectors.\n * Uses @babel/parser and @babel/traverse for proper AST analysis.\n */\n\nimport { parse } from '@babel/parser';\nimport traverse from '@babel/traverse';\nimport type { IDetector, DetectorFinding } from '../interfaces.js';\nimport type { ScriptDetection } from '../../types/analysis.js';\nimport { Severity } from '../../types/common.js';\nimport { getBuiltInDetectors } from './detectors/index.js';\n\n/** Options for the AST engine. */\nexport interface AstEngineOptions {\n  /** Custom detectors to use instead of (or in addition to) built-in ones. */\n  detectors?: IDetector[];\n\n  /** Whether to include built-in detectors. Default: true. */\n  includeBuiltIn?: boolean;\n}\n\n/**\n * Parse and analyze JavaScript code using AST traversal.\n */\nexport function analyzeCode(\n  code: string,\n  filePath: string,\n  options: AstEngineOptions = {},\n): ScriptDetection[] {\n  const { detectors: customDetectors = [], includeBuiltIn = true } = options;\n\n  const detectors = [\n    ...(includeBuiltIn ? getBuiltInDetectors() : []),\n    ...customDetectors,\n  ];\n\n  // Parse the code into an AST\n  let ast;\n  try {\n    ast = parse(code, {\n      sourceType: 'unambiguous',\n      allowImportExportEverywhere: true,\n      allowAwaitOutsideFunction: true,\n      allowReturnOutsideFunction: true,\n      allowSuperOutsideMethod: true,\n      allowUndeclaredExports: true,\n      plugins: [\n        'typescript',\n        'jsx',\n        'decorators-legacy',\n        'classProperties',\n        'classPrivateProperties',\n        'classPrivateMethods',\n        'dynamicImport',\n        'optionalChaining',\n        'nullishCoalescingOperator',\n        'topLevelAwait',\n      ],\n    });\n  } catch {\n    // If parsing fails, return a single detection noting the parse failure\n    return [\n      {\n        detector: 'ast-engine',\n        type: 'parse-failure',\n        severity: Severity.Info,\n        description: `Failed to parse ${filePath} — may contain syntax errors or unsupported syntax`,\n        location: { file: filePath, line: 0, column: 0 },\n      },\n    ];\n  }\n\n  // Collect findings from all detectors\n  const findings: DetectorFinding[] = [];\n\n  // Build combined visitors from all detectors\n  const visitors: Record<string, Array<(...args: unknown[]) => void>> = {};\n\n  for (const detector of detectors) {\n    const detectorVisitors = detector.getVisitors({\n      filePath,\n      report: (finding) => findings.push(finding),\n    });\n\n    for (const [nodeType, handler] of Object.entries(detectorVisitors)) {\n      if (!visitors[nodeType]) {\n        visitors[nodeType] = [];\n      }\n      visitors[nodeType].push(handler);\n    }\n  }\n\n  // Create merged visitors for traverse\n  const mergedVisitors: Record<string, (...args: unknown[]) => void> = {};\n  for (const [nodeType, handlers] of Object.entries(visitors)) {\n    mergedVisitors[nodeType] = (...args: unknown[]) => {\n      for (const handler of handlers) {\n        try {\n          handler(...args);\n        } catch {\n          // Don't let one detector crash others\n        }\n      }\n    };\n  }\n\n  // Traverse the AST\n  try {\n    // @babel/traverse has a default export issue with ESM\n    const traverseFn = (traverse as unknown as { default?: typeof traverse }).default ?? traverse;\n    traverseFn(ast, mergedVisitors);\n  } catch {\n    // AST traversal failure — non-fatal\n  }\n\n  // Convert findings to ScriptDetection format\n  return findings.map((f) => ({\n    detector: f.detector,\n    type: f.type,\n    severity: f.severity as Severity,\n    description: f.description,\n    location: f.location\n      ? { file: filePath, line: f.location.line, column: f.location.column }\n      : undefined,\n    codeSnippet: f.codeSnippet,\n  }));\n}\n","/**\n * Install script analyzer — orchestrates AST analysis of install scripts.\n * Identifies dangerous patterns and suspicious combinations.\n */\n\nimport type { IAnalyzer } from '../interfaces.js';\nimport type { AnalyzerResult, ScriptAnalysisResult, SuspiciousCombination } from '../../types/analysis.js';\nimport { AnalysisCategory, AnalysisStatus, Severity, INSTALL_SCRIPT_HOOKS } from '../../types/common.js';\nimport type { AnalysisContext } from '../../core/context.js';\nimport { analyzeCode } from './ast-engine.js';\n\n/** Combination rules: pairs of detection types that together indicate high risk. */\nconst COMBINATION_RULES: Array<{\n  detections: string[];\n  severity: Severity;\n  reason: string;\n}> = [\n  {\n    detections: ['process-env-read', 'http-request'],\n    severity: Severity.Critical,\n    reason: 'Reads environment variables and makes HTTP requests — potential secret exfiltration',\n  },\n  {\n    detections: ['process-env-read', 'fetch-call'],\n    severity: Severity.Critical,\n    reason: 'Reads environment variables and uses fetch() — potential secret exfiltration',\n  },\n  {\n    detections: ['process-env-access', 'network-module-import'],\n    severity: Severity.Critical,\n    reason: 'Accesses process.env and imports network module — potential exfiltration vector',\n  },\n  {\n    detections: ['sensitive-file-access', 'network-module-import'],\n    severity: Severity.Critical,\n    reason: 'Reads sensitive files and has network access — data theft risk',\n  },\n  {\n    detections: ['sensitive-file-access', 'fetch-call'],\n    severity: Severity.Critical,\n    reason: 'Reads sensitive files and makes fetch requests — data theft risk',\n  },\n  {\n    detections: ['ssh-key-access', 'network-module-import'],\n    severity: Severity.Critical,\n    reason: 'Reads SSH keys and has network access — SSH key exfiltration',\n  },\n  {\n    detections: ['ssh-key-access', 'fetch-call'],\n    severity: Severity.Critical,\n    reason: 'Reads SSH keys and makes fetch requests — SSH key exfiltration',\n  },\n  {\n    detections: ['npmrc-access', 'network-module-import'],\n    severity: Severity.Critical,\n    reason: 'Reads .npmrc and has network access — npm token theft',\n  },\n  {\n    detections: ['child-process-import', 'url-literal'],\n    severity: Severity.High,\n    reason: 'Uses child_process with URL references — may download and execute code',\n  },\n  {\n    detections: ['process-execution', 'dangerous-command-string'],\n    severity: Severity.High,\n    reason: 'Executes shell commands containing dangerous utilities',\n  },\n  {\n    detections: ['eval-usage', 'network-module-import'],\n    severity: Severity.Critical,\n    reason: 'Uses eval() with network access — remote code execution risk',\n  },\n  {\n    detections: ['eval-usage', 'encoded-data'],\n    severity: Severity.Critical,\n    reason: 'Uses eval() with encoded data — obfuscated code execution',\n  },\n  {\n    detections: ['function-constructor', 'encoded-data'],\n    severity: Severity.Critical,\n    reason: 'Uses Function() constructor with encoded data — obfuscated code execution',\n  },\n  {\n    detections: ['homedir-access', 'sensitive-file-access'],\n    severity: Severity.High,\n    reason: 'Resolves home directory and accesses sensitive files — targeted credential theft',\n  },\n];\n\nexport class ScriptAnalyzer implements IAnalyzer {\n  readonly name = 'install-scripts';\n  readonly description = 'Analyzes install scripts using AST parsing to detect dangerous patterns';\n  readonly category = AnalysisCategory.InstallScripts;\n\n  canAnalyze(context: AnalysisContext): boolean {\n    return context.npmMetadata !== undefined;\n  }\n\n  async analyze(context: AnalysisContext): Promise<AnalyzerResult> {\n    const start = Date.now();\n\n    try {\n      if (!context.npmMetadata) {\n        return {\n          analyzer: this.name,\n          category: this.category,\n          status: AnalysisStatus.Skipped,\n          findings: [],\n          durationMs: Date.now() - start,\n          metadata: {},\n        };\n      }\n\n      const latestVersion = context.npmMetadata['dist-tags']['latest'] ?? '';\n      const versionData = context.npmMetadata.versions[latestVersion];\n\n      if (!versionData?.scripts) {\n        return {\n          analyzer: this.name,\n          category: this.category,\n          status: AnalysisStatus.Completed,\n          findings: [],\n          durationMs: Date.now() - start,\n          metadata: { hasInstallScripts: false },\n        };\n      }\n\n      const results: ScriptAnalysisResult[] = [];\n\n      for (const hook of INSTALL_SCRIPT_HOOKS) {\n        const script = versionData.scripts[hook];\n        if (!script) continue;\n\n        // Analyze the script command itself as code\n        const detections = analyzeCode(\n          // Wrap shell commands in a template to make them parseable\n          wrapScriptForParsing(script),\n          `${hook}-script`,\n        );\n\n        // Check for suspicious combinations\n        const detectionTypes = detections.map((d) => d.type);\n        const suspiciousCombinations = findSuspiciousCombinations(detectionTypes);\n\n        results.push({\n          hook,\n          command: script,\n          files: [],\n          detections,\n          suspiciousCombinations,\n        });\n      }\n\n      return {\n        analyzer: this.name,\n        category: this.category,\n        status: AnalysisStatus.Completed,\n        findings: [],\n        durationMs: Date.now() - start,\n        metadata: {\n          hasInstallScripts: results.length > 0,\n          scriptResults: results,\n        },\n      };\n    } catch (error) {\n      return {\n        analyzer: this.name,\n        category: this.category,\n        status: AnalysisStatus.Failed,\n        findings: [],\n        durationMs: Date.now() - start,\n        error: error instanceof Error ? error.message : String(error),\n        metadata: {},\n      };\n    }\n  }\n}\n\n/**\n * Wrap a shell script command for AST parsing.\n * If the script references a JS file (e.g., \"node scripts/install.js\"),\n * we can analyze that file. For inline commands, we wrap them.\n */\nfunction wrapScriptForParsing(script: string): string {\n  // If it's a node command with inline script (-e or --eval), extract the JavaScript\n  const evalMatch = script.match(/(?:node|node\\.exe)\\s+(?:-e|--eval)\\s+[\"']([\\s\\S]+?)[\"']\\s*$/);\n  if (evalMatch && evalMatch[1]) {\n    return evalMatch[1];\n  }\n\n  // If it's a node command running a file, mark that file for analysis\n  if (/^node\\s+/.test(script)) {\n    // Extract the file path for later analysis\n    return `require('child_process').execSync(${JSON.stringify(script)})`;\n  }\n\n  // For shell commands, wrap as a string being passed to exec\n  return `require('child_process').execSync(${JSON.stringify(script)})`;\n}\n\n/**\n * Find suspicious combinations of detection types.\n */\nfunction findSuspiciousCombinations(\n  detectionTypes: string[],\n): SuspiciousCombination[] {\n  const combinations: SuspiciousCombination[] = [];\n  const typeSet = new Set(detectionTypes);\n\n  for (const rule of COMBINATION_RULES) {\n    const allPresent = rule.detections.every((d) => typeSet.has(d));\n    if (allPresent) {\n      combinations.push({\n        detections: rule.detections,\n        severity: rule.severity,\n        reason: rule.reason,\n      });\n    }\n  }\n\n  return combinations;\n}\n","/**\n * Levenshtein distance implementation.\n * Used for typosquatting detection.\n */\n\n/**\n * Calculate the Levenshtein distance between two strings.\n * O(m*n) dynamic programming implementation.\n */\nexport function levenshteinDistance(a: string, b: string): number {\n  const m = a.length;\n  const n = b.length;\n\n  // Optimize for empty strings\n  if (m === 0) return n;\n  if (n === 0) return m;\n\n  // Use single-row optimization for space efficiency\n  let previousRow = new Array<number>(n + 1);\n  let currentRow = new Array<number>(n + 1);\n\n  // Initialize first row\n  for (let j = 0; j <= n; j++) {\n    previousRow[j] = j;\n  }\n\n  for (let i = 1; i <= m; i++) {\n    currentRow[0] = i;\n\n    for (let j = 1; j <= n; j++) {\n      const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n      currentRow[j] = Math.min(\n        (currentRow[j - 1] ?? 0) + 1,      // Insertion\n        (previousRow[j] ?? 0) + 1,          // Deletion\n        (previousRow[j - 1] ?? 0) + cost,   // Substitution\n      );\n    }\n\n    // Swap rows\n    [previousRow, currentRow] = [currentRow, previousRow];\n  }\n\n  return previousRow[n] ?? 0;\n}\n\n/**\n * Calculate normalized similarity between two strings (0–1).\n * 1.0 = identical, 0.0 = completely different.\n */\nexport function normalizedSimilarity(a: string, b: string): number {\n  const maxLen = Math.max(a.length, b.length);\n  if (maxLen === 0) return 1.0;\n  return 1.0 - levenshteinDistance(a, b) / maxLen;\n}\n\n/**\n * Check common typosquatting patterns between two package names.\n */\nexport function detectTyposquatPatterns(\n  suspectName: string,\n  legitimateName: string,\n): TyposquatMatch[] {\n  const matches: TyposquatMatch[] = [];\n\n  // Character substitution (e.g., 'lodash' vs 'l0dash')\n  if (hasCharacterSubstitution(suspectName, legitimateName)) {\n    matches.push({\n      type: 'character-substitution',\n      description: `\"${suspectName}\" has character substitution compared to \"${legitimateName}\"`,\n      confidence: 85,\n    });\n  }\n\n  // Hyphen/underscore confusion (e.g., 'my-package' vs 'my_package')\n  if (hasSeparatorConfusion(suspectName, legitimateName)) {\n    matches.push({\n      type: 'separator-confusion',\n      description: `\"${suspectName}\" differs only in separators from \"${legitimateName}\"`,\n      confidence: 90,\n    });\n  }\n\n  // Missing/extra character (e.g., 'expres' vs 'express')\n  const distance = levenshteinDistance(suspectName, legitimateName);\n  if (distance === 1) {\n    matches.push({\n      type: 'single-char-edit',\n      description: `\"${suspectName}\" is 1 character edit away from \"${legitimateName}\"`,\n      confidence: 92,\n    });\n  }\n\n  // Scope squatting (e.g., '@scope/name' where 'name' exists unscoped)\n  const unscoped = suspectName.replace(/^@[^/]+\\//, '');\n  if (unscoped !== suspectName && unscoped === legitimateName) {\n    matches.push({\n      type: 'scope-squatting',\n      description: `\"${suspectName}\" adds a scope to legitimate package \"${legitimateName}\"`,\n      confidence: 70,\n    });\n  }\n\n  // Version in name (e.g., 'lodash2' when 'lodash' exists)\n  if (/\\d+$/.test(suspectName)) {\n    const withoutDigits = suspectName.replace(/\\d+$/, '');\n    if (withoutDigits === legitimateName) {\n      matches.push({\n        type: 'version-in-name',\n        description: `\"${suspectName}\" appends digits to \"${legitimateName}\"`,\n        confidence: 75,\n      });\n    }\n  }\n\n  return matches;\n}\n\n/** A detected typosquatting pattern match. */\nexport interface TyposquatMatch {\n  type: string;\n  description: string;\n  confidence: number;\n}\n\n/** Check for lookalike character substitutions (0/o, 1/l, etc.). */\nfunction hasCharacterSubstitution(a: string, b: string): boolean {\n  if (a.length !== b.length) return false;\n\n  const substitutions: Record<string, string[]> = {\n    '0': ['o', 'O'],\n    'o': ['0'],\n    'O': ['0'],\n    '1': ['l', 'I', 'i'],\n    'l': ['1', 'I'],\n    'I': ['1', 'l'],\n    'i': ['1'],\n    'rn': ['m'],\n    'm': ['rn'],\n  };\n\n  let differences = 0;\n  for (let i = 0; i < a.length; i++) {\n    if (a[i] !== b[i]) {\n      differences++;\n      const subs = substitutions[a[i]!];\n      if (!subs || !subs.includes(b[i]!)) {\n        return false;\n      }\n    }\n  }\n\n  return differences > 0 && differences <= 2;\n}\n\n/** Check if names differ only in hyphen/underscore/dot usage. */\nfunction hasSeparatorConfusion(a: string, b: string): boolean {\n  const normalize = (s: string) => s.replace(/[-_.]/g, '');\n  return a !== b && normalize(a) === normalize(b);\n}\n","/**\n * Popular npm packages list for typosquatting detection.\n * This is a curated list of the most-downloaded packages.\n * Can be updated via CLI command in the future.\n */\n\n/** Top npm packages by weekly downloads (curated subset). */\nexport const POPULAR_PACKAGES: string[] = [\n  // Core utilities\n  'lodash', 'underscore', 'ramda', 'rxjs',\n  // Build tools\n  'typescript', 'webpack', 'rollup', 'esbuild', 'vite', 'parcel', 'turbo',\n  'babel-core', '@babel/core', '@babel/parser', '@babel/traverse',\n  'tsup', 'tslib', 'ts-node', 'tsx',\n  // Testing\n  'jest', 'mocha', 'chai', 'vitest', 'cypress', 'playwright',\n  'sinon', 'nyc', 'istanbul', 'supertest',\n  // React ecosystem\n  'react', 'react-dom', 'react-router', 'react-router-dom',\n  'next', 'gatsby', 'redux', 'react-redux', '@reduxjs/toolkit',\n  'styled-components', 'emotion', '@emotion/react', '@emotion/styled',\n  'formik', 'react-hook-form', 'swr', 'react-query', '@tanstack/react-query',\n  // Vue ecosystem\n  'vue', 'vuex', 'vue-router', 'pinia', 'nuxt',\n  // Angular ecosystem\n  '@angular/core', '@angular/cli', '@angular/common',\n  // Node.js frameworks\n  'express', 'koa', 'fastify', 'hapi', 'nest', '@nestjs/core',\n  'socket.io', 'ws', 'cors', 'helmet', 'morgan', 'compression',\n  // CLI tools\n  'commander', 'yargs', 'minimist', 'meow', 'inquirer',\n  'chalk', 'ora', 'cli-progress', 'cli-table3', 'boxen',\n  // Database\n  'mongoose', 'sequelize', 'typeorm', 'prisma', '@prisma/client',\n  'pg', 'mysql', 'mysql2', 'redis', 'ioredis', 'knex',\n  'mongodb', 'sqlite3', 'better-sqlite3',\n  // HTTP clients\n  'axios', 'node-fetch', 'got', 'superagent', 'request', 'undici',\n  // File system\n  'fs-extra', 'glob', 'globby', 'chokidar', 'rimraf', 'mkdirp',\n  // Utilities\n  'uuid', 'nanoid', 'date-fns', 'moment', 'dayjs', 'luxon',\n  'debug', 'dotenv', 'cross-env', 'env-cmd',\n  'semver', 'yup', 'zod', 'joi', 'ajv',\n  'async', 'bluebird', 'p-limit', 'p-queue',\n  // Crypto & auth\n  'jsonwebtoken', 'bcrypt', 'bcryptjs', 'passport', 'helmet',\n  'crypto-js', 'jose', 'oauth',\n  // Logging\n  'winston', 'pino', 'bunyan', 'log4js', 'morgan',\n  // Linting & formatting\n  'eslint', 'prettier', 'stylelint', 'tslint',\n  // CSS\n  'tailwindcss', 'postcss', 'autoprefixer', 'sass', 'less',\n  'styled-components', 'css-loader', 'style-loader',\n  // Package management\n  'npm', 'yarn', 'pnpm', 'lerna', 'turbo',\n  // AWS\n  'aws-sdk', '@aws-sdk/client-s3', '@aws-sdk/client-lambda',\n  // Google\n  '@google-cloud/storage', 'firebase', 'firebase-admin',\n  // Miscellaneous popular\n  'body-parser', 'cookie-parser', 'multer', 'sharp',\n  'cheerio', 'puppeteer', 'jsdom',\n  'marked', 'markdown-it', 'highlight.js', 'prismjs',\n  'nodemailer', 'handlebars', 'ejs', 'pug',\n  'classnames', 'clsx', 'prop-types',\n  'immutable', 'immer',\n  'husky', 'lint-staged', 'commitlint',\n  'cross-spawn', 'execa', 'shelljs',\n  'tar', 'archiver', 'adm-zip',\n  'xml2js', 'csv-parse', 'papaparse',\n  'socket.io-client', 'ws',\n  'three', 'd3', 'chart.js', 'echarts',\n  'swiper', 'slick-carousel',\n  'animate.css', 'framer-motion', 'gsap',\n  'i18next', 'react-i18next', 'vue-i18n',\n  'storybook', '@storybook/react',\n  'electron', 'electron-builder',\n  'pm2', 'nodemon', 'concurrently',\n];\n\n/**\n * Well-known brand names that attackers commonly impersonate.\n */\nexport const BRAND_NAMES: string[] = [\n  'google', 'facebook', 'meta', 'microsoft', 'amazon', 'aws',\n  'apple', 'github', 'gitlab', 'npm', 'node', 'nodejs',\n  'react', 'angular', 'vue', 'svelte', 'next', 'nuxt',\n  'vercel', 'netlify', 'cloudflare', 'heroku', 'docker',\n  'kubernetes', 'terraform', 'jenkins', 'circleci',\n  'stripe', 'paypal', 'shopify', 'twilio', 'sendgrid',\n  'mongodb', 'postgresql', 'mysql', 'redis', 'elastic',\n  'firebase', 'supabase', 'prisma', 'hasura',\n  'openai', 'anthropic', 'huggingface',\n  'slack', 'discord', 'telegram', 'whatsapp',\n  'sentry', 'datadog', 'newrelic', 'grafana',\n  'babel', 'webpack', 'rollup', 'vite', 'esbuild',\n  'typescript', 'eslint', 'prettier',\n  'jest', 'vitest', 'cypress', 'playwright',\n  'tailwind', 'bootstrap', 'material',\n];\n","/**\n * Brand impersonation detector.\n */\n\nimport { BRAND_NAMES } from './popular-packages.js';\n\n/** Result of brand impersonation detection. */\nexport interface BrandImpersonation {\n  brand: string;\n  packageName: string;\n  confidence: number;\n  reason: string;\n}\n\n/**\n * Detect potential brand impersonation in a package name.\n */\nexport function detectBrandImpersonation(packageName: string): BrandImpersonation[] {\n  const results: BrandImpersonation[] = [];\n  const name = packageName.replace(/^@[^/]+\\//, '').toLowerCase();\n\n  for (const brand of BRAND_NAMES) {\n    // Exact brand name with prefix/suffix\n    if (name !== brand && name.includes(brand)) {\n      // Check if it's a legitimate scoped package or clearly official\n      const stripped = name.replace(brand, '');\n\n      // Skip if the remaining part is substantial (likely legitimate)\n      if (stripped.replace(/[-_.]/g, '').length >= brand.length) continue;\n\n      // Suspicious patterns: brand-helper, fake-brand, brand123, etc.\n      const suspiciousPrefixes = ['fake-', 'free-', 'my-', 'new-', 'the-', 'real-', 'true-', 'original-'];\n      const suspiciousSuffixes = ['-free', '-pro', '-plus', '-official', '-real', '-original', '-helper'];\n\n      for (const prefix of suspiciousPrefixes) {\n        if (name.startsWith(prefix + brand)) {\n          results.push({\n            brand,\n            packageName,\n            confidence: 80,\n            reason: `Suspicious prefix \"${prefix}\" before brand name \"${brand}\"`,\n          });\n        }\n      }\n\n      for (const suffix of suspiciousSuffixes) {\n        if (name.endsWith(brand + suffix)) {\n          results.push({\n            brand,\n            packageName,\n            confidence: 75,\n            reason: `Suspicious suffix \"${suffix}\" after brand name \"${brand}\"`,\n          });\n        }\n      }\n    }\n  }\n\n  return results;\n}\n","/**\n * Typosquatting analyzer — detects package name impersonation.\n */\n\nimport type { IAnalyzer } from '../interfaces.js';\nimport type { AnalyzerResult } from '../../types/analysis.js';\nimport { AnalysisCategory, AnalysisStatus, Severity } from '../../types/common.js';\nimport type { AnalysisContext } from '../../core/context.js';\nimport { levenshteinDistance, normalizedSimilarity, detectTyposquatPatterns } from './levenshtein.js';\nimport { POPULAR_PACKAGES } from './popular-packages.js';\nimport { detectBrandImpersonation } from './brand-detector.js';\n\n/** Maximum Levenshtein distance to consider a potential typosquat. */\nconst MAX_DISTANCE = 2;\n\n/** Minimum similarity score to flag. */\nconst MIN_SIMILARITY = 0.85;\n\nexport class TyposquatAnalyzer implements IAnalyzer {\n  readonly name = 'typosquatting';\n  readonly description = 'Detects potential typosquatting and brand impersonation';\n  readonly category = AnalysisCategory.Typosquatting;\n\n  canAnalyze(_context: AnalysisContext): boolean {\n    return true; // Can always analyze the package name\n  }\n\n  async analyze(context: AnalysisContext): Promise<AnalyzerResult> {\n    const start = Date.now();\n\n    try {\n      const packageName = context.packageName;\n      const results: TyposquatResult[] = [];\n\n      // Skip if the package itself is in the popular list\n      if (POPULAR_PACKAGES.includes(packageName)) {\n        return {\n          analyzer: this.name,\n          category: this.category,\n          status: AnalysisStatus.Completed,\n          findings: [],\n          durationMs: Date.now() - start,\n          metadata: { isPopularPackage: true },\n        };\n      }\n\n      // Check against popular packages\n      for (const popular of POPULAR_PACKAGES) {\n        const distance = levenshteinDistance(packageName, popular);\n        const similarity = normalizedSimilarity(packageName, popular);\n\n        if (distance <= MAX_DISTANCE && distance > 0) {\n          const patterns = detectTyposquatPatterns(packageName, popular);\n          const confidence = Math.max(\n            similarity * 100,\n            ...patterns.map((p) => p.confidence),\n          );\n\n          results.push({\n            legitimatePackage: popular,\n            distance,\n            similarity,\n            patterns,\n            confidence,\n          });\n        } else if (similarity >= MIN_SIMILARITY && packageName !== popular) {\n          results.push({\n            legitimatePackage: popular,\n            distance,\n            similarity,\n            patterns: [],\n            confidence: similarity * 100,\n          });\n        }\n      }\n\n      // Check for brand impersonation\n      const brandResults = detectBrandImpersonation(packageName);\n\n      // Determine severity based on findings\n      let severity = Severity.Info;\n      if (results.some((r) => r.confidence >= 90)) {\n        severity = Severity.Critical;\n      } else if (results.some((r) => r.confidence >= 75)) {\n        severity = Severity.High;\n      } else if (results.length > 0 || brandResults.length > 0) {\n        severity = Severity.Medium;\n      }\n\n      return {\n        analyzer: this.name,\n        category: this.category,\n        status: AnalysisStatus.Completed,\n        findings: [],\n        durationMs: Date.now() - start,\n        metadata: {\n          typosquatResults: results,\n          brandImpersonation: brandResults,\n          highestSeverity: severity,\n          isPopularPackage: false,\n        },\n      };\n    } catch (error) {\n      return {\n        analyzer: this.name,\n        category: this.category,\n        status: AnalysisStatus.Failed,\n        findings: [],\n        durationMs: Date.now() - start,\n        error: error instanceof Error ? error.message : String(error),\n        metadata: {},\n      };\n    }\n  }\n}\n\n/** Internal result type for typosquatting analysis. */\ninterface TyposquatResult {\n  legitimatePackage: string;\n  distance: number;\n  similarity: number;\n  patterns: Array<{ type: string; description: string; confidence: number }>;\n  confidence: number;\n}\n","/**\n * Exfiltration pattern matcher.\n * Detects suspicious combinations that indicate data theft.\n */\n\nimport type { ScriptDetection, SuspiciousCombination } from '../../types/analysis.js';\nimport { Severity } from '../../types/common.js';\n\n/** Exfiltration risk pattern. */\ninterface ExfiltrationPattern {\n  source: string[];\n  sink: string[];\n  severity: Severity;\n  description: string;\n}\n\n/** Patterns that indicate credential/secret exfiltration. */\nconst EXFILTRATION_PATTERNS: ExfiltrationPattern[] = [\n  {\n    source: ['process-env-read', 'process-env-access'],\n    sink: ['http-request', 'fetch-call', 'http-get', 'network-module-import'],\n    severity: Severity.Critical,\n    description: 'Environment variables read and sent over network — credential exfiltration',\n  },\n  {\n    source: ['ssh-key-access'],\n    sink: ['http-request', 'fetch-call', 'http-get', 'network-module-import'],\n    severity: Severity.Critical,\n    description: 'SSH keys read and sent over network — SSH key theft',\n  },\n  {\n    source: ['npmrc-access', 'npm-token'],\n    sink: ['http-request', 'fetch-call', 'http-get', 'network-module-import'],\n    severity: Severity.Critical,\n    description: 'npm credentials read and sent over network — npm token theft',\n  },\n  {\n    source: ['git-credential-access'],\n    sink: ['http-request', 'fetch-call', 'http-get', 'network-module-import'],\n    severity: Severity.Critical,\n    description: 'Git credentials read and sent over network — git credential theft',\n  },\n  {\n    source: ['browser-credential-access'],\n    sink: ['http-request', 'fetch-call', 'http-get', 'network-module-import'],\n    severity: Severity.Critical,\n    description: 'Browser credentials read and sent over network — browser credential theft',\n  },\n  {\n    source: ['sensitive-file-access'],\n    sink: ['http-request', 'fetch-call', 'http-get', 'network-module-import'],\n    severity: Severity.High,\n    description: 'Sensitive files read and sent over network — data exfiltration',\n  },\n  {\n    source: ['aws-key', 'aws-secret'],\n    sink: ['http-request', 'fetch-call', 'http-get'],\n    severity: Severity.Critical,\n    description: 'AWS credentials read and sent over network — cloud credential theft',\n  },\n];\n\n/**\n * Match exfiltration patterns against script detections.\n */\nexport function matchExfiltrationPatterns(\n  detections: ScriptDetection[],\n): SuspiciousCombination[] {\n  const detectionTypes = new Set(detections.map((d) => d.type));\n  const matches: SuspiciousCombination[] = [];\n\n  for (const pattern of EXFILTRATION_PATTERNS) {\n    const hasSource = pattern.source.some((s) => detectionTypes.has(s));\n    const hasSink = pattern.sink.some((s) => detectionTypes.has(s));\n\n    if (hasSource && hasSink) {\n      const matchedSource = pattern.source.filter((s) => detectionTypes.has(s));\n      const matchedSink = pattern.sink.filter((s) => detectionTypes.has(s));\n\n      matches.push({\n        detections: [...matchedSource, ...matchedSink],\n        severity: pattern.severity,\n        reason: pattern.description,\n      });\n    }\n  }\n\n  return matches;\n}\n","/**\n * Exfiltration analyzer — detects secret theft patterns.\n */\n\nimport type { IAnalyzer } from '../interfaces.js';\nimport type { AnalyzerResult, Finding } from '../../types/analysis.js';\nimport { AnalysisCategory, AnalysisStatus, Severity } from '../../types/common.js';\nimport { EvidenceType } from '../../types/analysis.js';\nimport type { AnalysisContext } from '../../core/context.js';\nimport { matchExfiltrationPatterns } from './pattern-matcher.js';\n\nexport class ExfiltrationAnalyzer implements IAnalyzer {\n  readonly name = 'exfiltration';\n  readonly description = 'Detects patterns indicating secret or credential exfiltration';\n  readonly category = AnalysisCategory.Exfiltration;\n\n  canAnalyze(context: AnalysisContext): boolean {\n    // Requires script analysis results to have been run first\n    return context.npmMetadata !== undefined;\n  }\n\n  async analyze(context: AnalysisContext): Promise<AnalyzerResult> {\n    const start = Date.now();\n\n    try {\n      const findings: Finding[] = [];\n\n      // Get script analysis detections from context\n      const scriptResults = context.scriptAnalysisResults ?? [];\n\n      for (const scriptResult of scriptResults) {\n        const exfiltrationMatches = matchExfiltrationPatterns(\n          scriptResult.detections,\n        );\n\n        for (const match of exfiltrationMatches) {\n          findings.push({\n            ruleId: 'exfiltration/data-theft-pattern',\n            title: 'Potential Data Exfiltration Detected',\n            description: match.reason,\n            severity: match.severity,\n            category: AnalysisCategory.Exfiltration,\n            evidence: [\n              {\n                type: EvidenceType.Metadata,\n                description: 'Detection combination',\n                value: match.detections.join(' + '),\n              },\n              {\n                type: EvidenceType.Metadata,\n                description: 'Install script hook',\n                value: scriptResult.hook,\n              },\n            ],\n            remediation: 'Review the install scripts carefully. Consider blocking this package or contacting the maintainer.',\n            confidence: 90,\n            metadata: {\n              hook: scriptResult.hook,\n              matchedDetections: match.detections,\n            },\n          });\n        }\n\n        // Check for suspicious URL + credential combos\n        const hasCredentialDetection = scriptResult.detections.some(\n          (d) => ['npm-token', 'ssh-key-access', 'aws-key', 'github-token'].includes(d.type),\n        );\n        const hasSuspiciousUrl = scriptResult.detections.some(\n          (d) => d.type === 'url-literal' && d.severity === Severity.Critical,\n        );\n\n        if (hasCredentialDetection && hasSuspiciousUrl) {\n          findings.push({\n            ruleId: 'exfiltration/suspicious-url-credential',\n            title: 'Suspicious URL with Credential Access',\n            description: 'Install script accesses credentials and contains suspicious URLs — high risk of data exfiltration',\n            severity: Severity.Critical,\n            category: AnalysisCategory.Exfiltration,\n            evidence: scriptResult.detections\n              .filter((d) => d.severity === Severity.Critical || d.severity === Severity.High)\n              .map((d) => ({\n                type: EvidenceType.CodeSnippet,\n                description: d.description,\n                value: d.codeSnippet ?? d.type,\n                source: d.location?.file,\n                line: d.location?.line,\n              })),\n            confidence: 95,\n            metadata: { hook: scriptResult.hook },\n          });\n        }\n      }\n\n      return {\n        analyzer: this.name,\n        category: this.category,\n        status: AnalysisStatus.Completed,\n        findings,\n        durationMs: Date.now() - start,\n        metadata: { patternsChecked: scriptResults.length },\n      };\n    } catch (error) {\n      return {\n        analyzer: this.name,\n        category: this.category,\n        status: AnalysisStatus.Failed,\n        findings: [],\n        durationMs: Date.now() - start,\n        error: error instanceof Error ? error.message : String(error),\n        metadata: {},\n      };\n    }\n  }\n}\n","/**\n * Score category definitions and scorers.\n */\n\nexport const SCORE_CATEGORIES = {\n  HEALTH: 'health',\n  MAINTAINER_TRUST: 'maintainer-trust',\n  SUPPLY_CHAIN: 'supply-chain',\n  INSTALL_SCRIPTS: 'install-scripts',\n  COMMUNITY: 'community',\n  PACKAGE_AGE: 'package-age',\n  RELEASE_QUALITY: 'release-quality',\n  RISK_INDICATORS: 'risk-indicators',\n} as const;\n\nexport type ScoreCategory = (typeof SCORE_CATEGORIES)[keyof typeof SCORE_CATEGORIES];\n\n/** Category metadata for display. */\nexport const CATEGORY_METADATA: Record<ScoreCategory, { label: string; description: string }> = {\n  [SCORE_CATEGORIES.HEALTH]: {\n    label: 'Repository Health',\n    description: 'Stars, contributors, commits, issue management',\n  },\n  [SCORE_CATEGORIES.MAINTAINER_TRUST]: {\n    label: 'Maintainer Trust',\n    description: 'Maintainer stability, bus factor, verification',\n  },\n  [SCORE_CATEGORIES.SUPPLY_CHAIN]: {\n    label: 'Supply Chain Integrity',\n    description: 'Publishing provenance, maintainer changes, dependency mutations',\n  },\n  [SCORE_CATEGORIES.INSTALL_SCRIPTS]: {\n    label: 'Install Script Safety',\n    description: 'AST analysis of install scripts for dangerous patterns',\n  },\n  [SCORE_CATEGORIES.COMMUNITY]: {\n    label: 'Community Adoption',\n    description: 'Weekly downloads, dependents, popularity',\n  },\n  [SCORE_CATEGORIES.PACKAGE_AGE]: {\n    label: 'Package Maturity',\n    description: 'Repository age, version count, stability',\n  },\n  [SCORE_CATEGORIES.RELEASE_QUALITY]: {\n    label: 'Release Quality',\n    description: 'Release frequency, cadence consistency, deprecation',\n  },\n  [SCORE_CATEGORIES.RISK_INDICATORS]: {\n    label: 'Risk Indicators',\n    description: 'Typosquatting, exfiltration patterns, anomalies',\n  },\n};\n","/**\n * Configurable weight definitions for the trust scoring engine.\n */\n\nimport type { WeightDefinition } from '../types/scores.js';\nimport { SCORE_CATEGORIES } from './categories.js';\n\n/** Default weights for each scoring category. Sum should be 100. */\nexport const DEFAULT_WEIGHTS: WeightDefinition[] = [\n  {\n    category: SCORE_CATEGORIES.HEALTH,\n    label: 'Repository Health',\n    defaultWeight: 15,\n    description: 'How actively maintained is the repository',\n  },\n  {\n    category: SCORE_CATEGORIES.MAINTAINER_TRUST,\n    label: 'Maintainer Trust',\n    defaultWeight: 15,\n    description: 'Stability and verification of maintainers',\n  },\n  {\n    category: SCORE_CATEGORIES.SUPPLY_CHAIN,\n    label: 'Supply Chain Integrity',\n    defaultWeight: 20,\n    description: 'Publishing provenance and metadata integrity',\n  },\n  {\n    category: SCORE_CATEGORIES.INSTALL_SCRIPTS,\n    label: 'Install Script Safety',\n    defaultWeight: 20,\n    description: 'Safety of preinstall/postinstall scripts',\n  },\n  {\n    category: SCORE_CATEGORIES.COMMUNITY,\n    label: 'Community Adoption',\n    defaultWeight: 10,\n    description: 'Downloads, popularity, and community engagement',\n  },\n  {\n    category: SCORE_CATEGORIES.PACKAGE_AGE,\n    label: 'Package Maturity',\n    defaultWeight: 5,\n    description: 'How long the package has existed',\n  },\n  {\n    category: SCORE_CATEGORIES.RELEASE_QUALITY,\n    label: 'Release Quality',\n    defaultWeight: 10,\n    description: 'Release frequency and consistency',\n  },\n  {\n    category: SCORE_CATEGORIES.RISK_INDICATORS,\n    label: 'Risk Indicators',\n    defaultWeight: 5,\n    description: 'Negative signals (typosquatting, exfiltration)',\n  },\n];\n\n/**\n * Merge user-provided weight overrides with defaults.\n */\nexport function mergeWeights(\n  overrides: Record<string, number>,\n): WeightDefinition[] {\n  return DEFAULT_WEIGHTS.map((w) => ({\n    ...w,\n    defaultWeight: overrides[w.category] ?? w.defaultWeight,\n  }));\n}\n","/**\n * Trust scorer — the central scoring engine.\n * Calculates weighted trust scores from analyzer results.\n */\n\nimport type { IScoringEngine } from './interfaces.js';\nimport type { AnalyzerResult } from '../types/analysis.js';\nimport type { CategoryScore, TrustScore, WeightDefinition } from '../types/scores.js';\nimport { trustLevelFromScore, AnalysisCategory, Severity, SEVERITY_ORDER } from '../types/common.js';\nimport { DEFAULT_WEIGHTS, mergeWeights } from './weights.js';\nimport { CATEGORY_METADATA, SCORE_CATEGORIES } from './categories.js';\n\nexport class TrustScorer implements IScoringEngine {\n  private weights: WeightDefinition[];\n\n  constructor(overrides: Record<string, number> = {}) {\n    this.weights = mergeWeights(overrides);\n  }\n\n  calculateTrustScore(results: AnalyzerResult[]): TrustScore {\n    const categories: CategoryScore[] = [];\n\n    for (const weight of this.weights) {\n      const categoryScore = this.calculateCategoryScore(weight.category, results);\n      categories.push(categoryScore);\n    }\n\n    // Calculate weighted overall score\n    const totalWeight = categories.reduce((sum, c) => sum + c.weight, 0);\n    const overall = totalWeight > 0\n      ? Math.round(\n          categories.reduce((sum, c) => sum + c.weightedScore, 0) / totalWeight * 100,\n        )\n      : 0;\n\n    const clampedOverall = Math.max(0, Math.min(100, overall));\n\n    return {\n      overall: clampedOverall,\n      level: trustLevelFromScore(clampedOverall),\n      categories,\n      summary: this.generateSummary(clampedOverall, categories),\n      calculatedAt: new Date().toISOString(),\n    };\n  }\n\n  calculateCategoryScore(\n    category: string,\n    results: AnalyzerResult[],\n  ): CategoryScore {\n    const weight = this.weights.find((w) => w.category === category);\n    if (!weight) {\n      return {\n        category,\n        label: category,\n        score: 50,\n        weight: 0,\n        weightedScore: 0,\n        metrics: [],\n        explanation: 'No weight configured for this category',\n      };\n    }\n\n    const meta = CATEGORY_METADATA[category as keyof typeof CATEGORY_METADATA];\n    let score: number;\n    let explanation: string;\n\n    switch (category) {\n      case SCORE_CATEGORIES.HEALTH:\n        ({ score, explanation } = this.scoreHealth(results));\n        break;\n      case SCORE_CATEGORIES.MAINTAINER_TRUST:\n        ({ score, explanation } = this.scoreMaintainerTrust(results));\n        break;\n      case SCORE_CATEGORIES.SUPPLY_CHAIN:\n        ({ score, explanation } = this.scoreSupplyChain(results));\n        break;\n      case SCORE_CATEGORIES.INSTALL_SCRIPTS:\n        ({ score, explanation } = this.scoreInstallScripts(results));\n        break;\n      case SCORE_CATEGORIES.COMMUNITY:\n        ({ score, explanation } = this.scoreCommunity(results));\n        break;\n      case SCORE_CATEGORIES.PACKAGE_AGE:\n        ({ score, explanation } = this.scorePackageAge(results));\n        break;\n      case SCORE_CATEGORIES.RELEASE_QUALITY:\n        ({ score, explanation } = this.scoreReleaseQuality(results));\n        break;\n      case SCORE_CATEGORIES.RISK_INDICATORS:\n        ({ score, explanation } = this.scoreRiskIndicators(results));\n        break;\n      default:\n        score = 50;\n        explanation = 'Unknown category';\n    }\n\n    const clampedScore = Math.max(0, Math.min(100, score));\n\n    return {\n      category,\n      label: meta?.label ?? category,\n      score: clampedScore,\n      weight: weight.defaultWeight,\n      weightedScore: clampedScore * weight.defaultWeight / 100,\n      metrics: [],\n      explanation,\n    };\n  }\n\n  getWeights(): WeightDefinition[] {\n    return [...this.weights];\n  }\n\n  setWeights(overrides: Record<string, number>): void {\n    this.weights = mergeWeights(overrides);\n  }\n\n  private scoreHealth(results: AnalyzerResult[]): { score: number; explanation: string } {\n    const healthResult = results.find((r) => r.category === AnalysisCategory.Health);\n    if (!healthResult || healthResult.status !== 'completed') {\n      return { score: 50, explanation: 'Health data unavailable' };\n    }\n\n    const metricScores = healthResult.metadata['metricScores'] as\n      Array<{ normalizedScore: number; weight: number }> | undefined;\n\n    if (!metricScores || metricScores.length === 0) {\n      return { score: 50, explanation: 'No health metrics available' };\n    }\n\n    const totalWeight = metricScores.reduce((s, m) => s + m.weight, 0);\n    const weightedSum = metricScores.reduce((s, m) => s + m.normalizedScore * m.weight, 0);\n    const score = totalWeight > 0 ? Math.round(weightedSum / totalWeight) : 50;\n\n    return {\n      score,\n      explanation: `Health score based on ${metricScores.length} metrics`,\n    };\n  }\n\n  private scoreMaintainerTrust(results: AnalyzerResult[]): { score: number; explanation: string } {\n    const scResult = results.find((r) => r.category === AnalysisCategory.SupplyChain);\n    if (!scResult) return { score: 70, explanation: 'Supply chain data unavailable' };\n\n    const metrics = scResult.metadata['metrics'] as Record<string, unknown> | undefined;\n    if (!metrics) return { score: 70, explanation: 'No supply chain metrics' };\n\n    let score = 100;\n    const reasons: string[] = [];\n\n    // Penalize for maintainer changes\n    const maintainerChanges = (metrics['maintainerChanges'] as unknown[])?.length ?? 0;\n    if (maintainerChanges > 3) {\n      score -= 30;\n      reasons.push(`${maintainerChanges} maintainer changes`);\n    } else if (maintainerChanges > 0) {\n      score -= 10;\n      reasons.push(`${maintainerChanges} maintainer change(s)`);\n    }\n\n    // Penalize for publisher changes\n    const publisherChanges = (metrics['publisherChanges'] as unknown[])?.length ?? 0;\n    if (publisherChanges > 2) {\n      score -= 25;\n      reasons.push(`${publisherChanges} publisher changes`);\n    } else if (publisherChanges > 0) {\n      score -= 10;\n      reasons.push(`${publisherChanges} publisher change(s)`);\n    }\n\n    return {\n      score: Math.max(0, score),\n      explanation: reasons.length > 0\n        ? `Deductions: ${reasons.join(', ')}`\n        : 'No concerning maintainer activity',\n    };\n  }\n\n  private scoreSupplyChain(results: AnalyzerResult[]): { score: number; explanation: string } {\n    const scResult = results.find((r) => r.category === AnalysisCategory.SupplyChain);\n    if (!scResult) return { score: 70, explanation: 'Supply chain data unavailable' };\n\n    const metrics = scResult.metadata['metrics'] as Record<string, unknown> | undefined;\n    if (!metrics) return { score: 70, explanation: 'No metrics' };\n\n    let score = 100;\n    const reasons: string[] = [];\n\n    // Provenance bonus/penalty\n    if (metrics['hasProvenance'] === true) {\n      reasons.push('Has publishing provenance ✓');\n    } else if (metrics['hasProvenance'] === false) {\n      score -= 15;\n      reasons.push('No publishing provenance');\n    }\n\n    // Integrity hash\n    if (!metrics['integrityHash']) {\n      score -= 10;\n      reasons.push('Missing integrity hash');\n    }\n\n    // Timing anomalies\n    const timingAnomalies = (metrics['releaseTimingAnomalies'] as string[])?.length ?? 0;\n    if (timingAnomalies > 0) {\n      score -= timingAnomalies * 5;\n      reasons.push(`${timingAnomalies} timing anomaly(s)`);\n    }\n\n    return {\n      score: Math.max(0, score),\n      explanation: reasons.join('; '),\n    };\n  }\n\n  private scoreInstallScripts(results: AnalyzerResult[]): { score: number; explanation: string } {\n    const scriptResult = results.find((r) => r.category === AnalysisCategory.InstallScripts);\n    if (!scriptResult) return { score: 100, explanation: 'No install script data' };\n\n    if (scriptResult.metadata['hasInstallScripts'] === false) {\n      return { score: 100, explanation: 'No install scripts — safest configuration' };\n    }\n\n    // Penalize based on severity of findings\n    let score = 100;\n    const allFindings = scriptResult.findings;\n\n    for (const finding of allFindings) {\n      const penalty = SEVERITY_ORDER[finding.severity] * 10;\n      score -= penalty;\n    }\n\n    return {\n      score: Math.max(0, score),\n      explanation: allFindings.length > 0\n        ? `${allFindings.length} finding(s) in install scripts`\n        : 'Install scripts present but no dangerous patterns detected',\n    };\n  }\n\n  private scoreCommunity(results: AnalyzerResult[]): { score: number; explanation: string } {\n    const healthResult = results.find((r) => r.category === AnalysisCategory.Health);\n    const metrics = healthResult?.metadata['metrics'] as Record<string, unknown> | undefined;\n\n    if (!metrics) return { score: 50, explanation: 'Community data unavailable' };\n\n    const downloads = (metrics['weeklyDownloads'] as number) ?? 0;\n    let score: number;\n    if (downloads >= 1_000_000) score = 100;\n    else if (downloads >= 100_000) score = 85;\n    else if (downloads >= 10_000) score = 70;\n    else if (downloads >= 1_000) score = 55;\n    else if (downloads >= 100) score = 40;\n    else score = 20;\n\n    return {\n      score,\n      explanation: `${downloads.toLocaleString()} weekly downloads`,\n    };\n  }\n\n  private scorePackageAge(results: AnalyzerResult[]): { score: number; explanation: string } {\n    const healthResult = results.find((r) => r.category === AnalysisCategory.Health);\n    const metrics = healthResult?.metadata['metrics'] as Record<string, unknown> | undefined;\n\n    const ageDays = (metrics?.['repositoryAgeDays'] as number) ?? 0;\n    let score: number;\n    if (ageDays >= 1095) score = 100;\n    else if (ageDays >= 365) score = 75;\n    else if (ageDays >= 180) score = 55;\n    else if (ageDays >= 90) score = 35;\n    else score = 15;\n\n    return {\n      score,\n      explanation: ageDays > 0\n        ? `Package is ${(ageDays / 365).toFixed(1)} years old`\n        : 'Age unknown',\n    };\n  }\n\n  private scoreReleaseQuality(results: AnalyzerResult[]): { score: number; explanation: string } {\n    const healthResult = results.find((r) => r.category === AnalysisCategory.Health);\n    const metrics = healthResult?.metadata['metrics'] as Record<string, unknown> | undefined;\n\n    const releaseFreq = (metrics?.['releaseFrequencyDays'] as number) ?? null;\n    let score = 50;\n    if (releaseFreq !== null) {\n      if (releaseFreq <= 30) score = 90;\n      else if (releaseFreq <= 90) score = 75;\n      else if (releaseFreq <= 180) score = 55;\n      else score = 30;\n    }\n\n    return {\n      score,\n      explanation: releaseFreq !== null\n        ? `Average release every ${releaseFreq} days`\n        : 'Release frequency unknown',\n    };\n  }\n\n  private scoreRiskIndicators(results: AnalyzerResult[]): { score: number; explanation: string } {\n    // Start at 100 and deduct for risk indicators\n    let score = 100;\n    const reasons: string[] = [];\n\n    // Typosquatting findings\n    const typoResult = results.find((r) => r.category === AnalysisCategory.Typosquatting);\n    if (typoResult) {\n      const typoResults = (typoResult.metadata['typosquatResults'] as unknown[]) ?? [];\n      if (typoResults.length > 0) {\n        score -= 30;\n        reasons.push(`${typoResults.length} typosquatting match(es)`);\n      }\n      const brandResults = (typoResult.metadata['brandImpersonation'] as unknown[]) ?? [];\n      if (brandResults.length > 0) {\n        score -= 20;\n        reasons.push(`${brandResults.length} brand impersonation match(es)`);\n      }\n    }\n\n    // Exfiltration findings\n    const exfilResult = results.find((r) => r.category === AnalysisCategory.Exfiltration);\n    if (exfilResult) {\n      const criticalFindings = exfilResult.findings.filter(\n        (f) => f.severity === Severity.Critical,\n      );\n      if (criticalFindings.length > 0) {\n        score -= 50;\n        reasons.push(`${criticalFindings.length} critical exfiltration finding(s)`);\n      }\n    }\n\n    return {\n      score: Math.max(0, score),\n      explanation: reasons.length > 0\n        ? reasons.join('; ')\n        : 'No risk indicators detected',\n    };\n  }\n\n  private generateSummary(overall: number, categories: CategoryScore[]): string {\n    const worst = categories\n      .filter((c) => c.score < 50)\n      .sort((a, b) => a.score - b.score);\n\n    if (overall >= 80) {\n      return 'This package appears trustworthy with strong health and security indicators.';\n    } else if (overall >= 60) {\n      const concerns = worst.map((c) => c.label).join(', ');\n      return `This package has moderate trust. Areas of concern: ${concerns || 'general review recommended'}.`;\n    } else if (overall >= 40) {\n      const concerns = worst.map((c) => c.label).join(', ');\n      return `This package has low trust. Significant concerns in: ${concerns}.`;\n    } else {\n      return 'This package has very low trust scores and should be carefully reviewed before use.';\n    }\n  }\n}\n","/**\n * Rule engine — evaluates deterministic rules against analysis data.\n */\n\nimport type { IRuleEngine, IRule, RuleEvaluationData } from './interfaces.js';\nimport type { Finding } from '../types/analysis.js';\n\nexport class RuleEngine implements IRuleEngine {\n  private readonly rules = new Map<string, IRule>();\n  private readonly disabledRules = new Set<string>();\n\n  evaluate(data: RuleEvaluationData): Finding[] {\n    const findings: Finding[] = [];\n\n    for (const [id, rule] of this.rules) {\n      if (this.disabledRules.has(id)) continue;\n\n      try {\n        const ruleFindings = rule.evaluate(data);\n        findings.push(...ruleFindings);\n      } catch {\n        // Don't let one rule failure stop others\n      }\n    }\n\n    return findings;\n  }\n\n  registerRule(rule: IRule): void {\n    if (this.rules.has(rule.id)) {\n      throw new Error(`Rule \"${rule.id}\" is already registered`);\n    }\n    this.rules.set(rule.id, rule);\n  }\n\n  getRules(): IRule[] {\n    return Array.from(this.rules.values());\n  }\n\n  getRule(id: string): IRule | undefined {\n    return this.rules.get(id);\n  }\n\n  disableRule(id: string): void {\n    this.disabledRules.add(id);\n  }\n\n  enableRule(id: string): void {\n    this.disabledRules.delete(id);\n  }\n}\n","/**\n * Built-in health rules.\n */\n\nimport type { IRule, RuleEvaluationData } from '../interfaces.js';\nimport type { Finding } from '../../types/analysis.js';\nimport { AnalysisCategory, Severity } from '../../types/common.js';\nimport { EvidenceType } from '../../types/analysis.js';\n\nclass StaleRepositoryRule implements IRule {\n  readonly id = 'health/stale-repository';\n  readonly name = 'Stale Repository';\n  readonly description = 'Repository has not received commits in over 1 year';\n  readonly category = AnalysisCategory.Health;\n  readonly defaultSeverity = Severity.Medium;\n\n  evaluate(data: RuleEvaluationData): Finding[] {\n    const metrics = data.healthMetrics as Record<string, unknown> | undefined;\n    const lastCommit = metrics?.['lastCommitDate'] as string | undefined;\n    if (!lastCommit) return [];\n\n    const daysSince = Math.floor(\n      (Date.now() - new Date(lastCommit).getTime()) / (1000 * 60 * 60 * 24),\n    );\n\n    if (daysSince > 365) {\n      return [{\n        ruleId: this.id,\n        title: this.name,\n        description: `Last commit was ${daysSince} days ago (${(daysSince / 365).toFixed(1)} years)`,\n        severity: daysSince > 730 ? Severity.High : this.defaultSeverity,\n        category: this.category,\n        evidence: [{ type: EvidenceType.Metadata, description: 'Last commit', value: lastCommit }],\n        remediation: 'Consider finding an actively maintained alternative.',\n        confidence: 100,\n        metadata: { daysSinceLastCommit: daysSince },\n      }];\n    }\n    return [];\n  }\n}\n\nclass ArchivedRepositoryRule implements IRule {\n  readonly id = 'health/archived-repository';\n  readonly name = 'Archived Repository';\n  readonly description = 'Repository is archived and no longer maintained';\n  readonly category = AnalysisCategory.Health;\n  readonly defaultSeverity = Severity.High;\n\n  evaluate(data: RuleEvaluationData): Finding[] {\n    const metrics = data.healthMetrics as Record<string, unknown> | undefined;\n    if (metrics?.['isArchived'] !== true) return [];\n\n    return [{\n      ruleId: this.id,\n      title: this.name,\n      description: 'The GitHub repository is archived. No further updates are expected.',\n      severity: this.defaultSeverity,\n      category: this.category,\n      evidence: [{ type: EvidenceType.Metadata, description: 'Archived', value: 'true' }],\n      remediation: 'Find an actively maintained fork or alternative package.',\n      confidence: 100,\n      metadata: {},\n    }];\n  }\n}\n\nclass LowBusFactorRule implements IRule {\n  readonly id = 'health/low-bus-factor';\n  readonly name = 'Low Bus Factor';\n  readonly description = 'Package depends heavily on a single contributor';\n  readonly category = AnalysisCategory.Health;\n  readonly defaultSeverity = Severity.Medium;\n\n  evaluate(data: RuleEvaluationData): Finding[] {\n    const metrics = data.healthMetrics as Record<string, unknown> | undefined;\n    const busFactor = metrics?.['busFactorEstimate'] as number | undefined;\n    if (busFactor === undefined || busFactor > 1) return [];\n\n    return [{\n      ruleId: this.id,\n      title: this.name,\n      description: 'Over 50% of contributions come from a single developer',\n      severity: this.defaultSeverity,\n      category: this.category,\n      evidence: [{ type: EvidenceType.Metadata, description: 'Bus factor', value: String(busFactor) }],\n      remediation: 'Monitor for maintainer abandonment. Consider contributing to reduce bus factor.',\n      confidence: 85,\n      metadata: { busFactor },\n    }];\n  }\n}\n\nexport function getHealthRules(): IRule[] {\n  return [\n    new StaleRepositoryRule(),\n    new ArchivedRepositoryRule(),\n    new LowBusFactorRule(),\n  ];\n}\n","/**\n * Built-in supply chain rules.\n */\n\nimport type { IRule, RuleEvaluationData } from '../interfaces.js';\nimport type { Finding } from '../../types/analysis.js';\nimport { AnalysisCategory, Severity } from '../../types/common.js';\nimport { EvidenceType } from '../../types/analysis.js';\n\nclass PublisherChangeRule implements IRule {\n  readonly id = 'supply-chain/publisher-change';\n  readonly name = 'Publisher Changed';\n  readonly description = 'The npm publisher has changed in recent versions';\n  readonly category = AnalysisCategory.SupplyChain;\n  readonly defaultSeverity = Severity.High;\n\n  evaluate(data: RuleEvaluationData): Finding[] {\n    const metrics = data.supplyChainMetrics as Record<string, unknown> | undefined;\n    const changes = (metrics?.['publisherChanges'] as Array<Record<string, string>>) ?? [];\n    if (changes.length === 0) return [];\n\n    return changes.map((change) => ({\n      ruleId: this.id,\n      title: this.name,\n      description: `Publisher changed from \"${change['previousPublisher']}\" to \"${change['newPublisher']}\" in version ${change['version']}`,\n      severity: this.defaultSeverity,\n      category: this.category,\n      evidence: [{\n        type: EvidenceType.Timeline,\n        description: 'Publisher change',\n        value: `${change['previousPublisher']} → ${change['newPublisher']}`,\n      }],\n      remediation: 'Verify the publisher change was intentional. Check if the package was transferred.',\n      confidence: 90,\n      metadata: change,\n    }));\n  }\n}\n\nclass NoProvenanceRule implements IRule {\n  readonly id = 'supply-chain/no-provenance';\n  readonly name = 'No Publishing Provenance';\n  readonly description = 'Package lacks SLSA/Sigstore provenance attestation';\n  readonly category = AnalysisCategory.SupplyChain;\n  readonly defaultSeverity = Severity.Low;\n\n  evaluate(data: RuleEvaluationData): Finding[] {\n    const metrics = data.supplyChainMetrics as Record<string, unknown> | undefined;\n    if (metrics?.['hasProvenance'] !== false) return [];\n\n    return [{\n      ruleId: this.id,\n      title: this.name,\n      description: 'This package does not have publishing provenance (SLSA/Sigstore attestation)',\n      severity: this.defaultSeverity,\n      category: this.category,\n      evidence: [{ type: EvidenceType.Metadata, description: 'Provenance', value: 'absent' }],\n      remediation: 'Consider requesting the maintainer enable provenance attestation via GitHub Actions.',\n      confidence: 100,\n      metadata: {},\n    }];\n  }\n}\n\nclass SizeAnomalyRule implements IRule {\n  readonly id = 'supply-chain/size-anomaly';\n  readonly name = 'Package Size Anomaly';\n  readonly description = 'Significant unexpected change in package size';\n  readonly category = AnalysisCategory.SupplyChain;\n  readonly defaultSeverity = Severity.Medium;\n\n  evaluate(data: RuleEvaluationData): Finding[] {\n    const metrics = data.supplyChainMetrics as Record<string, unknown> | undefined;\n    const current = metrics?.['packageSizeBytes'] as number | undefined;\n    const previous = metrics?.['previousPackageSizeBytes'] as number | undefined;\n\n    if (!current || !previous || previous === 0) return [];\n\n    const changePercent = ((current - previous) / previous) * 100;\n\n    // Flag if size increased by more than 200% or decreased by more than 50%\n    if (changePercent > 200) {\n      return [{\n        ruleId: this.id,\n        title: 'Package Size Increased Significantly',\n        description: `Package size increased by ${changePercent.toFixed(0)}% (${previous} → ${current} bytes)`,\n        severity: Severity.Medium,\n        category: this.category,\n        evidence: [{\n          type: EvidenceType.Comparison,\n          description: 'Size change',\n          value: `${previous} → ${current} bytes (+${changePercent.toFixed(0)}%)`,\n        }],\n        remediation: 'Review the changelog for the latest version to understand the size increase.',\n        confidence: 75,\n        metadata: { current, previous, changePercent },\n      }];\n    }\n\n    return [];\n  }\n}\n\nexport function getSupplyChainRules(): IRule[] {\n  return [\n    new PublisherChangeRule(),\n    new NoProvenanceRule(),\n    new SizeAnomalyRule(),\n  ];\n}\n","/**\n * Built-in install script rules.\n */\n\nimport type { IRule, RuleEvaluationData } from '../interfaces.js';\nimport type { Finding } from '../../types/analysis.js';\nimport { AnalysisCategory, Severity } from '../../types/common.js';\nimport { EvidenceType } from '../../types/analysis.js';\n\nclass HasInstallScriptsRule implements IRule {\n  readonly id = 'scripts/has-install-scripts';\n  readonly name = 'Has Install Scripts';\n  readonly description = 'Package defines preinstall, install, or postinstall scripts';\n  readonly category = AnalysisCategory.InstallScripts;\n  readonly defaultSeverity = Severity.Info;\n\n  evaluate(data: RuleEvaluationData): Finding[] {\n    const scriptData = data.scriptResults as Record<string, unknown> | undefined;\n    if (scriptData?.['hasInstallScripts'] !== true) return [];\n\n    return [{\n      ruleId: this.id,\n      title: this.name,\n      description: 'This package has install lifecycle scripts that run during npm install',\n      severity: this.defaultSeverity,\n      category: this.category,\n      evidence: [{ type: EvidenceType.Metadata, description: 'Install scripts', value: 'present' }],\n      remediation: 'Review the install scripts to ensure they are safe. Use --ignore-scripts if uncertain.',\n      confidence: 100,\n      metadata: {},\n    }];\n  }\n}\n\nclass DangerousScriptPatternRule implements IRule {\n  readonly id = 'scripts/dangerous-pattern';\n  readonly name = 'Dangerous Install Script Pattern';\n  readonly description = 'Install script contains patterns known to be used in supply-chain attacks';\n  readonly category = AnalysisCategory.InstallScripts;\n  readonly defaultSeverity = Severity.Critical;\n\n  evaluate(data: RuleEvaluationData): Finding[] {\n    const scriptData = data.scriptResults as Record<string, unknown> | undefined;\n    const scriptResults = (scriptData?.['scriptResults'] as Array<Record<string, unknown>>) ?? [];\n\n    const findings: Finding[] = [];\n\n    for (const result of scriptResults) {\n      const combinations = (result['suspiciousCombinations'] as Array<Record<string, unknown>>) ?? [];\n      for (const combo of combinations) {\n        findings.push({\n          ruleId: this.id,\n          title: 'Suspicious Script Combination',\n          description: (combo['reason'] as string) ?? 'Dangerous pattern detected',\n          severity: (combo['severity'] as Severity) ?? Severity.High,\n          category: this.category,\n          evidence: [{\n            type: EvidenceType.CodeSnippet,\n            description: 'Detection combination',\n            value: ((combo['detections'] as string[]) ?? []).join(' + '),\n            source: result['hook'] as string,\n          }],\n          remediation: 'Do NOT install this package without thorough review of its install scripts.',\n          confidence: 90,\n          metadata: { hook: result['hook'], combination: combo },\n        });\n      }\n    }\n\n    return findings;\n  }\n}\n\nexport function getScriptRules(): IRule[] {\n  return [\n    new HasInstallScriptsRule(),\n    new DangerousScriptPatternRule(),\n  ];\n}\n","/**\n * Built-in typosquatting rules.\n */\n\nimport type { IRule, RuleEvaluationData } from '../interfaces.js';\nimport type { Finding } from '../../types/analysis.js';\nimport { AnalysisCategory, Severity } from '../../types/common.js';\nimport { EvidenceType } from '../../types/analysis.js';\n\nclass TyposquatDetectionRule implements IRule {\n  readonly id = 'typosquat/similar-name';\n  readonly name = 'Potential Typosquat';\n  readonly description = 'Package name is suspiciously similar to a popular package';\n  readonly category = AnalysisCategory.Typosquatting;\n  readonly defaultSeverity = Severity.High;\n\n  evaluate(data: RuleEvaluationData): Finding[] {\n    const typoData = data.typosquatData as Record<string, unknown> | undefined;\n    const results = (typoData?.['typosquatResults'] as Array<Record<string, unknown>>) ?? [];\n    if (results.length === 0) return [];\n\n    return results.map((result) => {\n      const confidence = (result['confidence'] as number) ?? 50;\n      let severity: Severity;\n      if (confidence >= 90) severity = Severity.Critical;\n      else if (confidence >= 75) severity = Severity.High;\n      else severity = Severity.Medium;\n\n      return {\n        ruleId: this.id,\n        title: `Potential Typosquat of \"${result['legitimatePackage']}\"`,\n        description: `Package name \"${data.packageName}\" is similar to popular package \"${result['legitimatePackage']}\" (similarity: ${((result['similarity'] as number) * 100).toFixed(0)}%, distance: ${result['distance']})`,\n        severity,\n        category: this.category,\n        evidence: [{\n          type: EvidenceType.Comparison,\n          description: 'Package name similarity',\n          value: `\"${data.packageName}\" vs \"${result['legitimatePackage']}\"`,\n        }],\n        remediation: `Verify you intended to install \"${data.packageName}\" and not \"${result['legitimatePackage']}\".`,\n        confidence,\n        metadata: result,\n      };\n    });\n  }\n}\n\nclass BrandImpersonationRule implements IRule {\n  readonly id = 'typosquat/brand-impersonation';\n  readonly name = 'Brand Impersonation';\n  readonly description = 'Package name contains well-known brand name with suspicious modifications';\n  readonly category = AnalysisCategory.Typosquatting;\n  readonly defaultSeverity = Severity.Medium;\n\n  evaluate(data: RuleEvaluationData): Finding[] {\n    const typoData = data.typosquatData as Record<string, unknown> | undefined;\n    const results = (typoData?.['brandImpersonation'] as Array<Record<string, unknown>>) ?? [];\n    if (results.length === 0) return [];\n\n    return results.map((result) => ({\n      ruleId: this.id,\n      title: `Potential \"${result['brand']}\" Brand Impersonation`,\n      description: (result['reason'] as string) ?? 'Suspicious use of brand name',\n      severity: this.defaultSeverity,\n      category: this.category,\n      evidence: [{\n        type: EvidenceType.Comparison,\n        description: 'Brand name match',\n        value: `Brand: \"${result['brand']}\" in package: \"${result['packageName']}\"`,\n      }],\n      remediation: 'Verify this package is officially associated with the brand.',\n      confidence: (result['confidence'] as number) ?? 70,\n      metadata: result,\n    }));\n  }\n}\n\nexport function getTyposquatRules(): IRule[] {\n  return [\n    new TyposquatDetectionRule(),\n    new BrandImpersonationRule(),\n  ];\n}\n","/**\n * Rule registry — registers all built-in rules.\n */\n\nimport type { IRuleEngine } from './interfaces.js';\nimport { getHealthRules } from './built-in/health-rules.js';\nimport { getSupplyChainRules } from './built-in/supply-chain-rules.js';\nimport { getScriptRules } from './built-in/script-rules.js';\nimport { getTyposquatRules } from './built-in/typosquat-rules.js';\n\n/**\n * Register all built-in rules with the rule engine.\n */\nexport function registerBuiltInRules(engine: IRuleEngine): void {\n  const allRules = [\n    ...getHealthRules(),\n    ...getSupplyChainRules(),\n    ...getScriptRules(),\n    ...getTyposquatRules(),\n  ];\n\n  for (const rule of allRules) {\n    engine.registerRule(rule);\n  }\n}\n","/**\n * Risk badge renderer for trust scores.\n */\n\nimport chalk from 'chalk';\nimport { TrustLevel } from '../../types/common.js';\n\n/**\n * Render a large trust score badge.\n */\nexport function renderTrustBadge(score: number, level: string): string {\n  const emoji = LEVEL_EMOJIS[level as TrustLevel] ?? '❓';\n  const color = LEVEL_COLORS[level as TrustLevel] ?? chalk.gray;\n  const label = LEVEL_LABELS[level as TrustLevel] ?? 'Unknown';\n\n  const lines = [\n    '',\n    color(`  ╭─────────────────────────────╮`),\n    color(`  │                             │`),\n    color(`  │    ${emoji}  Trust Score: ${String(score).padStart(3)}     │`),\n    color(`  │    Status: ${label.padEnd(16)} │`),\n    color(`  │                             │`),\n    color(`  ╰─────────────────────────────╯`),\n    '',\n  ];\n\n  return lines.join('\\n');\n}\n\n/**\n * Render a compact inline badge.\n */\nexport function renderInlineBadge(score: number, level: string): string {\n  const emoji = LEVEL_EMOJIS[level as TrustLevel] ?? '❓';\n  const color = LEVEL_COLORS[level as TrustLevel] ?? chalk.gray;\n  return color(`${emoji} ${score}/100 (${level})`);\n}\n\nconst LEVEL_EMOJIS: Record<TrustLevel, string> = {\n  [TrustLevel.Trusted]: '🟢',\n  [TrustLevel.Moderate]: '🟡',\n  [TrustLevel.Low]: '🟠',\n  [TrustLevel.Untrusted]: '🔴',\n  [TrustLevel.Unknown]: '⚪',\n};\n\nconst LEVEL_COLORS: Record<TrustLevel, typeof chalk> = {\n  [TrustLevel.Trusted]: chalk.green,\n  [TrustLevel.Moderate]: chalk.yellow,\n  [TrustLevel.Low]: chalk.hex('#FF8800'),\n  [TrustLevel.Untrusted]: chalk.red,\n  [TrustLevel.Unknown]: chalk.gray,\n};\n\nconst LEVEL_LABELS: Record<TrustLevel, string> = {\n  [TrustLevel.Trusted]: 'Trusted',\n  [TrustLevel.Moderate]: 'Moderate',\n  [TrustLevel.Low]: 'Low Trust',\n  [TrustLevel.Untrusted]: 'Untrusted',\n  [TrustLevel.Unknown]: 'Unknown',\n};\n","/**\n * Table formatter using cli-table3.\n */\n\nimport Table from 'cli-table3';\nimport chalk from 'chalk';\nimport type { Finding } from '../../types/analysis.js';\nimport type { CategoryScore } from '../../types/scores.js';\nimport { Severity } from '../../types/common.js';\n\n/**\n * Render findings as a formatted table.\n */\nexport function renderFindingsTable(findings: Finding[]): string {\n  if (findings.length === 0) return chalk.green('  No findings detected.\\n');\n\n  const table = new Table({\n    head: [\n      chalk.gray('Severity'),\n      chalk.gray('Rule'),\n      chalk.gray('Title'),\n      chalk.gray('Confidence'),\n    ],\n    colWidths: [12, 30, 40, 12],\n    wordWrap: true,\n    style: { head: [], border: ['gray'] },\n  });\n\n  for (const finding of findings) {\n    table.push([\n      severityBadge(finding.severity),\n      chalk.gray(finding.ruleId),\n      finding.title,\n      `${finding.confidence}%`,\n    ]);\n  }\n\n  return table.toString() + '\\n';\n}\n\n/**\n * Render category scores as a table.\n */\nexport function renderScoreTable(categories: CategoryScore[]): string {\n  const table = new Table({\n    head: [\n      chalk.gray('Category'),\n      chalk.gray('Score'),\n      chalk.gray('Weight'),\n      chalk.gray('Bar'),\n    ],\n    colWidths: [25, 8, 8, 35],\n    style: { head: [], border: ['gray'] },\n  });\n\n  for (const cat of categories) {\n    table.push([\n      cat.label,\n      scoreColor(cat.score),\n      `${cat.weight}%`,\n      progressBar(cat.score, 30),\n    ]);\n  }\n\n  return table.toString() + '\\n';\n}\n\n/** Color a score value. */\nfunction scoreColor(score: number): string {\n  if (score >= 80) return chalk.green(String(score));\n  if (score >= 60) return chalk.yellow(String(score));\n  if (score >= 40) return chalk.hex('#FF8800')(String(score));\n  return chalk.red(String(score));\n}\n\n/** Render a visual progress bar. */\nfunction progressBar(value: number, width: number): string {\n  const filled = Math.round((value / 100) * width);\n  const empty = width - filled;\n\n  let color: typeof chalk;\n  if (value >= 80) color = chalk.green;\n  else if (value >= 60) color = chalk.yellow;\n  else if (value >= 40) color = chalk.hex('#FF8800');\n  else color = chalk.red;\n\n  return color('█'.repeat(filled)) + chalk.gray('░'.repeat(empty));\n}\n\n/** Render a severity badge. */\nfunction severityBadge(severity: Severity): string {\n  switch (severity) {\n    case Severity.Critical:\n      return chalk.bgRed.white(' CRIT ');\n    case Severity.High:\n      return chalk.red('HIGH');\n    case Severity.Medium:\n      return chalk.yellow('MED');\n    case Severity.Low:\n      return chalk.cyan('LOW');\n    case Severity.Info:\n      return chalk.blue('INFO');\n  }\n}\n","/**\n * Terminal reporter — renders analysis results to stdout.\n */\n\nimport type { IReporter } from './interfaces.js';\nimport type { AnalysisResult } from '../types/analysis.js';\nimport { ReportFormat } from '../types/common.js';\nimport { Logger } from '../cli/ui/logger.js';\nimport { renderTrustBadge } from '../cli/ui/badges.js';\nimport { renderScoreTable, renderFindingsTable } from '../cli/ui/table.js';\nimport { formatDuration } from '../utils/validation.js';\n\nexport class TerminalReporter implements IReporter {\n  readonly format = ReportFormat.Terminal;\n  readonly name = 'terminal';\n\n  async generate(result: AnalysisResult): Promise<string> {\n    const lines: string[] = [];\n\n    // Trust badge\n    lines.push(renderTrustBadge(result.trustScore.overall, result.trustScore.level));\n\n    // Package info\n    lines.push(`  Package: ${result.packageName}@${result.packageVersion}`);\n    lines.push(`  Analyzed: ${new Date(result.analyzedAt).toLocaleString()}`);\n    lines.push(`  Duration: ${formatDuration(result.totalDurationMs)}`);\n    lines.push('');\n\n    // Score breakdown\n    lines.push('  Score Breakdown');\n    lines.push('  ──────────────');\n    lines.push(renderScoreTable(result.trustScore.categories));\n\n    // Findings\n    if (result.findings.length > 0) {\n      lines.push(`  Findings (${result.findings.length})`);\n      lines.push('  ────────');\n      lines.push(renderFindingsTable(result.findings));\n    } else {\n      lines.push('  ✅ No security findings detected.\\n');\n    }\n\n    // Summary\n    lines.push(`  ${result.trustScore.summary}`);\n    lines.push('');\n\n    return lines.join('\\n');\n  }\n\n  async output(result: AnalysisResult, _destination?: string): Promise<void> {\n    const report = await this.generate(result);\n    process.stdout.write(report);\n  }\n}\n","/**\n * JSON reporter — outputs analysis results as machine-readable JSON.\n */\n\nimport { writeFile } from 'node:fs/promises';\nimport type { IReporter } from './interfaces.js';\nimport type { AnalysisResult } from '../types/analysis.js';\nimport { ReportFormat } from '../types/common.js';\n\nexport class JsonReporter implements IReporter {\n  readonly format = ReportFormat.Json;\n  readonly name = 'json';\n\n  async generate(result: AnalysisResult): Promise<string> {\n    return JSON.stringify(result, null, 2);\n  }\n\n  async output(result: AnalysisResult, destination?: string): Promise<void> {\n    const json = await this.generate(result);\n    if (destination) {\n      await writeFile(destination, json, 'utf-8');\n    } else {\n      process.stdout.write(json + '\\n');\n    }\n  }\n}\n","/**\n * HTML reporter — generates a styled HTML report.\n */\n\nimport { writeFile } from 'node:fs/promises';\nimport type { IReporter } from './interfaces.js';\nimport type { AnalysisResult } from '../types/analysis.js';\nimport { ReportFormat, Severity } from '../types/common.js';\n\nexport class HtmlReporter implements IReporter {\n  readonly format = ReportFormat.Html;\n  readonly name = 'html';\n\n  async generate(result: AnalysisResult): Promise<string> {\n    const severityColors: Record<Severity, string> = {\n      [Severity.Critical]: '#dc2626',\n      [Severity.High]: '#ea580c',\n      [Severity.Medium]: '#ca8a04',\n      [Severity.Low]: '#0891b2',\n      [Severity.Info]: '#2563eb',\n    };\n\n    const trustColor = result.trustScore.overall >= 80 ? '#16a34a'\n      : result.trustScore.overall >= 60 ? '#ca8a04'\n      : result.trustScore.overall >= 40 ? '#ea580c'\n      : '#dc2626';\n\n    const findingsHtml = result.findings.map((f) => `\n      <tr>\n        <td><span class=\"badge\" style=\"background:${severityColors[f.severity]}\">${f.severity.toUpperCase()}</span></td>\n        <td><code>${f.ruleId}</code></td>\n        <td>${f.title}</td>\n        <td>${f.description}</td>\n        <td>${f.confidence}%</td>\n      </tr>\n    `).join('');\n\n    const categoriesHtml = result.trustScore.categories.map((c) => {\n      const barColor = c.score >= 80 ? '#16a34a' : c.score >= 60 ? '#ca8a04' : c.score >= 40 ? '#ea580c' : '#dc2626';\n      return `\n        <tr>\n          <td>${c.label}</td>\n          <td>${c.score}/100</td>\n          <td><div class=\"bar\"><div class=\"fill\" style=\"width:${c.score}%;background:${barColor}\"></div></div></td>\n          <td>${c.explanation}</td>\n        </tr>\n      `;\n    }).join('');\n\n    return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>pkg-sentinel Report — ${result.packageName}</title>\n  <style>\n    :root { --bg: #0f172a; --surface: #1e293b; --text: #e2e8f0; --muted: #94a3b8; --border: #334155; }\n    * { margin: 0; padding: 0; box-sizing: border-box; }\n    body { font-family: 'Inter', system-ui, sans-serif; background: var(--bg); color: var(--text); padding: 2rem; }\n    .container { max-width: 900px; margin: 0 auto; }\n    h1 { font-size: 1.5rem; margin-bottom: 0.5rem; }\n    h2 { font-size: 1.1rem; margin: 2rem 0 0.5rem; color: var(--muted); border-bottom: 1px solid var(--border); padding-bottom: 0.5rem; }\n    .trust-score { text-align: center; padding: 2rem; background: var(--surface); border-radius: 12px; margin: 1rem 0; }\n    .trust-score .score { font-size: 3rem; font-weight: 700; color: ${trustColor}; }\n    .trust-score .label { color: var(--muted); margin-top: 0.25rem; }\n    table { width: 100%; border-collapse: collapse; margin: 0.5rem 0; }\n    th, td { padding: 0.5rem 0.75rem; text-align: left; border-bottom: 1px solid var(--border); font-size: 0.85rem; }\n    th { color: var(--muted); font-weight: 500; }\n    .badge { padding: 2px 8px; border-radius: 4px; color: white; font-size: 0.7rem; font-weight: 600; }\n    code { background: var(--surface); padding: 2px 6px; border-radius: 4px; font-size: 0.8rem; }\n    .bar { background: var(--surface); border-radius: 4px; height: 8px; width: 100%; }\n    .fill { height: 100%; border-radius: 4px; transition: width 0.3s; }\n    .meta { color: var(--muted); font-size: 0.85rem; margin-bottom: 1rem; }\n    .summary { background: var(--surface); padding: 1rem; border-radius: 8px; margin: 1rem 0; }\n  </style>\n</head>\n<body>\n  <div class=\"container\">\n    <h1>🛡️ pkg-sentinel Report</h1>\n    <div class=\"meta\">\n      <strong>${result.packageName}@${result.packageVersion}</strong> · \n      Analyzed ${new Date(result.analyzedAt).toLocaleString()} · \n      ${result.totalDurationMs}ms\n    </div>\n\n    <div class=\"trust-score\">\n      <div class=\"score\">${result.trustScore.overall}</div>\n      <div class=\"label\">${result.trustScore.level}</div>\n    </div>\n\n    <div class=\"summary\">${result.trustScore.summary}</div>\n\n    <h2>Score Breakdown</h2>\n    <table>\n      <thead><tr><th>Category</th><th>Score</th><th>Bar</th><th>Explanation</th></tr></thead>\n      <tbody>${categoriesHtml}</tbody>\n    </table>\n\n    <h2>Findings (${result.findings.length})</h2>\n    ${result.findings.length > 0 ? `\n    <table>\n      <thead><tr><th>Severity</th><th>Rule</th><th>Title</th><th>Description</th><th>Confidence</th></tr></thead>\n      <tbody>${findingsHtml}</tbody>\n    </table>` : '<p style=\"color:var(--muted)\">✅ No security findings detected.</p>'}\n  </div>\n</body>\n</html>`;\n  }\n\n  async output(result: AnalysisResult, destination?: string): Promise<void> {\n    const html = await this.generate(result);\n    if (destination) {\n      await writeFile(destination, html, 'utf-8');\n    } else {\n      process.stdout.write(html);\n    }\n  }\n}\n","/**\n * Markdown reporter — generates a Markdown report.\n */\n\nimport { writeFile } from 'node:fs/promises';\nimport type { IReporter } from './interfaces.js';\nimport type { AnalysisResult } from '../types/analysis.js';\nimport { ReportFormat } from '../types/common.js';\n\nexport class MarkdownReporter implements IReporter {\n  readonly format = ReportFormat.Markdown;\n  readonly name = 'markdown';\n\n  async generate(result: AnalysisResult): Promise<string> {\n    const lines: string[] = [];\n\n    lines.push(`# 🛡️ pkg-sentinel Report`);\n    lines.push('');\n    lines.push(`**Package:** \\`${result.packageName}@${result.packageVersion}\\``);\n    lines.push(`**Analyzed:** ${new Date(result.analyzedAt).toLocaleString()}`);\n    lines.push(`**Duration:** ${result.totalDurationMs}ms`);\n    lines.push('');\n\n    // Trust score\n    lines.push(`## Trust Score: ${result.trustScore.overall}/100 (${result.trustScore.level})`);\n    lines.push('');\n    lines.push(`> ${result.trustScore.summary}`);\n    lines.push('');\n\n    // Score breakdown\n    lines.push('## Score Breakdown');\n    lines.push('');\n    lines.push('| Category | Score | Weight | Explanation |');\n    lines.push('|----------|-------|--------|-------------|');\n    for (const cat of result.trustScore.categories) {\n      lines.push(`| ${cat.label} | ${cat.score}/100 | ${cat.weight}% | ${cat.explanation} |`);\n    }\n    lines.push('');\n\n    // Findings\n    lines.push(`## Findings (${result.findings.length})`);\n    lines.push('');\n\n    if (result.findings.length > 0) {\n      lines.push('| Severity | Rule | Title | Confidence |');\n      lines.push('|----------|------|-------|------------|');\n      for (const finding of result.findings) {\n        lines.push(`| ${finding.severity.toUpperCase()} | \\`${finding.ruleId}\\` | ${finding.title} | ${finding.confidence}% |`);\n      }\n    } else {\n      lines.push('✅ No security findings detected.');\n    }\n\n    lines.push('');\n    lines.push('---');\n    lines.push('*Generated by [pkg-sentinel](https://github.com/pkg-sentinel/pkg-sentinel)*');\n\n    return lines.join('\\n');\n  }\n\n  async output(result: AnalysisResult, destination?: string): Promise<void> {\n    const md = await this.generate(result);\n    if (destination) {\n      await writeFile(destination, md, 'utf-8');\n    } else {\n      process.stdout.write(md + '\\n');\n    }\n  }\n}\n","/**\n * CI reporter — provides CI-friendly exit codes based on findings.\n */\n\nimport type { IReporter } from './interfaces.js';\nimport type { AnalysisResult } from '../types/analysis.js';\nimport { ReportFormat, Severity, ExitCode } from '../types/common.js';\n\nexport class CiReporter implements IReporter {\n  readonly format = ReportFormat.Json;\n  readonly name = 'ci';\n\n  async generate(result: AnalysisResult): Promise<string> {\n    const summary = {\n      package: `${result.packageName}@${result.packageVersion}`,\n      trustScore: result.trustScore.overall,\n      trustLevel: result.trustScore.level,\n      highestSeverity: result.highestSeverity,\n      findings: result.summary.totalFindings,\n      exitCode: this.getExitCode(result),\n    };\n    return JSON.stringify(summary);\n  }\n\n  async output(result: AnalysisResult): Promise<void> {\n    const output = await this.generate(result);\n    process.stdout.write(output + '\\n');\n    process.exitCode = this.getExitCode(result);\n  }\n\n  private getExitCode(result: AnalysisResult): number {\n    switch (result.highestSeverity) {\n      case Severity.Critical:\n        return ExitCode.CriticalRisk;\n      case Severity.High:\n        return ExitCode.HighRisk;\n      case Severity.Medium:\n      case Severity.Low:\n        return ExitCode.Warnings;\n      default:\n        return ExitCode.Success;\n    }\n  }\n}\n","/**\n * Plugin loader — discovers and loads plugins from filesystem and npm packages.\n */\n\nimport type { IPluginLoader, IPlugin } from './interfaces.js';\nimport type { PkgSentinelConfig } from '../types/config.js';\n\nexport class PluginLoader implements IPluginLoader {\n  async loadPlugins(config: PkgSentinelConfig): Promise<IPlugin[]> {\n    const plugins: IPlugin[] = [];\n\n    // Load from configured packages\n    for (const pkgName of config.plugins.packages) {\n      if (config.plugins.disabled.includes(pkgName)) continue;\n      try {\n        const plugin = await this.loadPlugin(pkgName);\n        await plugin.initialize(config);\n        plugins.push(plugin);\n      } catch {\n        // Plugin load failure is non-fatal — log and continue\n      }\n    }\n\n    return plugins;\n  }\n\n  async loadPlugin(source: string): Promise<IPlugin> {\n    try {\n      // Dynamic import for npm packages or file paths\n      const module = await import(source);\n      const PluginClass = module.default ?? module.Plugin ?? module;\n\n      if (typeof PluginClass === 'function') {\n        return new PluginClass() as IPlugin;\n      }\n\n      if (typeof PluginClass === 'object' && 'metadata' in PluginClass) {\n        return PluginClass as IPlugin;\n      }\n\n      throw new Error(`Invalid plugin format: ${source}`);\n    } catch (error) {\n      throw new Error(\n        `Failed to load plugin \"${source}\": ${error instanceof Error ? error.message : String(error)}`,\n      );\n    }\n  }\n}\n","/**\n * Plugin registry — manages loaded plugin lifecycle.\n */\n\nimport type { IPluginRegistry, IPlugin } from './interfaces.js';\nimport type { IAnalyzer } from '../analyzers/interfaces.js';\nimport type { IRule } from '../rules/interfaces.js';\nimport type { IReporter } from '../reporters/interfaces.js';\n\nexport class PluginRegistry implements IPluginRegistry {\n  private readonly plugins = new Map<string, IPlugin>();\n\n  register(plugin: IPlugin): void {\n    const name = plugin.metadata.name;\n    if (this.plugins.has(name)) {\n      throw new Error(`Plugin \"${name}\" is already registered`);\n    }\n    this.plugins.set(name, plugin);\n  }\n\n  getAll(): IPlugin[] {\n    return Array.from(this.plugins.values());\n  }\n\n  get(name: string): IPlugin | undefined {\n    return this.plugins.get(name);\n  }\n\n  async unregister(name: string): Promise<void> {\n    const plugin = this.plugins.get(name);\n    if (plugin) {\n      await plugin.destroy();\n      this.plugins.delete(name);\n    }\n  }\n\n  getAnalyzers(): IAnalyzer[] {\n    return this.getAll().flatMap((p) => p.getAnalyzers());\n  }\n\n  getRules(): IRule[] {\n    return this.getAll().flatMap((p) => p.getRules());\n  }\n\n  getReporters(): IReporter[] {\n    return this.getAll().flatMap((p) => p.getReporters());\n  }\n}\n","/**\n * Default configuration values.\n */\n\nimport type { PkgSentinelConfig } from '../types/config.js';\nimport { Severity, ReportFormat } from '../types/common.js';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\n\nconst PKG_SENTINEL_DIR = join(homedir(), '.pkg-sentinel');\n\nexport const DEFAULT_CONFIG: PkgSentinelConfig = {\n  minSeverity: Severity.Info,\n  reportFormat: ReportFormat.Terminal,\n  cache: {\n    enabled: true,\n    directory: join(PKG_SENTINEL_DIR, 'cache'),\n    npmTtlSeconds: 900,       // 15 minutes\n    githubTtlSeconds: 3600,   // 1 hour\n    maxSizeMb: 100,\n  },\n  github: {\n    token: undefined,\n    apiBaseUrl: 'https://api.github.com',\n    maxRequestsPerHour: 5000,\n  },\n  scoring: {\n    weights: {},\n  },\n  ai: {\n    enabled: false,\n    provider: 'none',\n    apiKey: undefined,\n    model: undefined,\n    maxTokens: 1024,\n  },\n  plugins: {\n    directories: [],\n    packages: [],\n    disabled: [],\n  },\n  snapshotDir: join(PKG_SENTINEL_DIR, 'snapshots'),\n  concurrency: 5,\n  ignoredPackages: [],\n  disabledRules: [],\n};\n","/**\n * Configuration loader — merges defaults with user overrides.\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { PkgSentinelConfig, DeepPartial } from '../types/config.js';\nimport { DEFAULT_CONFIG } from './defaults.js';\n\n/**\n * Load configuration from file and environment variables.\n */\nexport async function loadConfig(\n  overrides?: DeepPartial<PkgSentinelConfig>,\n): Promise<PkgSentinelConfig> {\n  let fileConfig: DeepPartial<PkgSentinelConfig> = {};\n\n  // Try loading config file from current directory\n  const configPaths = [\n    '.pkg-sentinel.json',\n    '.pkg-sentinelrc',\n    '.pkg-sentinelrc.json',\n  ];\n\n  for (const configPath of configPaths) {\n    try {\n      const content = await readFile(join(process.cwd(), configPath), 'utf-8');\n      fileConfig = JSON.parse(content);\n      break;\n    } catch {\n      // Config file not found — that's fine\n    }\n  }\n\n  // Merge: defaults < file config < programmatic overrides < env vars\n  const merged = deepMerge(\n    DEFAULT_CONFIG as unknown as Record<string, unknown>,\n    fileConfig as Record<string, unknown>,\n    overrides as Record<string, unknown> ?? {},\n  ) as unknown as PkgSentinelConfig;\n\n  // Apply environment variable overrides\n  if (process.env['GITHUB_TOKEN']) {\n    merged.github.token = process.env['GITHUB_TOKEN'];\n  }\n  if (process.env['PKG_SENTINEL_AI_KEY']) {\n    merged.ai.apiKey = process.env['PKG_SENTINEL_AI_KEY'];\n    merged.ai.enabled = true;\n  }\n  if (process.env['PKG_SENTINEL_AI_PROVIDER']) {\n    merged.ai.provider = process.env['PKG_SENTINEL_AI_PROVIDER'] as 'openai' | 'anthropic';\n  }\n\n  return merged;\n}\n\n/**\n * Deep merge utility — merges source objects into target.\n */\nfunction deepMerge(...objects: Record<string, unknown>[]): Record<string, unknown> {\n  const result: Record<string, unknown> = {};\n\n  for (const obj of objects) {\n    for (const key in obj) {\n      if (Object.prototype.hasOwnProperty.call(obj, key)) {\n        const value = obj[key];\n        if (\n          value !== null &&\n          typeof value === 'object' &&\n          !Array.isArray(value) &&\n          typeof result[key] === 'object' &&\n          result[key] !== null &&\n          !Array.isArray(result[key])\n        ) {\n          result[key] = deepMerge(\n            result[key] as Record<string, unknown>,\n            value as Record<string, unknown>,\n          );\n        } else if (value !== undefined) {\n          result[key] = value;\n        }\n      }\n    }\n  }\n\n  return result;\n}\n"]}