@getcodesentinel/codesentinel 1.19.0 → 1.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/dist/index.js +186 -48
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../../dependency-firewall/src/domain/external-analysis.ts","../../dependency-firewall/src/domain/types.ts","../../dependency-firewall/src/application/map-with-concurrency.ts","../../dependency-firewall/src/application/collect-dependency-metadata.ts","../../dependency-firewall/src/infrastructure/fs-loader.ts","../../dependency-firewall/src/parsing/package-json-loader.ts","../../dependency-firewall/src/parsing/package-lock-parser.ts","../../dependency-firewall/src/parsing/pnpm-lock-parser.ts","../../dependency-firewall/src/parsing/yarn-lock-parser.ts","../../dependency-firewall/src/parsing/bun-lock-parser.ts","../../dependency-firewall/src/application/parse-lockfile-extraction.ts","../../dependency-firewall/src/infrastructure/cached-fetch.ts","../../dependency-firewall/src/infrastructure/fetch-json-with-retry.ts","../../dependency-firewall/src/infrastructure/npm-metadata-cache.ts","../../dependency-firewall/src/infrastructure/codesentinel-cache-dir.ts","../../dependency-firewall/src/infrastructure/file-cache-store.ts","../../dependency-firewall/src/application/resolve-registry-graph.ts","../../dependency-firewall/src/application/prepare-dependency-extraction.ts","../../dependency-firewall/src/application/analyze-dependency-exposure.ts","../../dependency-firewall/src/application/analyze-dependency-candidate.ts","../../dependency-firewall/src/infrastructure/npm-registry-metadata-provider.ts","../../dependency-firewall/src/infrastructure/noop-metadata-provider.ts","../../dependency-firewall/src/index.ts","../../reporter/src/domain.ts","../../reporter/src/diff.ts","../../reporter/src/report.ts","../../reporter/src/renderers.ts","../../reporter/src/snapshot.ts","../../reporter/src/index.ts","../../governance/src/domain.ts","../../governance/src/evaluate-gates.ts","../../governance/src/render.ts","../../governance/src/baseline-ref.ts","../../governance/src/baseline-auto-resolver.ts","../src/application/format-analyze-output.ts","../src/application/format-explain-output.ts","../src/application/format-dependency-risk-output.ts","../src/application/logger.ts","../src/application/check-for-updates.ts","../src/application/interactive-menu.ts","../src/application/run-analyze-command.ts","../../code-graph/src/domain/graph-model.ts","../../code-graph/src/domain/tarjan.ts","../../code-graph/src/domain/graph-metrics.ts","../../code-graph/src/infrastructure/typescript-project.ts","../../code-graph/src/application/build-project-graph-summary.ts","../../git-analyzer/src/domain/evolution-metrics.ts","../../git-analyzer/src/domain/evolution-types.ts","../../git-analyzer/src/application/analyze-repository-evolution.ts","../../git-analyzer/src/infrastructure/git-command-client.ts","../../git-analyzer/src/domain/git-log-format.ts","../../git-analyzer/src/application/git-history-provider.ts","../../git-analyzer/src/parsing/git-log-parser.ts","../../git-analyzer/src/infrastructure/git-history-provider.ts","../../git-analyzer/src/index.ts","../../health-engine/src/domain/math.ts","../../health-engine/src/application/compute-repository-health-summary.ts","../../risk-engine/src/config.ts","../../risk-engine/src/domain/math.ts","../../risk-engine/src/domain/normalization.ts","../../risk-engine/src/domain/risk-model.ts","../../risk-engine/src/domain/trace-collector.ts","../../risk-engine/src/application/compute-repository-risk-summary.ts","../src/application/run-check-command.ts","../src/application/build-analysis-snapshot.ts","../src/application/run-ci-command.ts","../src/application/run-report-command.ts","../src/application/run-explain-command.ts"],"sourcesContent":["import { Command, Option } from \"commander\";\nimport { analyzeDependencyCandidateFromRegistry } from \"@codesentinel/dependency-firewall\";\nimport { EXIT_CODES, type GateConfig } from \"@codesentinel/governance\";\nimport {\n compareSnapshots,\n createReport,\n createSnapshot,\n formatReport,\n parseSnapshot,\n type ReportFormat,\n} from \"@codesentinel/reporter\";\nimport { readFileSync } from \"node:fs\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n formatAnalyzeOutput,\n type AnalyzeOutputMode,\n} from \"./application/format-analyze-output.js\";\nimport { formatExplainOutput } from \"./application/format-explain-output.js\";\nimport {\n formatDependencyRiskOutput,\n type DependencyRiskOutputMode,\n} from \"./application/format-dependency-risk-output.js\";\nimport { createStderrLogger, parseLogLevel, type LogLevel } from \"./application/logger.js\";\nimport { checkForCliUpdates, runManualCliUpdate } from \"./application/check-for-updates.js\";\nimport { runInteractiveCliMenu } from \"./application/interactive-menu.js\";\nimport {\n runAnalyzeCommand,\n type AuthorIdentityCliMode,\n type ScoringProfileCliMode,\n} from \"./application/run-analyze-command.js\";\nimport {\n GovernanceConfigurationError as CheckConfigurationError,\n runCheckCommand,\n type CheckOutputFormat,\n} from \"./application/run-check-command.js\";\nimport {\n GovernanceConfigurationError as CiConfigurationError,\n runCiCommand,\n} from \"./application/run-ci-command.js\";\nimport { runReportCommand } from \"./application/run-report-command.js\";\nimport { runExplainCommand, type ExplainFormat } from \"./application/run-explain-command.js\";\n\nconst program = new Command();\nconst packageJsonPath = resolve(dirname(fileURLToPath(import.meta.url)), \"../package.json\");\nconst { version } = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as { version: string };\n\nconst parseRecentWindowDays = (value: string): number => {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(\"--recent-window-days must be a positive integer\");\n }\n return parsed;\n};\n\ntype RunDetail = \"compact\" | \"standard\" | \"full\";\n\nconst stripLeadingMarkdownHeading = (value: string, heading: string): string => {\n const prefix = `${heading}\\n`;\n if (value.startsWith(prefix)) {\n return value.slice(prefix.length).trimStart();\n }\n\n return value;\n};\n\nconst extractExplainTextSummary = (text: string): string => {\n const splitIndex = text.search(/\\n\\n(?:file|module|dependency|repository): /);\n if (splitIndex < 0) {\n return text.trim();\n }\n\n return text.slice(0, splitIndex).trim();\n};\n\nconst extractExplainMarkdownSummary = (markdown: string): string => {\n const splitIndex = markdown.search(/\\n\\n## (?:file|module|dependency|repository): /);\n if (splitIndex < 0) {\n return markdown.trim();\n }\n\n return markdown.slice(0, splitIndex).trim();\n};\n\nconst extractSummaryValue = (summary: string, key: string): string | undefined => {\n const prefix = `${key}: `;\n for (const rawLine of summary.split(\"\\n\")) {\n const line = rawLine.trimStart();\n if (line.startsWith(prefix)) {\n return line.slice(prefix.length).trim();\n }\n }\n\n return undefined;\n};\n\nconst renderReportHighlightsText = (\n report: Awaited<ReturnType<typeof runReportCommand>>[\"report\"],\n) => {\n const lines: string[] = [];\n lines.push(\"Repository Summary\");\n lines.push(` target: ${report.repository.targetPath}`);\n lines.push(` riskScore: ${report.repository.riskScore}`);\n lines.push(` healthScore: ${report.health.healthScore}`);\n lines.push(` normalizedScore: ${report.repository.normalizedScore}`);\n lines.push(` riskTier: ${report.repository.riskTier}`);\n lines.push(` healthTier: ${report.repository.healthTier}`);\n lines.push(\"\");\n lines.push(\"Top Hotspots\");\n for (const hotspot of report.hotspots.slice(0, 5)) {\n lines.push(` - ${hotspot.target} | score=${hotspot.score}`);\n lines.push(` priority actions: ${hotspot.suggestedActions.join(\" | \") || \"none\"}`);\n }\n\n return lines.join(\"\\n\");\n};\n\nconst renderReportHighlightsMarkdown = (\n report: Awaited<ReturnType<typeof runReportCommand>>[\"report\"],\n): string => {\n const lines: string[] = [];\n lines.push(\"## Repository Summary\");\n lines.push(`- target: \\`${report.repository.targetPath}\\``);\n lines.push(`- riskScore: \\`${report.repository.riskScore}\\``);\n lines.push(`- healthScore: \\`${report.health.healthScore}\\``);\n lines.push(`- normalizedScore: \\`${report.repository.normalizedScore}\\``);\n lines.push(`- riskTier: \\`${report.repository.riskTier}\\``);\n lines.push(`- healthTier: \\`${report.repository.healthTier}\\``);\n lines.push(\"\");\n lines.push(\"## Top Hotspots\");\n for (const hotspot of report.hotspots.slice(0, 5)) {\n lines.push(`- **${hotspot.target}** (score: \\`${hotspot.score}\\`)`);\n lines.push(` - priority actions: ${hotspot.suggestedActions.join(\" | \") || \"none\"}`);\n }\n\n return lines.join(\"\\n\");\n};\n\nconst renderCompactText = (\n report: Awaited<ReturnType<typeof runReportCommand>>[\"report\"],\n explainSummary: string,\n): string => {\n const lines: string[] = [];\n lines.push(\"CodeSentinel Run (compact)\");\n lines.push(\"\");\n lines.push(\"Repository\");\n lines.push(` target: ${report.repository.targetPath}`);\n lines.push(` riskScore: ${report.repository.riskScore}`);\n lines.push(` healthScore: ${report.health.healthScore}`);\n lines.push(` riskTier: ${report.repository.riskTier}`);\n lines.push(` healthTier: ${report.repository.healthTier}`);\n lines.push(\n ` dimensions: structural=${report.repository.dimensionScores.structural ?? \"n/a\"}, evolution=${report.repository.dimensionScores.evolution ?? \"n/a\"}, external=${report.repository.dimensionScores.external ?? \"n/a\"}, interactions=${report.repository.dimensionScores.interactions ?? \"n/a\"}`,\n );\n lines.push(\"\");\n lines.push(\n `Key Drivers: ${extractSummaryValue(explainSummary, \"key drivers\") ?? \"insufficient data\"}`,\n );\n lines.push(\n `Priority Actions: ${extractSummaryValue(explainSummary, \"priority actions\") ?? \"insufficient data\"}`,\n );\n lines.push(\"\");\n lines.push(\"Top Hotspots\");\n for (const hotspot of report.hotspots.slice(0, 3)) {\n lines.push(` - ${hotspot.target} | score=${hotspot.score}`);\n }\n\n return lines.join(\"\\n\");\n};\n\nconst renderCompactMarkdown = (\n report: Awaited<ReturnType<typeof runReportCommand>>[\"report\"],\n explainSummary: string,\n): string => {\n const lines: string[] = [];\n lines.push(\"# CodeSentinel Run (compact)\");\n lines.push(\"\");\n lines.push(\"## Repository\");\n lines.push(`- target: \\`${report.repository.targetPath}\\``);\n lines.push(`- riskScore: \\`${report.repository.riskScore}\\``);\n lines.push(`- healthScore: \\`${report.health.healthScore}\\``);\n lines.push(`- riskTier: \\`${report.repository.riskTier}\\``);\n lines.push(`- healthTier: \\`${report.repository.healthTier}\\``);\n lines.push(\n `- dimensions: structural=\\`${report.repository.dimensionScores.structural ?? \"n/a\"}\\`, evolution=\\`${report.repository.dimensionScores.evolution ?? \"n/a\"}\\`, external=\\`${report.repository.dimensionScores.external ?? \"n/a\"}\\`, interactions=\\`${report.repository.dimensionScores.interactions ?? \"n/a\"}\\``,\n );\n lines.push(\"\");\n lines.push(\n `- key drivers: ${extractSummaryValue(explainSummary, \"- key drivers\") ?? \"insufficient data\"}`,\n );\n lines.push(\n `- priority actions: ${extractSummaryValue(explainSummary, \"- priority actions\") ?? \"insufficient data\"}`,\n );\n lines.push(\"\");\n lines.push(\"## Top Hotspots\");\n for (const hotspot of report.hotspots.slice(0, 3)) {\n lines.push(`- \\`${hotspot.target}\\` (score: \\`${hotspot.score}\\`)`);\n }\n\n return lines.join(\"\\n\");\n};\n\nconst scoringProfileOption = (): Option =>\n new Option(\n \"--scoring-profile <profile>\",\n \"scoring profile: default (balanced) or personal (down-weights single-maintainer ownership penalties for risk and health ownership)\",\n )\n .choices([\"default\", \"personal\"])\n .default(\"default\");\n\nprogram\n .name(\"codesentinel\")\n .description(\"Structural and evolutionary risk analysis for TypeScript/JavaScript codebases\")\n .version(version);\n\nprogram\n .command(\"update\")\n .description(\"check for a newer CodeSentinel version and install it\")\n .action(async () => {\n process.exitCode = await runManualCliUpdate({\n packageName: \"@getcodesentinel/codesentinel\",\n currentVersion: version,\n });\n });\n\nprogram\n .command(\"analyze\")\n .argument(\"[path]\", \"path to the project to analyze\")\n .addOption(scoringProfileOption())\n .addOption(\n new Option(\n \"--author-identity <mode>\",\n \"author identity mode: likely_merge (heuristic) or strict_email (deterministic)\",\n )\n .choices([\"likely_merge\", \"strict_email\"])\n .default(\"likely_merge\"),\n )\n .addOption(\n new Option(\n \"--log-level <level>\",\n \"log verbosity: silent, error, warn, info, debug (logs are written to stderr)\",\n )\n .choices([\"silent\", \"error\", \"warn\", \"info\", \"debug\"])\n .default(parseLogLevel(process.env[\"CODESENTINEL_LOG_LEVEL\"])),\n )\n .addOption(\n new Option(\"--output <mode>\", \"output mode: summary (default) or json (full analysis object)\")\n .choices([\"summary\", \"json\"])\n .default(\"summary\"),\n )\n .option(\"--json\", \"shortcut for --output json\")\n .addOption(\n new Option(\n \"--recent-window-days <days>\",\n \"git recency window in days used for evolution volatility metrics\",\n )\n .argParser(parseRecentWindowDays)\n .default(30),\n )\n .action(\n async (\n path: string | undefined,\n options: {\n authorIdentity: AuthorIdentityCliMode;\n scoringProfile: ScoringProfileCliMode;\n logLevel: LogLevel;\n output: AnalyzeOutputMode;\n json?: boolean;\n recentWindowDays: number;\n },\n ) => {\n const logger = createStderrLogger(options.logLevel);\n const summary = await runAnalyzeCommand(\n path,\n options.authorIdentity,\n { recentWindowDays: options.recentWindowDays, scoringProfile: options.scoringProfile },\n logger,\n );\n const outputMode: AnalyzeOutputMode = options.json === true ? \"json\" : options.output;\n process.stdout.write(`${formatAnalyzeOutput(summary, outputMode)}\\n`);\n },\n );\n\nprogram\n .command(\"explain\")\n .argument(\"[path]\", \"path to the project to analyze\")\n .addOption(scoringProfileOption())\n .addOption(\n new Option(\n \"--author-identity <mode>\",\n \"author identity mode: likely_merge (heuristic) or strict_email (deterministic)\",\n )\n .choices([\"likely_merge\", \"strict_email\"])\n .default(\"likely_merge\"),\n )\n .addOption(\n new Option(\n \"--log-level <level>\",\n \"log verbosity: silent, error, warn, info, debug (logs are written to stderr)\",\n )\n .choices([\"silent\", \"error\", \"warn\", \"info\", \"debug\"])\n .default(parseLogLevel(process.env[\"CODESENTINEL_LOG_LEVEL\"])),\n )\n .option(\"--file <path>\", \"explain a specific file target\")\n .option(\"--module <name>\", \"explain a specific module target\")\n .option(\"--top <count>\", \"number of top hotspots to explain when no target is selected\", \"5\")\n .addOption(\n new Option(\n \"--recent-window-days <days>\",\n \"git recency window in days used for evolution volatility metrics\",\n )\n .argParser(parseRecentWindowDays)\n .default(30),\n )\n .addOption(\n new Option(\"--format <mode>\", \"output format: text, json, md\")\n .choices([\"text\", \"json\", \"md\"])\n .default(\"md\"),\n )\n .action(\n async (\n path: string | undefined,\n options: {\n authorIdentity: AuthorIdentityCliMode;\n scoringProfile: ScoringProfileCliMode;\n logLevel: LogLevel;\n file?: string;\n module?: string;\n top: string;\n recentWindowDays: number;\n format: ExplainFormat;\n },\n ) => {\n const logger = createStderrLogger(options.logLevel);\n const top = Number.parseInt(options.top, 10);\n const explainOptions = {\n ...(options.file === undefined ? {} : { file: options.file }),\n ...(options.module === undefined ? {} : { module: options.module }),\n top: Number.isFinite(top) ? top : 5,\n recentWindowDays: options.recentWindowDays,\n scoringProfile: options.scoringProfile,\n format: options.format,\n };\n const result = await runExplainCommand(path, options.authorIdentity, explainOptions, logger);\n process.stdout.write(`${formatExplainOutput(result, options.format)}\\n`);\n },\n );\n\nprogram\n .command(\"dependency-risk\")\n .argument(\"<dependency>\", \"dependency spec to evaluate (for example: react or react@19.0.0)\")\n .addOption(\n new Option(\n \"--log-level <level>\",\n \"log verbosity: silent, error, warn, info, debug (logs are written to stderr)\",\n )\n .choices([\"silent\", \"error\", \"warn\", \"info\", \"debug\"])\n .default(parseLogLevel(process.env[\"CODESENTINEL_LOG_LEVEL\"])),\n )\n .addOption(\n new Option(\"--output <mode>\", \"output mode: summary (default) or json (full analysis object)\")\n .choices([\"summary\", \"json\"])\n .default(\"summary\"),\n )\n .option(\"--json\", \"shortcut for --output json\")\n .option(\"--max-nodes <count>\", \"maximum dependency nodes to resolve\", \"250\")\n .option(\"--max-depth <count>\", \"maximum dependency depth to traverse\", \"6\")\n .action(\n async (\n dependency: string,\n options: {\n logLevel: LogLevel;\n output: DependencyRiskOutputMode;\n json?: boolean;\n maxNodes: string;\n maxDepth: string;\n },\n ) => {\n const logger = createStderrLogger(options.logLevel);\n const maxNodes = Number.parseInt(options.maxNodes, 10);\n const maxDepth = Number.parseInt(options.maxDepth, 10);\n\n logger.info(`analyzing dependency candidate: ${dependency}`);\n const result = await analyzeDependencyCandidateFromRegistry({\n dependency,\n maxNodes: Number.isFinite(maxNodes) ? maxNodes : 250,\n maxDepth: Number.isFinite(maxDepth) ? maxDepth : 6,\n });\n if (result.available) {\n logger.info(\n `dependency analysis completed (${result.dependency.name}@${result.dependency.resolvedVersion})`,\n );\n } else {\n logger.warn(`dependency analysis unavailable: ${result.reason}`);\n }\n\n const outputMode: DependencyRiskOutputMode = options.json === true ? \"json\" : options.output;\n process.stdout.write(`${formatDependencyRiskOutput(result, outputMode)}\\n`);\n },\n );\n\nprogram\n .command(\"report\")\n .argument(\"[path]\", \"path to the project to analyze\")\n .addOption(scoringProfileOption())\n .addOption(\n new Option(\n \"--author-identity <mode>\",\n \"author identity mode: likely_merge (heuristic) or strict_email (deterministic)\",\n )\n .choices([\"likely_merge\", \"strict_email\"])\n .default(\"likely_merge\"),\n )\n .addOption(\n new Option(\n \"--log-level <level>\",\n \"log verbosity: silent, error, warn, info, debug (logs are written to stderr)\",\n )\n .choices([\"silent\", \"error\", \"warn\", \"info\", \"debug\"])\n .default(parseLogLevel(process.env[\"CODESENTINEL_LOG_LEVEL\"])),\n )\n .addOption(\n new Option(\"--format <mode>\", \"output format: text, json, md\")\n .choices([\"text\", \"json\", \"md\"])\n .default(\"md\"),\n )\n .option(\"--output <path>\", \"write rendered report to a file path\")\n .option(\"--compare <baseline>\", \"compare against a baseline snapshot JSON file\")\n .option(\"--snapshot <path>\", \"write current snapshot JSON artifact\")\n .option(\"--no-trace\", \"disable trace embedding in generated snapshot\")\n .addOption(\n new Option(\n \"--recent-window-days <days>\",\n \"git recency window in days used for evolution volatility metrics\",\n )\n .argParser(parseRecentWindowDays)\n .default(30),\n )\n .action(\n async (\n path: string | undefined,\n options: {\n authorIdentity: AuthorIdentityCliMode;\n scoringProfile: ScoringProfileCliMode;\n logLevel: LogLevel;\n format: \"text\" | \"json\" | \"md\";\n output?: string;\n compare?: string;\n snapshot?: string;\n trace: boolean;\n recentWindowDays: number;\n },\n ) => {\n const logger = createStderrLogger(options.logLevel);\n const result = await runReportCommand(\n path,\n options.authorIdentity,\n {\n format: options.format,\n ...(options.output === undefined ? {} : { outputPath: options.output }),\n ...(options.compare === undefined ? {} : { comparePath: options.compare }),\n ...(options.snapshot === undefined ? {} : { snapshotPath: options.snapshot }),\n includeTrace: options.trace,\n scoringProfile: options.scoringProfile,\n recentWindowDays: options.recentWindowDays,\n },\n logger,\n );\n\n if (options.output === undefined) {\n process.stdout.write(`${result.rendered}\\n`);\n }\n },\n );\n\nprogram\n .command(\"run\")\n .argument(\"[path]\", \"path to the project to analyze\")\n .addOption(scoringProfileOption())\n .addOption(\n new Option(\n \"--author-identity <mode>\",\n \"author identity mode: likely_merge (heuristic) or strict_email (deterministic)\",\n )\n .choices([\"likely_merge\", \"strict_email\"])\n .default(\"likely_merge\"),\n )\n .addOption(\n new Option(\n \"--log-level <level>\",\n \"log verbosity: silent, error, warn, info, debug (logs are written to stderr)\",\n )\n .choices([\"silent\", \"error\", \"warn\", \"info\", \"debug\"])\n .default(parseLogLevel(process.env[\"CODESENTINEL_LOG_LEVEL\"])),\n )\n .addOption(\n new Option(\"--format <mode>\", \"combined output format: text, md, json\")\n .choices([\"text\", \"md\", \"json\"])\n .default(\"md\"),\n )\n .addOption(\n new Option(\"--detail <level>\", \"run detail level: compact (default), standard, full\")\n .choices([\"compact\", \"standard\", \"full\"])\n .default(\"compact\"),\n )\n .option(\"--file <path>\", \"explain a specific file target\")\n .option(\"--module <name>\", \"explain a specific module target\")\n .option(\"--top <count>\", \"number of top hotspots to explain when no target is selected\", \"5\")\n .option(\"--compare <baseline>\", \"compare against a baseline snapshot JSON file\")\n .option(\"--snapshot <path>\", \"write current snapshot JSON artifact\")\n .option(\"--no-trace\", \"disable trace embedding in generated snapshot\")\n .addOption(\n new Option(\n \"--recent-window-days <days>\",\n \"git recency window in days used for evolution volatility metrics\",\n )\n .argParser(parseRecentWindowDays)\n .default(30),\n )\n .action(\n async (\n path: string | undefined,\n options: {\n authorIdentity: AuthorIdentityCliMode;\n scoringProfile: ScoringProfileCliMode;\n logLevel: LogLevel;\n format: \"text\" | \"md\" | \"json\";\n detail: RunDetail;\n file?: string;\n module?: string;\n top: string;\n compare?: string;\n snapshot?: string;\n trace: boolean;\n recentWindowDays: number;\n },\n ) => {\n const logger = createStderrLogger(options.logLevel);\n const top = Number.parseInt(options.top, 10);\n\n const explain = await runExplainCommand(\n path,\n options.authorIdentity,\n {\n ...(options.file === undefined ? {} : { file: options.file }),\n ...(options.module === undefined ? {} : { module: options.module }),\n top: Number.isFinite(top) ? top : 5,\n format: options.format as ExplainFormat,\n recentWindowDays: options.recentWindowDays,\n scoringProfile: options.scoringProfile,\n },\n logger,\n );\n\n const snapshot = createSnapshot({\n analysis: explain.summary,\n ...(options.trace === true ? { trace: explain.trace } : {}),\n });\n\n if (options.snapshot !== undefined) {\n await writeFile(options.snapshot, JSON.stringify(snapshot, null, 2), \"utf8\");\n logger.info(`snapshot written: ${options.snapshot}`);\n }\n\n const report =\n options.compare === undefined\n ? createReport(snapshot)\n : createReport(\n snapshot,\n compareSnapshots(snapshot, parseSnapshot(await readFile(options.compare, \"utf8\"))),\n );\n\n if (options.format === \"json\") {\n const analyzeSummaryOutput = formatAnalyzeOutput(explain.summary, \"summary\");\n\n if (options.detail === \"compact\") {\n process.stdout.write(\n `${JSON.stringify(\n {\n schemaVersion: \"codesentinel.run.v1\",\n generatedAt: new Date().toISOString(),\n repository: report.repository,\n keyDrivers: extractSummaryValue(\n extractExplainTextSummary(formatExplainOutput(explain, \"text\")),\n \"key drivers\",\n ),\n priorityActions: extractSummaryValue(\n extractExplainTextSummary(formatExplainOutput(explain, \"text\")),\n \"priority actions\",\n ),\n topHotspots: report.hotspots.slice(0, 3).map((hotspot) => ({\n target: hotspot.target,\n score: hotspot.score,\n })),\n },\n null,\n 2,\n )}\\n`,\n );\n return;\n }\n\n if (options.detail === \"standard\") {\n const analyzeSummaryPayload: unknown = JSON.parse(analyzeSummaryOutput);\n\n process.stdout.write(\n `${JSON.stringify(\n {\n schemaVersion: \"codesentinel.run.v1\",\n generatedAt: new Date().toISOString(),\n analyze: analyzeSummaryPayload,\n explain: {\n summary: extractExplainTextSummary(formatExplainOutput(explain, \"text\")),\n },\n report: {\n repository: report.repository,\n health: report.health,\n hotspots: report.hotspots.slice(0, 5),\n structural: report.structural,\n external: report.external,\n },\n },\n null,\n 2,\n )}\\n`,\n );\n return;\n }\n\n process.stdout.write(\n `${JSON.stringify(\n {\n schemaVersion: \"codesentinel.run.v1\",\n generatedAt: new Date().toISOString(),\n analyze: explain.summary,\n explain,\n report,\n },\n null,\n 2,\n )}\\n`,\n );\n return;\n }\n\n const analyzeRendered = formatAnalyzeOutput(explain.summary, \"summary\");\n const explainRendered = formatExplainOutput(explain, options.format);\n\n if (options.detail === \"compact\") {\n if (options.format === \"md\") {\n process.stdout.write(\n `${renderCompactMarkdown(\n report,\n extractExplainMarkdownSummary(formatExplainOutput(explain, \"md\")),\n )}\\n`,\n );\n return;\n }\n\n process.stdout.write(\n `${renderCompactText(report, extractExplainTextSummary(formatExplainOutput(explain, \"text\")))}\\n`,\n );\n return;\n }\n\n if (options.detail === \"standard\") {\n if (options.format === \"md\") {\n process.stdout.write(\n `# CodeSentinel Run\\n\\n## Analyze\\n\\`\\`\\`json\\n${analyzeRendered}\\n\\`\\`\\`\\n\\n## Explain\\n${extractExplainMarkdownSummary(\n formatExplainOutput(explain, \"md\"),\n )}\\n\\n${renderReportHighlightsMarkdown(report)}\\n`,\n );\n return;\n }\n\n process.stdout.write(\n `CodeSentinel Run\\n\\nAnalyze\\n${analyzeRendered}\\n\\nExplain\\n${extractExplainTextSummary(\n formatExplainOutput(explain, \"text\"),\n )}\\n\\nReport\\n${renderReportHighlightsText(report)}\\n`,\n );\n return;\n }\n\n const reportRendered = formatReport(report, options.format as ReportFormat);\n\n if (options.format === \"md\") {\n const explainSection = stripLeadingMarkdownHeading(\n explainRendered,\n \"# CodeSentinel Explanation\",\n );\n const reportSection = stripLeadingMarkdownHeading(reportRendered, \"# CodeSentinel Report\");\n\n process.stdout.write(\n `# CodeSentinel Run\\n\\n## Analyze\\n\\`\\`\\`json\\n${analyzeRendered}\\n\\`\\`\\`\\n\\n## Explain\\n${explainSection}\\n\\n## Report\\n${reportSection}\\n`,\n );\n return;\n }\n\n process.stdout.write(\n `CodeSentinel Run\\n\\nAnalyze\\n${analyzeRendered}\\n\\nExplain\\n${explainRendered}\\n\\nReport\\n${reportRendered}\\n`,\n );\n },\n );\n\nconst parseGateNumber = (value: string | undefined, optionName: string): number | undefined => {\n if (value === undefined) {\n return undefined;\n }\n\n const parsed = Number.parseFloat(value);\n if (!Number.isFinite(parsed)) {\n throw new CheckConfigurationError(`${optionName} must be numeric`);\n }\n\n return parsed;\n};\n\nconst collectOptionValues = (value: string, previous: string[] = []): string[] => {\n return [...previous, value];\n};\n\nconst parseMainBranches = (options: {\n mainBranch?: string[];\n mainBranches?: string;\n}): readonly string[] | undefined => {\n const fromRepeated = options.mainBranch ?? [];\n const fromCsv =\n options.mainBranches === undefined\n ? []\n : options.mainBranches\n .split(\",\")\n .map((value) => value.trim())\n .filter((value) => value.length > 0);\n\n const merged = [...fromRepeated, ...fromCsv];\n if (merged.length === 0) {\n return undefined;\n }\n\n const unique = Array.from(new Set(merged));\n return unique.length > 0 ? unique : undefined;\n};\n\nconst buildGateConfigFromOptions = (options: {\n maxRiskDelta?: string;\n maxHealthDelta?: string;\n noNewCycles?: boolean;\n noNewHighRiskDeps?: boolean;\n maxNewHotspots?: string;\n maxRiskScore?: string;\n minHealthScore?: string;\n newHotspotScoreThreshold?: string;\n failOn: \"error\" | \"warn\";\n}): GateConfig => {\n const maxRiskDelta = parseGateNumber(options.maxRiskDelta, \"--max-risk-delta\");\n const maxHealthDelta = parseGateNumber(options.maxHealthDelta, \"--max-health-delta\");\n const maxNewHotspots = parseGateNumber(options.maxNewHotspots, \"--max-new-hotspots\");\n const maxRiskScore = parseGateNumber(options.maxRiskScore, \"--max-risk-score\");\n const minHealthScore = parseGateNumber(options.minHealthScore, \"--min-health-score\");\n const newHotspotScoreThreshold = parseGateNumber(\n options.newHotspotScoreThreshold,\n \"--new-hotspot-score-threshold\",\n );\n\n return {\n ...(maxRiskDelta === undefined ? {} : { maxRiskDelta }),\n ...(maxHealthDelta === undefined ? {} : { maxHealthDelta }),\n ...(options.noNewCycles === true ? { noNewCycles: true } : {}),\n ...(options.noNewHighRiskDeps === true ? { noNewHighRiskDeps: true } : {}),\n ...(maxNewHotspots === undefined ? {} : { maxNewHotspots }),\n ...(maxRiskScore === undefined ? {} : { maxRiskScore }),\n ...(minHealthScore === undefined ? {} : { minHealthScore }),\n ...(newHotspotScoreThreshold === undefined ? {} : { newHotspotScoreThreshold }),\n failOn: options.failOn,\n };\n};\n\nprogram\n .command(\"check\")\n .argument(\"[path]\", \"path to the project to analyze\")\n .addOption(scoringProfileOption())\n .addOption(\n new Option(\n \"--author-identity <mode>\",\n \"author identity mode: likely_merge (heuristic) or strict_email (deterministic)\",\n )\n .choices([\"likely_merge\", \"strict_email\"])\n .default(\"likely_merge\"),\n )\n .addOption(\n new Option(\n \"--log-level <level>\",\n \"log verbosity: silent, error, warn, info, debug (logs are written to stderr)\",\n )\n .choices([\"silent\", \"error\", \"warn\", \"info\", \"debug\"])\n .default(parseLogLevel(process.env[\"CODESENTINEL_LOG_LEVEL\"])),\n )\n .option(\"--compare <baseline>\", \"baseline snapshot path\")\n .option(\"--max-risk-delta <value>\", \"maximum allowed normalized risk score increase\")\n .option(\n \"--max-health-delta <value>\",\n \"maximum allowed normalized health score regression versus baseline (requires --compare)\",\n )\n .option(\"--no-new-cycles\", \"fail if new structural cycles are introduced\")\n .option(\"--no-new-high-risk-deps\", \"fail if new high-risk direct dependencies are introduced\")\n .option(\"--max-new-hotspots <count>\", \"maximum allowed number of new hotspots\")\n .option(\"--new-hotspot-score-threshold <score>\", \"minimum hotspot score to count as new hotspot\")\n .option(\"--max-risk-score <score>\", \"absolute risk score limit (0..100)\")\n .option(\"--min-health-score <score>\", \"minimum health score threshold (0..100)\")\n .addOption(\n new Option(\"--fail-on <level>\", \"failing severity threshold\")\n .choices([\"error\", \"warn\"])\n .default(\"error\"),\n )\n .addOption(\n new Option(\"--format <mode>\", \"output format: text, json, md\")\n .choices([\"text\", \"json\", \"md\"])\n .default(\"text\"),\n )\n .option(\"--output <path>\", \"write check output to a file path\")\n .option(\"--no-trace\", \"disable trace embedding in generated snapshot\")\n .addOption(\n new Option(\n \"--recent-window-days <days>\",\n \"git recency window in days used for evolution volatility metrics\",\n )\n .argParser(parseRecentWindowDays)\n .default(30),\n )\n .action(\n async (\n path: string | undefined,\n options: {\n authorIdentity: AuthorIdentityCliMode;\n scoringProfile: ScoringProfileCliMode;\n logLevel: LogLevel;\n compare?: string;\n maxRiskDelta?: string;\n maxHealthDelta?: string;\n noNewCycles?: boolean;\n noNewHighRiskDeps?: boolean;\n maxNewHotspots?: string;\n newHotspotScoreThreshold?: string;\n maxRiskScore?: string;\n minHealthScore?: string;\n failOn: \"error\" | \"warn\";\n format: CheckOutputFormat;\n output?: string;\n trace: boolean;\n recentWindowDays: number;\n },\n ) => {\n const logger = createStderrLogger(options.logLevel);\n\n try {\n const gateConfig = buildGateConfigFromOptions(options);\n const result = await runCheckCommand(\n path,\n options.authorIdentity,\n {\n ...(options.compare === undefined ? {} : { baselinePath: options.compare }),\n includeTrace: options.trace,\n scoringProfile: options.scoringProfile,\n recentWindowDays: options.recentWindowDays,\n gateConfig,\n outputFormat: options.format,\n ...(options.output === undefined ? {} : { outputPath: options.output }),\n },\n logger,\n );\n\n if (options.output === undefined) {\n process.stdout.write(`${result.rendered}\\n`);\n }\n\n process.exitCode = result.gateResult.exitCode;\n } catch (error) {\n if (error instanceof CheckConfigurationError) {\n logger.error(error.message);\n process.exitCode = EXIT_CODES.invalidConfiguration;\n return;\n }\n\n logger.error(error instanceof Error ? error.message : \"internal error\");\n process.exitCode = EXIT_CODES.internalError;\n }\n },\n );\n\nprogram\n .command(\"ci\")\n .argument(\"[path]\", \"path to the project to analyze\")\n .addOption(scoringProfileOption())\n .addOption(\n new Option(\n \"--author-identity <mode>\",\n \"author identity mode: likely_merge (heuristic) or strict_email (deterministic)\",\n )\n .choices([\"likely_merge\", \"strict_email\"])\n .default(\"likely_merge\"),\n )\n .addOption(\n new Option(\n \"--log-level <level>\",\n \"log verbosity: silent, error, warn, info, debug (logs are written to stderr)\",\n )\n .choices([\"silent\", \"error\", \"warn\", \"info\", \"debug\"])\n .default(parseLogLevel(process.env[\"CODESENTINEL_LOG_LEVEL\"])),\n )\n .option(\"--baseline <path>\", \"baseline snapshot path\")\n .option(\n \"--baseline-ref <gitRef>\",\n \"resolve baseline snapshot from a git reference (for example origin/main)\",\n )\n .option(\n \"--baseline-sha <sha>\",\n \"explicit baseline commit SHA (only valid with --baseline-ref auto)\",\n )\n .addOption(\n new Option(\n \"--main-branch <name>\",\n \"add a default branch candidate for auto baseline resolution (repeatable)\",\n ).argParser(collectOptionValues),\n )\n .option(\n \"--main-branches <names>\",\n \"comma-separated default branch candidates for auto baseline resolution (for example: main,master)\",\n )\n .option(\"--snapshot <path>\", \"write current snapshot JSON to path\")\n .option(\"--report <path>\", \"write markdown CI summary report\")\n .option(\"--json-output <path>\", \"write machine-readable CI JSON output\")\n .option(\"--max-risk-delta <value>\", \"maximum allowed normalized risk score increase\")\n .option(\n \"--max-health-delta <value>\",\n \"maximum allowed normalized health score regression versus baseline\",\n )\n .option(\"--no-new-cycles\", \"fail if new structural cycles are introduced\")\n .option(\"--no-new-high-risk-deps\", \"fail if new high-risk direct dependencies are introduced\")\n .option(\"--max-new-hotspots <count>\", \"maximum allowed number of new hotspots\")\n .option(\"--new-hotspot-score-threshold <score>\", \"minimum hotspot score to count as new hotspot\")\n .option(\"--max-risk-score <score>\", \"absolute risk score limit (0..100)\")\n .option(\"--min-health-score <score>\", \"minimum health score threshold (0..100)\")\n .addOption(\n new Option(\"--fail-on <level>\", \"failing severity threshold\")\n .choices([\"error\", \"warn\"])\n .default(\"error\"),\n )\n .option(\"--no-trace\", \"disable trace embedding in generated snapshot\")\n .addOption(\n new Option(\n \"--recent-window-days <days>\",\n \"git recency window in days used for evolution volatility metrics\",\n )\n .argParser(parseRecentWindowDays)\n .default(30),\n )\n .action(\n async (\n path: string | undefined,\n options: {\n authorIdentity: AuthorIdentityCliMode;\n scoringProfile: ScoringProfileCliMode;\n logLevel: LogLevel;\n baseline?: string;\n baselineRef?: string;\n baselineSha?: string;\n mainBranch?: string[];\n mainBranches?: string;\n snapshot?: string;\n report?: string;\n jsonOutput?: string;\n maxRiskDelta?: string;\n maxHealthDelta?: string;\n noNewCycles?: boolean;\n noNewHighRiskDeps?: boolean;\n maxNewHotspots?: string;\n newHotspotScoreThreshold?: string;\n maxRiskScore?: string;\n minHealthScore?: string;\n failOn: \"error\" | \"warn\";\n trace: boolean;\n recentWindowDays: number;\n },\n ) => {\n const logger = createStderrLogger(options.logLevel);\n\n try {\n const gateConfig = buildGateConfigFromOptions(options);\n const mainBranchCandidates = parseMainBranches(options);\n const result = await runCiCommand(\n path,\n options.authorIdentity,\n {\n ...(options.baseline === undefined ? {} : { baselinePath: options.baseline }),\n ...(options.baselineRef === undefined ? {} : { baselineRef: options.baselineRef }),\n ...(options.baselineSha === undefined ? {} : { baselineSha: options.baselineSha }),\n ...(mainBranchCandidates === undefined ? {} : { mainBranchCandidates }),\n ...(options.snapshot === undefined ? {} : { snapshotPath: options.snapshot }),\n ...(options.report === undefined ? {} : { reportPath: options.report }),\n ...(options.jsonOutput === undefined ? {} : { jsonOutputPath: options.jsonOutput }),\n includeTrace: options.trace,\n scoringProfile: options.scoringProfile,\n recentWindowDays: options.recentWindowDays,\n gateConfig,\n },\n logger,\n );\n\n if (options.report === undefined) {\n process.stdout.write(`${result.markdownSummary}\\n`);\n }\n\n process.exitCode = result.gateResult.exitCode;\n } catch (error) {\n if (error instanceof CiConfigurationError) {\n logger.error(error.message);\n process.exitCode = EXIT_CODES.invalidConfiguration;\n return;\n }\n\n logger.error(error instanceof Error ? error.message : \"internal error\");\n process.exitCode = EXIT_CODES.internalError;\n }\n },\n );\n\nconst executablePath = process.argv[0] ?? \"\";\nconst scriptPath = process.argv[1] ?? \"\";\n\nconst argv =\n process.argv[2] === \"--\" ? [executablePath, scriptPath, ...process.argv.slice(3)] : process.argv;\n\nif (argv.length <= 2) {\n if (process.stdin.isTTY && process.stdout.isTTY && process.stderr.isTTY) {\n process.exitCode = await runInteractiveCliMenu({\n currentVersion: version,\n scriptPath,\n });\n process.exit(process.exitCode ?? 0);\n }\n\n program.outputHelp();\n process.exit(0);\n}\n\nif (argv[2] !== \"update\") {\n await checkForCliUpdates({\n packageName: \"@getcodesentinel/codesentinel\",\n currentVersion: version,\n argv: process.argv,\n env: process.env,\n });\n}\n\nawait program.parseAsync(argv);\n","import type {\n CentralDependency,\n DependencyExposureRecord,\n DependencyRiskSignal,\n ExternalAnalysisSummary,\n} from \"@codesentinel/core\";\nimport type {\n DependencyMetadata,\n ExternalAnalysisConfig,\n LockfileExtraction,\n LockedDependencyNode,\n} from \"./types.js\";\n\nconst round4 = (value: number): number => Number(value.toFixed(4));\n\ntype NormalizedNode = {\n key: string;\n name: string;\n version: string;\n dependencies: readonly string[];\n};\n\nconst normalizeNodes = (nodes: readonly LockedDependencyNode[]): readonly NormalizedNode[] => {\n const byName = new Map<string, LockedDependencyNode[]>();\n\n for (const node of nodes) {\n const bucket = byName.get(node.name) ?? [];\n bucket.push(node);\n byName.set(node.name, bucket);\n }\n\n const normalized: NormalizedNode[] = [];\n\n for (const [name, candidates] of byName.entries()) {\n if (candidates.length === 0) {\n continue;\n }\n\n candidates.sort((a, b) => b.version.localeCompare(a.version));\n const selected = candidates[0];\n if (selected === undefined) {\n continue;\n }\n\n const deps = selected.dependencies\n .map((dep) => {\n const at = dep.lastIndexOf(\"@\");\n return at <= 0 ? dep : dep.slice(0, at);\n })\n .filter((depName) => depName.length > 0)\n .sort((a, b) => a.localeCompare(b));\n\n normalized.push({\n key: `${name}@${selected.version}`,\n name,\n version: selected.version,\n dependencies: deps,\n });\n }\n\n return normalized.sort((a, b) => a.name.localeCompare(b.name));\n};\n\nconst computeDepths = (\n nodeByName: ReadonlyMap<string, NormalizedNode>,\n directNames: ReadonlySet<string>,\n): { depthByName: ReadonlyMap<string, number>; maxDepth: number } => {\n const visiting = new Set<string>();\n const depthByName = new Map<string, number>();\n\n const compute = (name: string): number => {\n const known = depthByName.get(name);\n if (known !== undefined) {\n return known;\n }\n\n if (visiting.has(name)) {\n return 0;\n }\n\n visiting.add(name);\n\n const node = nodeByName.get(name);\n if (node === undefined) {\n visiting.delete(name);\n depthByName.set(name, 0);\n return 0;\n }\n\n let maxChildDepth = 0;\n for (const dependencyName of node.dependencies) {\n const childDepth = compute(dependencyName);\n if (childDepth > maxChildDepth) {\n maxChildDepth = childDepth;\n }\n }\n\n visiting.delete(name);\n const ownDepth = directNames.has(name) ? 0 : maxChildDepth + 1;\n depthByName.set(name, ownDepth);\n return ownDepth;\n };\n\n for (const name of nodeByName.keys()) {\n compute(name);\n }\n\n let maxDepth = 0;\n for (const depth of depthByName.values()) {\n if (depth > maxDepth) {\n maxDepth = depth;\n }\n }\n\n return { depthByName, maxDepth };\n};\n\nconst rankCentrality = (\n nodes: readonly NormalizedNode[],\n dependentsByName: ReadonlyMap<string, number>,\n directNames: ReadonlySet<string>,\n topN: number,\n): readonly CentralDependency[] =>\n [...nodes]\n .map((node) => ({\n name: node.name,\n dependents: dependentsByName.get(node.name) ?? 0,\n fanOut: node.dependencies.length,\n direct: directNames.has(node.name),\n }))\n .sort(\n (a, b) => b.dependents - a.dependents || b.fanOut - a.fanOut || a.name.localeCompare(b.name),\n )\n .slice(0, topN);\n\nconst canPropagateSignal = (signal: DependencyRiskSignal): boolean =>\n signal === \"abandoned\" ||\n signal === \"high_centrality\" ||\n signal === \"deep_chain\" ||\n signal === \"high_fanout\";\n\nconst collectTransitiveDependencies = (\n rootName: string,\n nodeByName: ReadonlyMap<string, NormalizedNode>,\n): readonly string[] => {\n const seen = new Set<string>();\n const stack = [...(nodeByName.get(rootName)?.dependencies ?? [])];\n\n while (stack.length > 0) {\n const current = stack.pop();\n if (current === undefined || seen.has(current) || current === rootName) {\n continue;\n }\n\n seen.add(current);\n const currentNode = nodeByName.get(current);\n if (currentNode === undefined) {\n continue;\n }\n\n for (const next of currentNode.dependencies) {\n if (!seen.has(next)) {\n stack.push(next);\n }\n }\n }\n\n return [...seen].sort((a, b) => a.localeCompare(b));\n};\n\nexport const buildExternalAnalysisSummary = (\n targetPath: string,\n extraction: LockfileExtraction,\n metadataByKey: ReadonlyMap<string, DependencyMetadata | null>,\n config: ExternalAnalysisConfig,\n): ExternalAnalysisSummary => {\n const nodes = normalizeNodes(extraction.nodes);\n const directNames = new Set(extraction.directDependencies.map((dep) => dep.name));\n const directSpecByName = new Map(extraction.directDependencies.map((dep) => [dep.name, dep]));\n\n const nodeByName = new Map(nodes.map((node) => [node.name, node]));\n const dependentsByName = new Map<string, number>();\n\n for (const node of nodes) {\n dependentsByName.set(node.name, dependentsByName.get(node.name) ?? 0);\n }\n\n for (const node of nodes) {\n for (const dependencyName of node.dependencies) {\n if (!nodeByName.has(dependencyName)) {\n continue;\n }\n\n dependentsByName.set(dependencyName, (dependentsByName.get(dependencyName) ?? 0) + 1);\n }\n }\n\n const { depthByName, maxDepth } = computeDepths(nodeByName, directNames);\n const centralityRanking = rankCentrality(\n nodes,\n dependentsByName,\n directNames,\n config.centralityTopN,\n );\n\n const topCentralNames = new Set(\n centralityRanking\n .slice(0, Math.max(1, Math.ceil(centralityRanking.length * 0.25)))\n .map((entry) => entry.name),\n );\n\n const allDependencies: DependencyExposureRecord[] = [];\n let metadataAvailableCount = 0;\n\n for (const node of nodes) {\n const metadata = metadataByKey.get(node.key) ?? null;\n if (metadata !== null) {\n metadataAvailableCount += 1;\n }\n\n const dependencyDepth = depthByName.get(node.name) ?? 0;\n const dependents = dependentsByName.get(node.name) ?? 0;\n\n const riskSignals: DependencyRiskSignal[] = [];\n\n if ((metadata?.maintainerCount ?? 0) === 1) {\n riskSignals.push(\"single_maintainer\");\n }\n\n if ((metadata?.daysSinceLastRelease ?? 0) >= config.abandonedDaysThreshold) {\n riskSignals.push(\"abandoned\");\n }\n\n if (topCentralNames.has(node.name) && dependents > 0) {\n riskSignals.push(\"high_centrality\");\n }\n\n if (dependencyDepth >= config.deepChainThreshold) {\n riskSignals.push(\"deep_chain\");\n }\n\n if (node.dependencies.length >= config.fanOutHighThreshold) {\n riskSignals.push(\"high_fanout\");\n }\n\n if (metadata === null) {\n riskSignals.push(\"metadata_unavailable\");\n }\n\n allDependencies.push({\n name: node.name,\n direct: directNames.has(node.name),\n dependencyScope: directSpecByName.get(node.name)?.scope ?? \"prod\",\n requestedRange: directSpecByName.get(node.name)?.requestedRange ?? null,\n resolvedVersion: node.version,\n transitiveDependencies: [],\n weeklyDownloads: metadata?.weeklyDownloads ?? null,\n dependencyDepth,\n fanOut: node.dependencies.length,\n dependents,\n maintainerCount: metadata?.maintainerCount ?? null,\n releaseFrequencyDays: metadata?.releaseFrequencyDays ?? null,\n daysSinceLastRelease: metadata?.daysSinceLastRelease ?? null,\n repositoryActivity30d: metadata?.repositoryActivity30d ?? null,\n busFactor: metadata?.busFactor ?? null,\n ownRiskSignals: [...riskSignals].sort((a, b) => a.localeCompare(b)),\n inheritedRiskSignals: [],\n riskSignals,\n });\n }\n\n allDependencies.sort((a, b) => a.name.localeCompare(b.name));\n\n const allByName = new Map(allDependencies.map((dep) => [dep.name, dep]));\n\n const dependencies: DependencyExposureRecord[] = allDependencies\n .filter((dep) => dep.direct)\n .map((dep) => {\n const transitiveDependencies = collectTransitiveDependencies(dep.name, nodeByName);\n const inheritedSignals = new Set<DependencyRiskSignal>();\n const allSignals = new Set(dep.ownRiskSignals);\n\n for (const transitiveName of transitiveDependencies) {\n const transitive = allByName.get(transitiveName);\n if (transitive === undefined) {\n continue;\n }\n\n for (const signal of transitive.riskSignals) {\n if (canPropagateSignal(signal)) {\n inheritedSignals.add(signal);\n allSignals.add(signal);\n }\n }\n }\n\n return {\n ...dep,\n transitiveDependencies,\n inheritedRiskSignals: [...inheritedSignals].sort((a, b) => a.localeCompare(b)),\n riskSignals: [...allSignals].sort((a, b) => a.localeCompare(b)),\n };\n })\n .sort((a, b) => a.name.localeCompare(b.name));\n\n const highRiskDependencies = dependencies\n .filter(\n (dep) =>\n dep.ownRiskSignals.includes(\"abandoned\") ||\n dep.ownRiskSignals.filter(\n (signal) =>\n signal === \"high_centrality\" || signal === \"deep_chain\" || signal === \"high_fanout\",\n ).length >= 2 ||\n (dep.ownRiskSignals.includes(\"single_maintainer\") &&\n ((dep.daysSinceLastRelease ?? 0) >= config.abandonedDaysThreshold / 2 ||\n (dep.repositoryActivity30d ?? 1) <= 0)),\n )\n .filter((dep) => dep.dependencyScope === \"prod\")\n .sort(\n (a, b) => b.ownRiskSignals.length - a.ownRiskSignals.length || a.name.localeCompare(b.name),\n )\n .slice(0, config.maxHighRiskDependencies)\n .map((dep) => dep.name);\n\n const highRiskDevelopmentDependencies = dependencies\n .filter(\n (dep) =>\n dep.dependencyScope === \"dev\" &&\n (dep.ownRiskSignals.includes(\"abandoned\") ||\n dep.ownRiskSignals.filter(\n (signal) =>\n signal === \"high_centrality\" || signal === \"deep_chain\" || signal === \"high_fanout\",\n ).length >= 2 ||\n (dep.ownRiskSignals.includes(\"single_maintainer\") &&\n ((dep.daysSinceLastRelease ?? 0) >= config.abandonedDaysThreshold / 2 ||\n (dep.repositoryActivity30d ?? 1) <= 0))),\n )\n .sort(\n (a, b) => b.ownRiskSignals.length - a.ownRiskSignals.length || a.name.localeCompare(b.name),\n )\n .slice(0, config.maxHighRiskDependencies)\n .map((dep) => dep.name);\n\n const transitiveExposureDependencies = dependencies\n .filter((dep) => dep.inheritedRiskSignals.length > 0)\n .sort(\n (a, b) =>\n b.inheritedRiskSignals.length - a.inheritedRiskSignals.length ||\n a.name.localeCompare(b.name),\n )\n .map((dep) => dep.name);\n\n const singleMaintainerDependencies = dependencies\n .filter((dep) => dep.ownRiskSignals.includes(\"single_maintainer\"))\n .map((dep) => dep.name)\n .sort((a, b) => a.localeCompare(b));\n\n const abandonedDependencies = dependencies\n .filter((dep) => dep.ownRiskSignals.includes(\"abandoned\"))\n .map((dep) => dep.name)\n .sort((a, b) => a.localeCompare(b));\n\n return {\n targetPath,\n available: true,\n metrics: {\n totalDependencies: allDependencies.length,\n directDependencies: dependencies.length,\n directProductionDependencies: dependencies.filter(\n (dependency) => dependency.dependencyScope === \"prod\",\n ).length,\n directDevelopmentDependencies: dependencies.filter(\n (dependency) => dependency.dependencyScope === \"dev\",\n ).length,\n transitiveDependencies: allDependencies.length - dependencies.length,\n dependencyDepth: maxDepth,\n lockfileKind: extraction.kind,\n metadataCoverage:\n allDependencies.length === 0 ? 0 : round4(metadataAvailableCount / allDependencies.length),\n },\n dependencies,\n highRiskDependencies,\n highRiskDevelopmentDependencies,\n transitiveExposureDependencies,\n singleMaintainerDependencies,\n abandonedDependencies,\n centralityRanking,\n };\n};\n","export type LockfileKind = \"pnpm\" | \"npm\" | \"npm-shrinkwrap\" | \"yarn\" | \"bun\";\n\nexport type DirectDependencySpec = {\n name: string;\n requestedRange: string;\n scope: \"prod\" | \"dev\";\n};\n\nexport type LockedDependencyNode = {\n name: string;\n version: string;\n dependencies: readonly string[];\n};\n\nexport type LockfileExtraction = {\n kind: LockfileKind;\n directDependencies: readonly DirectDependencySpec[];\n nodes: readonly LockedDependencyNode[];\n};\n\nexport type DependencyMetadata = {\n name: string;\n version: string;\n weeklyDownloads: number | null;\n maintainerCount: number | null;\n releaseFrequencyDays: number | null;\n daysSinceLastRelease: number | null;\n repositoryActivity30d: number | null;\n busFactor: number | null;\n};\n\nexport type DependencyMetadataRequestContext = {\n directDependency: boolean;\n};\n\nexport interface DependencyMetadataProvider {\n getMetadata(\n name: string,\n version: string,\n context: DependencyMetadataRequestContext,\n ): Promise<DependencyMetadata | null>;\n}\n\nexport type ExternalAnalysisConfig = {\n abandonedDaysThreshold: number;\n deepChainThreshold: number;\n fanOutHighThreshold: number;\n centralityTopN: number;\n maxHighRiskDependencies: number;\n metadataRequestConcurrency: number;\n};\n\nexport const DEFAULT_EXTERNAL_ANALYSIS_CONFIG: ExternalAnalysisConfig = {\n abandonedDaysThreshold: 540,\n deepChainThreshold: 6,\n fanOutHighThreshold: 25,\n centralityTopN: 20,\n maxHighRiskDependencies: 100,\n metadataRequestConcurrency: 8,\n};\n","export const mapWithConcurrency = async <T, R>(\n values: readonly T[],\n limit: number,\n handler: (value: T) => Promise<R>,\n): Promise<readonly R[]> => {\n const effectiveLimit = Math.max(1, limit);\n const workerCount = Math.min(effectiveLimit, values.length);\n const UNSET = Symbol(\"map_with_concurrency_unset\");\n const results = new Array<R | typeof UNSET>(values.length).fill(UNSET);\n let index = 0;\n\n const workers: Promise<void>[] = Array.from({ length: workerCount }, async () => {\n // This loop always terminates: each iteration advances `index`,\n // and workers return once `index >= values.length`.\n while (true) {\n const current = index;\n index += 1;\n if (current >= values.length) {\n return;\n }\n\n const value = values[current] as T;\n results[current] = await handler(value);\n }\n });\n\n await Promise.all(workers);\n if (results.some((value) => value === UNSET)) {\n throw new Error(\"map_with_concurrency_incomplete_results\");\n }\n return results as R[];\n};\n","import type { LockfileExtraction, DependencyMetadataProvider } from \"../domain/types.js\";\nimport { mapWithConcurrency } from \"./map-with-concurrency.js\";\n\ntype MetadataEntry = {\n key: string;\n metadata: Awaited<ReturnType<DependencyMetadataProvider[\"getMetadata\"]>>;\n};\n\ntype MetadataProgressEvent = {\n completed: number;\n total: number;\n packageName: string;\n};\n\nexport const collectDependencyMetadata = async (\n extraction: LockfileExtraction,\n metadataProvider: DependencyMetadataProvider,\n concurrency: number,\n onProgress?: (event: MetadataProgressEvent) => void,\n): Promise<readonly MetadataEntry[]> => {\n const directNames = new Set(extraction.directDependencies.map((dependency) => dependency.name));\n let completed = 0;\n\n return mapWithConcurrency(extraction.nodes, concurrency, async (node) => {\n const result = {\n key: `${node.name}@${node.version}`,\n metadata: await metadataProvider.getMetadata(node.name, node.version, {\n directDependency: directNames.has(node.name),\n }),\n };\n completed += 1;\n onProgress?.({\n completed,\n total: extraction.nodes.length,\n packageName: node.name,\n });\n return result;\n });\n};\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport type RepositoryFiles = {\n packageJsonPath: string;\n packageJsonRaw: string;\n lockfilePath: string;\n lockfileRaw: string;\n};\n\nconst LOCKFILE_CANDIDATES: readonly {\n fileName: string;\n kind: \"pnpm\" | \"npm\" | \"npm-shrinkwrap\" | \"yarn\" | \"bun\";\n}[] = [\n { fileName: \"pnpm-lock.yaml\", kind: \"pnpm\" },\n { fileName: \"package-lock.json\", kind: \"npm\" },\n { fileName: \"npm-shrinkwrap.json\", kind: \"npm-shrinkwrap\" },\n { fileName: \"yarn.lock\", kind: \"yarn\" },\n { fileName: \"bun.lock\", kind: \"bun\" },\n { fileName: \"bun.lockb\", kind: \"bun\" },\n];\n\nexport type LockfileSelection = {\n path: string;\n kind: \"pnpm\" | \"npm\" | \"npm-shrinkwrap\" | \"yarn\" | \"bun\";\n raw: string;\n};\n\nexport const loadPackageJson = (repositoryPath: string): { path: string; raw: string } | null => {\n const packageJsonPath = join(repositoryPath, \"package.json\");\n if (!existsSync(packageJsonPath)) {\n return null;\n }\n\n return {\n path: packageJsonPath,\n raw: readFileSync(packageJsonPath, \"utf8\"),\n };\n};\n\nexport const selectLockfile = (repositoryPath: string): LockfileSelection | null => {\n for (const candidate of LOCKFILE_CANDIDATES) {\n const absolutePath = join(repositoryPath, candidate.fileName);\n if (!existsSync(absolutePath)) {\n continue;\n }\n\n return {\n path: absolutePath,\n kind: candidate.kind,\n raw: readFileSync(absolutePath, \"utf8\"),\n };\n }\n\n return null;\n};\n","import type { DirectDependencySpec } from \"../domain/types.js\";\n\ntype ParsedPackageJson = {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n};\n\nexport const parsePackageJson = (raw: string): readonly DirectDependencySpec[] => {\n const parsed = JSON.parse(raw) as ParsedPackageJson;\n const merged = new Map<string, DirectDependencySpec>();\n\n const addBlock = (block: Record<string, string> | undefined, scope: \"prod\" | \"dev\"): void => {\n if (block === undefined) {\n return;\n }\n\n for (const [name, versionRange] of Object.entries(block)) {\n const existing = merged.get(name);\n // Production scope wins when the same package appears in both scopes.\n if (existing?.scope === \"prod\" && scope === \"dev\") {\n continue;\n }\n\n merged.set(name, { name, requestedRange: versionRange, scope });\n }\n };\n\n addBlock(parsed.dependencies, \"prod\");\n addBlock(parsed.optionalDependencies, \"prod\");\n addBlock(parsed.peerDependencies, \"prod\");\n addBlock(parsed.devDependencies, \"dev\");\n\n return [...merged.values()].sort((a, b) => a.name.localeCompare(b.name));\n};\n","import type {\n DirectDependencySpec,\n LockfileExtraction,\n LockedDependencyNode,\n} from \"../domain/types.js\";\n\ntype PackageLockNode = {\n version?: string;\n dependencies?: Record<string, string>;\n};\n\ntype PackageLockShape = {\n lockfileVersion?: number;\n packages?: Record<string, PackageLockNode>;\n dependencies?: Record<string, { version?: string; dependencies?: Record<string, unknown> }>;\n};\n\nexport const parsePackageLock = (\n raw: string,\n directSpecs: readonly DirectDependencySpec[],\n): LockfileExtraction => {\n const parsed = JSON.parse(raw) as PackageLockShape;\n const nodes: LockedDependencyNode[] = [];\n\n if (parsed.packages !== undefined) {\n for (const [packagePath, packageData] of Object.entries(parsed.packages)) {\n if (packagePath.length === 0 || packageData.version === undefined) {\n continue;\n }\n\n const segments = packagePath.split(\"node_modules/\");\n const name = segments[segments.length - 1] ?? \"\";\n if (name.length === 0) {\n continue;\n }\n\n const dependencies = Object.entries(packageData.dependencies ?? {})\n .map(([depName, depRange]) => `${depName}@${String(depRange)}`)\n .sort((a, b) => a.localeCompare(b));\n\n nodes.push({\n name,\n version: packageData.version,\n dependencies,\n });\n }\n } else if (parsed.dependencies !== undefined) {\n for (const [name, dep] of Object.entries(parsed.dependencies)) {\n if (dep.version === undefined) {\n continue;\n }\n\n const dependencies = Object.entries(dep.dependencies ?? {})\n .map(([depName, depVersion]) => `${depName}@${String(depVersion)}`)\n .sort((a, b) => a.localeCompare(b));\n\n nodes.push({\n name,\n version: dep.version,\n dependencies,\n });\n }\n }\n\n nodes.sort((a, b) => a.name.localeCompare(b.name) || a.version.localeCompare(b.version));\n\n return {\n kind: \"npm\",\n directDependencies: directSpecs,\n nodes,\n };\n};\n","import type {\n DirectDependencySpec,\n LockfileExtraction,\n LockedDependencyNode,\n} from \"../domain/types.js\";\n\ntype ParserState = \"root\" | \"importers\" | \"packages\" | \"packageDeps\";\n\nconst sanitizeValue = (value: string): string => value.replace(/^['\"]|['\"]$/g, \"\").trim();\n\nconst parsePackageKey = (rawKey: string): { name: string; version: string } | null => {\n const key = sanitizeValue(rawKey.replace(/:$/, \"\"));\n const withoutSlash = key.startsWith(\"/\") ? key.slice(1) : key;\n\n const lastAt = withoutSlash.lastIndexOf(\"@\");\n if (lastAt <= 0) {\n return null;\n }\n\n const name = withoutSlash.slice(0, lastAt);\n const versionWithPeers = withoutSlash.slice(lastAt + 1);\n const version = versionWithPeers.split(\"(\")[0] ?? versionWithPeers;\n\n if (name.length === 0 || version.length === 0) {\n return null;\n }\n\n return { name, version };\n};\n\nexport const parsePnpmLockfile = (\n raw: string,\n directSpecs: readonly DirectDependencySpec[],\n): LockfileExtraction => {\n const lines = raw.split(\"\\n\");\n let state: ParserState = \"root\";\n let currentPackage: string | null = null;\n let currentDependencyName: string | null = null;\n const dependenciesByNode = new Map<string, Set<string>>();\n\n for (const line of lines) {\n if (line.trim().length === 0 || line.trimStart().startsWith(\"#\")) {\n continue;\n }\n\n if (line.startsWith(\"importers:\")) {\n state = \"importers\";\n continue;\n }\n\n if (line.startsWith(\"packages:\")) {\n state = \"packages\";\n continue;\n }\n\n if (state === \"packages\" || state === \"packageDeps\") {\n const packageMatch = line.match(/^\\s{2}([^\\s].+):\\s*$/);\n if (packageMatch !== null) {\n const parsedKey = parsePackageKey(packageMatch[1] ?? \"\");\n if (parsedKey !== null) {\n currentPackage = `${parsedKey.name}@${parsedKey.version}`;\n dependenciesByNode.set(currentPackage, new Set());\n state = \"packageDeps\";\n currentDependencyName = null;\n }\n continue;\n }\n }\n\n if (state === \"packageDeps\" && currentPackage !== null) {\n const depLine = line.match(/^\\s{6}([^:\\s]+):\\s*(.+)$/);\n if (depLine !== null) {\n const depName = sanitizeValue(depLine[1] ?? \"\");\n const depRef = sanitizeValue(depLine[2] ?? \"\");\n const depVersion = depRef.split(\"(\")[0] ?? depRef;\n\n if (depName.length > 0 && depVersion.length > 0) {\n dependenciesByNode.get(currentPackage)?.add(`${depName}@${depVersion}`);\n }\n currentDependencyName = null;\n continue;\n }\n\n const depBlockLine = line.match(/^\\s{6}([^:\\s]+):\\s*$/);\n if (depBlockLine !== null) {\n currentDependencyName = sanitizeValue(depBlockLine[1] ?? \"\");\n continue;\n }\n\n const depVersionLine = line.match(/^\\s{8}version:\\s*(.+)$/);\n if (depVersionLine !== null && currentDependencyName !== null) {\n const depRef = sanitizeValue(depVersionLine[1] ?? \"\");\n const depVersion = depRef.split(\"(\")[0] ?? depRef;\n if (depVersion.length > 0) {\n dependenciesByNode.get(currentPackage)?.add(`${currentDependencyName}@${depVersion}`);\n }\n currentDependencyName = null;\n continue;\n }\n\n if (line.match(/^\\s{4}(dependencies|optionalDependencies):\\s*$/) !== null) {\n continue;\n }\n }\n }\n\n const nodes: LockedDependencyNode[] = [...dependenciesByNode.entries()]\n .map(([nodeId, deps]) => {\n const at = nodeId.lastIndexOf(\"@\");\n return {\n name: nodeId.slice(0, at),\n version: nodeId.slice(at + 1),\n dependencies: [...deps].sort((a, b) => a.localeCompare(b)),\n };\n })\n .sort((a, b) => a.name.localeCompare(b.name) || a.version.localeCompare(b.version));\n\n return {\n kind: \"pnpm\",\n directDependencies: directSpecs,\n nodes,\n };\n};\n","import type {\n DirectDependencySpec,\n LockfileExtraction,\n LockedDependencyNode,\n} from \"../domain/types.js\";\n\nconst stripQuotes = (value: string): string => value.replace(/^['\"]|['\"]$/g, \"\");\n\nconst parseVersionSelector = (selector: string): string | null => {\n const npmIndex = selector.lastIndexOf(\"@npm:\");\n if (npmIndex >= 0) {\n return selector.slice(npmIndex + 5);\n }\n\n const lastAt = selector.lastIndexOf(\"@\");\n if (lastAt <= 0) {\n return null;\n }\n\n return selector.slice(lastAt + 1);\n};\n\nexport const parseYarnLock = (\n raw: string,\n directSpecs: readonly DirectDependencySpec[],\n): LockfileExtraction => {\n const lines = raw.split(\"\\n\");\n const nodes: LockedDependencyNode[] = [];\n\n let selectors: string[] = [];\n let version: string | null = null;\n let readingDependencies = false;\n let dependencies: string[] = [];\n\n const flushEntry = (): void => {\n if (selectors.length === 0 || version === null) {\n selectors = [];\n version = null;\n dependencies = [];\n readingDependencies = false;\n return;\n }\n\n for (const selector of selectors) {\n const parsedVersion = parseVersionSelector(selector);\n const at = selector.lastIndexOf(\"@\");\n const name = at <= 0 ? selector : selector.slice(0, at);\n if (name.length === 0) {\n continue;\n }\n\n nodes.push({\n name,\n version,\n dependencies: [...dependencies].sort((a, b) => a.localeCompare(b)),\n });\n\n if (parsedVersion !== null) {\n nodes.push({\n name,\n version: parsedVersion,\n dependencies: [...dependencies].sort((a, b) => a.localeCompare(b)),\n });\n }\n }\n\n selectors = [];\n version = null;\n dependencies = [];\n readingDependencies = false;\n };\n\n for (const line of lines) {\n if (line.trim().length === 0) {\n continue;\n }\n\n if (!line.startsWith(\" \") && line.endsWith(\":\")) {\n flushEntry();\n const keyText = line.slice(0, -1);\n selectors = keyText\n .split(\",\")\n .map((part) => stripQuotes(part.trim()))\n .filter((part) => part.length > 0);\n continue;\n }\n\n if (line.match(/^\\s{2}version\\s+/) !== null) {\n const value = line.replace(/^\\s{2}version\\s+/, \"\").trim();\n version = stripQuotes(value);\n readingDependencies = false;\n continue;\n }\n\n if (line.match(/^\\s{2}dependencies:\\s*$/) !== null) {\n readingDependencies = true;\n continue;\n }\n\n if (readingDependencies && line.match(/^\\s{4}[^\\s].+$/) !== null) {\n const depLine = line.trim();\n const firstSpace = depLine.indexOf(\" \");\n if (firstSpace <= 0) {\n continue;\n }\n\n const depName = stripQuotes(depLine.slice(0, firstSpace));\n const depRef = stripQuotes(depLine.slice(firstSpace + 1).trim());\n const depVersion = parseVersionSelector(depRef) ?? depRef;\n dependencies.push(`${depName}@${depVersion}`);\n continue;\n }\n\n readingDependencies = false;\n }\n\n flushEntry();\n\n const deduped = new Map<string, LockedDependencyNode>();\n for (const node of nodes) {\n const key = `${node.name}@${node.version}`;\n if (!deduped.has(key)) {\n deduped.set(key, node);\n }\n }\n\n return {\n kind: \"yarn\",\n directDependencies: directSpecs,\n nodes: [...deduped.values()].sort(\n (a, b) => a.name.localeCompare(b.name) || a.version.localeCompare(b.version),\n ),\n };\n};\n","import type { DirectDependencySpec, LockfileExtraction } from \"../domain/types.js\";\n\nexport const parseBunLock = (\n _raw: string,\n _directSpecs: readonly DirectDependencySpec[],\n): LockfileExtraction => {\n throw new Error(\"unsupported_lockfile_format\");\n};\n","import type { LockfileExtraction } from \"../domain/types.js\";\nimport type { parsePackageJson } from \"../parsing/package-json-loader.js\";\nimport { parsePackageLock } from \"../parsing/package-lock-parser.js\";\nimport { parsePnpmLockfile } from \"../parsing/pnpm-lock-parser.js\";\nimport { parseYarnLock } from \"../parsing/yarn-lock-parser.js\";\nimport { parseBunLock } from \"../parsing/bun-lock-parser.js\";\n\ntype SupportedLockfileKind = \"pnpm\" | \"npm\" | \"npm-shrinkwrap\" | \"yarn\" | \"bun\";\n\nexport const parseLockfileExtraction = (\n lockfileKind: SupportedLockfileKind,\n lockfileRaw: string,\n directSpecs: ReturnType<typeof parsePackageJson>,\n): LockfileExtraction => {\n switch (lockfileKind) {\n case \"pnpm\":\n return parsePnpmLockfile(lockfileRaw, directSpecs);\n case \"npm\":\n case \"npm-shrinkwrap\":\n return {\n ...parsePackageLock(lockfileRaw, directSpecs),\n kind: lockfileKind,\n };\n case \"yarn\":\n return parseYarnLock(lockfileRaw, directSpecs);\n case \"bun\":\n return parseBunLock(lockfileRaw, directSpecs);\n default:\n throw new Error(\"unsupported_lockfile_format\");\n }\n};\n","import type { CacheStore } from \"./cache-store.js\";\n\ntype CachedFetchOptions<T> = {\n key: string;\n ttlMs: number;\n cacheStore: CacheStore | null;\n fetchFresh: () => Promise<T | null>;\n nowMs?: number;\n};\n\nexport const cachedFetch = async <T>(options: CachedFetchOptions<T>): Promise<T | null> => {\n const nowMs = options.nowMs ?? Date.now();\n const cachedEntry =\n options.cacheStore === null ? null : await options.cacheStore.get<T>(options.key);\n\n if (cachedEntry !== null && nowMs - cachedEntry.fetchedAtMs <= options.ttlMs) {\n return cachedEntry.value;\n }\n\n try {\n const fresh = await options.fetchFresh();\n if (fresh !== null) {\n void options.cacheStore?.set(options.key, { value: fresh, fetchedAtMs: nowMs }).catch(() => {\n // Cache persistence failures should not impact the primary fetch path.\n });\n return fresh;\n }\n } catch {\n // Network failures should not block stale fallback.\n }\n\n return cachedEntry?.value ?? null;\n};\n","import { setTimeout as sleep } from \"node:timers/promises\";\n\nexport type FetchRetryOptions = {\n retries: number;\n baseDelayMs: number;\n};\n\nconst parseRetryAfterMs = (value: string | null): number | null => {\n if (value === null) {\n return null;\n }\n\n const seconds = Number.parseInt(value, 10);\n if (!Number.isFinite(seconds) || seconds <= 0) {\n return null;\n }\n\n return seconds * 1000;\n};\n\nconst shouldRetryStatus = (status: number): boolean => status === 429 || status >= 500;\n\nexport const fetchJsonWithRetry = async <T>(\n url: string,\n options: FetchRetryOptions,\n): Promise<T | null> => {\n for (let attempt = 0; attempt <= options.retries; attempt += 1) {\n const response = await fetch(url);\n if (response.ok) {\n return (await response.json()) as T;\n }\n\n if (!shouldRetryStatus(response.status) || attempt === options.retries) {\n return null;\n }\n\n const retryAfterMs = parseRetryAfterMs(response.headers.get(\"retry-after\"));\n const backoffMs = retryAfterMs ?? options.baseDelayMs * 2 ** attempt;\n await sleep(backoffMs);\n }\n\n return null;\n};\n","import { join } from \"node:path\";\nimport type { CacheStore } from \"./cache-store.js\";\nimport { resolveCodesentinelCacheDir } from \"./codesentinel-cache-dir.js\";\nimport { FileCacheStore } from \"./file-cache-store.js\";\n\nconst SIX_HOURS_MS = 6 * 60 * 60 * 1000;\nconst ONE_DAY_MS = 24 * 60 * 60 * 1000;\nconst DEFAULT_MAX_BYTES = 20 * 1024 * 1024;\nconst DEFAULT_MAX_ENTRY_BYTES = 4 * 1024 * 1024;\nconst DEFAULT_SWEEP_INTERVAL_WRITES = 25;\n\nlet cacheStoreSingleton: CacheStore | null | undefined;\n\nconst parsePositiveIntegerFromEnv = (value: string | undefined, fallback: number): number => {\n if (value === undefined) {\n return fallback;\n }\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return fallback;\n }\n return parsed;\n};\n\nconst cacheDisabled = (env: NodeJS.ProcessEnv): boolean => {\n const mode = env[\"CODESENTINEL_CACHE_MODE\"]?.trim().toLowerCase();\n return mode === \"none\";\n};\n\nexport const getNpmMetadataCacheStore = (): CacheStore | null => {\n if (cacheStoreSingleton !== undefined) {\n return cacheStoreSingleton;\n }\n\n if (cacheDisabled(process.env)) {\n cacheStoreSingleton = null;\n return cacheStoreSingleton;\n }\n\n const path = join(resolveCodesentinelCacheDir(process.env), \"npm-metadata-v2\");\n const packumentTtlMs = getPackumentCacheTtlMs();\n const downloadsTtlMs = getWeeklyDownloadsCacheTtlMs();\n cacheStoreSingleton = new FileCacheStore(path, {\n maxBytes: parsePositiveIntegerFromEnv(\n process.env[\"CODESENTINEL_CACHE_MAX_BYTES\"],\n DEFAULT_MAX_BYTES,\n ),\n maxEntryBytes: parsePositiveIntegerFromEnv(\n process.env[\"CODESENTINEL_CACHE_MAX_ENTRY_BYTES\"],\n DEFAULT_MAX_ENTRY_BYTES,\n ),\n sweepIntervalWrites: parsePositiveIntegerFromEnv(\n process.env[\"CODESENTINEL_CACHE_SWEEP_INTERVAL_WRITES\"],\n DEFAULT_SWEEP_INTERVAL_WRITES,\n ),\n bucketForKey: (key) => {\n if (key.startsWith(\"npm:downloads:last-week:\")) {\n return \"downloads\";\n }\n if (key.startsWith(\"npm:packument:\")) {\n return \"packument\";\n }\n return \"default\";\n },\n maxAgeMsByBucket: {\n downloads: downloadsTtlMs,\n packument: packumentTtlMs,\n },\n });\n return cacheStoreSingleton;\n};\n\nexport const getPackumentCacheTtlMs = (): number =>\n parsePositiveIntegerFromEnv(process.env[\"CODESENTINEL_CACHE_TTL_PACKUMENT_MS\"], SIX_HOURS_MS);\n\nexport const getWeeklyDownloadsCacheTtlMs = (): number =>\n parsePositiveIntegerFromEnv(process.env[\"CODESENTINEL_CACHE_TTL_DOWNLOADS_MS\"], ONE_DAY_MS);\n\nexport const toMetadataPackumentCacheKey = (name: string): string =>\n `npm:packument:metadata:${name}`;\nexport const toGraphPackumentCacheKey = (name: string): string => `npm:packument:graph:${name}`;\nexport const toWeeklyDownloadsCacheKey = (name: string): string =>\n `npm:downloads:last-week:${name}`;\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport const resolveCodesentinelCacheDir = (env: NodeJS.ProcessEnv = process.env): string => {\n const explicit = env[\"CODESENTINEL_CACHE_DIR\"]?.trim();\n if (explicit !== undefined && explicit.length > 0) {\n return explicit;\n }\n\n if (process.platform === \"win32\") {\n const localAppData = env[\"LOCALAPPDATA\"]?.trim();\n if (localAppData !== undefined && localAppData.length > 0) {\n return join(localAppData, \"codesentinel\", \"Cache\");\n }\n return join(homedir(), \"AppData\", \"Local\", \"codesentinel\", \"Cache\");\n }\n\n const xdgCacheHome = env[\"XDG_CACHE_HOME\"]?.trim();\n if (xdgCacheHome !== undefined && xdgCacheHome.length > 0) {\n return join(xdgCacheHome, \"codesentinel\");\n }\n\n return join(homedir(), \".cache\", \"codesentinel\");\n};\n","import { createHash } from \"node:crypto\";\nimport { mkdir, readdir, readFile, rename, stat, unlink, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { CacheEntry, CacheStore } from \"./cache-store.js\";\n\ntype CacheEntryPayload = {\n key: string;\n fetchedAtMs: number;\n value: unknown;\n};\n\nconst parseCacheEntryPayload = (value: unknown): CacheEntryPayload | null => {\n if (typeof value !== \"object\" || value === null) {\n return null;\n }\n\n const payload = value as { key?: unknown; fetchedAtMs?: unknown; value?: unknown };\n if (typeof payload.key !== \"string\" || payload.key.length === 0) {\n return null;\n }\n if (typeof payload.fetchedAtMs !== \"number\" || !Number.isFinite(payload.fetchedAtMs)) {\n return null;\n }\n\n return {\n key: payload.key,\n fetchedAtMs: payload.fetchedAtMs,\n value: payload.value,\n };\n};\n\ntype FileCacheStoreOptions = {\n maxBytes: number;\n maxEntryBytes: number;\n sweepIntervalWrites: number;\n bucketForKey?: (key: string) => string;\n maxAgeMsByBucket?: Readonly<Record<string, number>>;\n};\n\nconst DEFAULT_OPTIONS: FileCacheStoreOptions = {\n maxBytes: 100 * 1024 * 1024,\n maxEntryBytes: 4 * 1024 * 1024,\n sweepIntervalWrites: 25,\n};\n\nconst DEFAULT_BUCKET = \"default\";\n\nconst normalizeBucket = (value: string): string => {\n const trimmed = value.trim().toLowerCase();\n if (trimmed.length === 0) {\n return DEFAULT_BUCKET;\n }\n return trimmed.replace(/[^a-z0-9_-]/g, \"_\");\n};\n\nexport class FileCacheStore implements CacheStore {\n private readonly byKey = new Map<string, CacheEntry<unknown> | null>();\n private readonly inFlightWrites = new Map<string, Promise<void>>();\n private writesSinceSweep = 0;\n private sweepPromise: Promise<void> = Promise.resolve();\n\n constructor(\n private readonly directoryPath: string,\n private readonly options: FileCacheStoreOptions = DEFAULT_OPTIONS,\n ) {}\n\n private bucketForKey(key: string): string {\n const configured = this.options.bucketForKey?.(key);\n if (configured === undefined) {\n return DEFAULT_BUCKET;\n }\n return normalizeBucket(configured);\n }\n\n private toEntryPath(key: string): string {\n const bucket = this.bucketForKey(key);\n const digest = createHash(\"sha256\").update(key).digest(\"hex\");\n return join(this.directoryPath, bucket, `${digest}.json`);\n }\n\n private async writeEntry(key: string, entry: CacheEntry<unknown>): Promise<void> {\n const filePath = this.toEntryPath(key);\n const bucketPath = join(this.directoryPath, this.bucketForKey(key));\n await mkdir(bucketPath, { recursive: true });\n const tempPath = `${filePath}.tmp`;\n const payload: CacheEntryPayload = {\n key,\n fetchedAtMs: entry.fetchedAtMs,\n value: entry.value,\n };\n const raw = JSON.stringify(payload);\n if (Buffer.byteLength(raw, \"utf8\") > this.options.maxEntryBytes) {\n return;\n }\n\n await writeFile(tempPath, raw, \"utf8\");\n await rename(tempPath, filePath);\n }\n\n private async sweepIfNeeded(): Promise<void> {\n this.writesSinceSweep += 1;\n if (this.writesSinceSweep < this.options.sweepIntervalWrites) {\n return;\n }\n this.writesSinceSweep = 0;\n\n this.sweepPromise = this.sweepPromise\n .catch(() => {\n // Keep sweep queue alive across failures.\n })\n .then(async () => {\n await this.evictToSizeLimit();\n });\n await this.sweepPromise;\n }\n\n private async evictToSizeLimit(): Promise<void> {\n const nowMs = Date.now();\n let entries: Array<{ path: string; size: number; mtimeMs: number; bucket: string }>;\n try {\n const bucketEntries = await readdir(this.directoryPath, { withFileTypes: true });\n const bucketNames = bucketEntries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name);\n entries = (\n await Promise.all(\n bucketNames.map(async (bucket) => {\n const bucketPath = join(this.directoryPath, bucket);\n const files = await readdir(bucketPath, { withFileTypes: true });\n return await Promise.all(\n files\n .filter((entry) => entry.isFile() && entry.name.endsWith(\".json\"))\n .map(async (entry) => {\n const path = join(bucketPath, entry.name);\n const info = await stat(path);\n return {\n path,\n size: info.size,\n mtimeMs: info.mtimeMs,\n bucket,\n };\n }),\n );\n }),\n )\n )\n .flat()\n .filter((entry) => Number.isFinite(entry.size) && entry.size > 0);\n } catch {\n return;\n }\n\n if (this.options.maxAgeMsByBucket !== undefined) {\n const retained: typeof entries = [];\n let deletedAny = false;\n for (const entry of entries) {\n const maxAgeMs = this.options.maxAgeMsByBucket[entry.bucket];\n const expired =\n typeof maxAgeMs === \"number\" &&\n Number.isFinite(maxAgeMs) &&\n nowMs - entry.mtimeMs > maxAgeMs;\n if (!expired) {\n retained.push(entry);\n continue;\n }\n\n try {\n await unlink(entry.path);\n deletedAny = true;\n } catch {\n retained.push(entry);\n }\n }\n entries = retained;\n if (deletedAny) {\n this.byKey.clear();\n }\n }\n\n let totalBytes = entries.reduce((sum, entry) => sum + entry.size, 0);\n if (totalBytes <= this.options.maxBytes) {\n return;\n }\n\n entries.sort((a, b) => a.mtimeMs - b.mtimeMs);\n let deletedAny = false;\n for (const entry of entries) {\n if (totalBytes <= this.options.maxBytes) {\n break;\n }\n try {\n await unlink(entry.path);\n deletedAny = true;\n totalBytes -= entry.size;\n } catch {\n // Ignore eviction failures for individual files.\n }\n }\n if (deletedAny) {\n this.byKey.clear();\n }\n }\n\n async get<T>(key: string): Promise<CacheEntry<T> | null> {\n if (this.byKey.has(key)) {\n return (this.byKey.get(key) as CacheEntry<T> | null) ?? null;\n }\n\n try {\n const raw = await readFile(this.toEntryPath(key), \"utf8\");\n const parsed = parseCacheEntryPayload(JSON.parse(raw));\n if (parsed === null || parsed.key !== key) {\n this.byKey.set(key, null);\n return null;\n }\n\n const value = { fetchedAtMs: parsed.fetchedAtMs, value: parsed.value as T };\n this.byKey.set(key, value as CacheEntry<unknown>);\n return value;\n } catch {\n this.byKey.set(key, null);\n return null;\n }\n }\n\n async set<T>(key: string, entry: CacheEntry<T>): Promise<void> {\n const normalized = entry as CacheEntry<unknown>;\n this.byKey.set(key, normalized);\n\n const previous = this.inFlightWrites.get(key) ?? Promise.resolve();\n const next = previous\n .catch(() => {\n // Keep write chain active even after previous failures.\n })\n .then(async () => {\n await this.writeEntry(key, normalized);\n await this.sweepIfNeeded();\n });\n this.inFlightWrites.set(key, next);\n await next;\n }\n}\n","import type { DirectDependencySpec, LockedDependencyNode } from \"../domain/types.js\";\nimport { cachedFetch } from \"../infrastructure/cached-fetch.js\";\nimport { fetchJsonWithRetry } from \"../infrastructure/fetch-json-with-retry.js\";\nimport {\n getNpmMetadataCacheStore,\n getPackumentCacheTtlMs,\n toGraphPackumentCacheKey,\n} from \"../infrastructure/npm-metadata-cache.js\";\n\ntype NpmPackageManifest = {\n dependencies?: Record<string, string>;\n};\n\ntype NpmPackumentRaw = {\n \"dist-tags\"?: Record<string, string>;\n versions?: Record<string, NpmPackageManifest>;\n};\n\ntype NpmPackumentGraph = {\n \"dist-tags\"?: Record<string, string>;\n versionNames: readonly string[];\n dependenciesByVersion: Readonly<Record<string, Record<string, string>>>;\n};\n\ntype ParsedSemver = {\n major: number;\n minor: number;\n patch: number;\n prerelease: readonly (string | number)[];\n};\n\ntype ResolvedVersion = {\n version: string;\n resolution: \"exact\" | \"tag\" | \"range\" | \"latest\";\n fallbackUsed: boolean;\n};\n\ntype QueueItem = {\n name: string;\n requested: string | null;\n depth: number;\n};\n\nexport type ResolvedDirectDependency = {\n name: string;\n requestedRange: string;\n resolvedVersion: string;\n resolution: \"exact\" | \"tag\" | \"range\" | \"latest\";\n scope: \"prod\" | \"dev\";\n};\n\nexport type ResolveRegistryGraphResult = {\n nodes: readonly LockedDependencyNode[];\n directDependencies: readonly ResolvedDirectDependency[];\n assumptions: readonly string[];\n truncated: boolean;\n};\n\nexport type ResolveRegistryGraphOptions = {\n maxNodes: number;\n maxDepth: number;\n};\n\nconst MAX_RETRIES = 3;\nconst RETRY_BASE_DELAY_MS = 500;\nconst PACKUMENT_CACHE_STORE = getNpmMetadataCacheStore();\n\nconst parsePrerelease = (value: string | undefined): readonly (string | number)[] => {\n if (value === undefined || value.length === 0) {\n return [];\n }\n\n return value.split(\".\").map((part) => {\n const asNumber = Number.parseInt(part, 10);\n if (!Number.isNaN(asNumber) && `${asNumber}` === part) {\n return asNumber;\n }\n\n return part;\n });\n};\n\nconst parseSemver = (value: string): ParsedSemver | null => {\n const trimmed = value.trim();\n const semverMatch = trimmed.match(\n /^v?(\\d+)\\.(\\d+)\\.(\\d+)(?:-([0-9A-Za-z.-]+))?(?:\\+[0-9A-Za-z.-]+)?$/,\n );\n if (semverMatch === null) {\n return null;\n }\n\n const major = Number.parseInt(semverMatch[1] ?? \"\", 10);\n const minor = Number.parseInt(semverMatch[2] ?? \"\", 10);\n const patch = Number.parseInt(semverMatch[3] ?? \"\", 10);\n if (!Number.isFinite(major) || !Number.isFinite(minor) || !Number.isFinite(patch)) {\n return null;\n }\n\n return {\n major,\n minor,\n patch,\n prerelease: parsePrerelease(semverMatch[4]),\n };\n};\n\nconst compareIdentifier = (left: string | number, right: string | number): number => {\n if (typeof left === \"number\" && typeof right === \"number\") {\n return left - right;\n }\n\n if (typeof left === \"number\") {\n return -1;\n }\n\n if (typeof right === \"number\") {\n return 1;\n }\n\n return left.localeCompare(right);\n};\n\nconst compareSemver = (left: ParsedSemver, right: ParsedSemver): number => {\n if (left.major !== right.major) {\n return left.major - right.major;\n }\n if (left.minor !== right.minor) {\n return left.minor - right.minor;\n }\n if (left.patch !== right.patch) {\n return left.patch - right.patch;\n }\n\n if (left.prerelease.length === 0 && right.prerelease.length === 0) {\n return 0;\n }\n if (left.prerelease.length === 0) {\n return 1;\n }\n if (right.prerelease.length === 0) {\n return -1;\n }\n\n const maxLength = Math.max(left.prerelease.length, right.prerelease.length);\n for (let i = 0; i < maxLength; i += 1) {\n const leftPart = left.prerelease[i];\n const rightPart = right.prerelease[i];\n\n if (leftPart === undefined && rightPart === undefined) {\n return 0;\n }\n if (leftPart === undefined) {\n return -1;\n }\n if (rightPart === undefined) {\n return 1;\n }\n\n const diff = compareIdentifier(leftPart, rightPart);\n if (diff !== 0) {\n return diff;\n }\n }\n\n return 0;\n};\n\nconst isWildcardPart = (value: string | undefined): boolean =>\n value === undefined || value === \"*\" || value.toLowerCase() === \"x\";\n\nconst matchesPartialVersion = (version: ParsedSemver, token: string): boolean => {\n const normalized = token.trim().replace(/^v/, \"\");\n if (normalized === \"*\" || normalized.length === 0) {\n return true;\n }\n\n const [majorPart, minorPart, patchPart] = normalized.split(\".\");\n if (majorPart !== undefined && !isWildcardPart(majorPart)) {\n const major = Number.parseInt(majorPart, 10);\n if (!Number.isFinite(major) || major !== version.major) {\n return false;\n }\n }\n\n if (minorPart !== undefined && !isWildcardPart(minorPart)) {\n const minor = Number.parseInt(minorPart, 10);\n if (!Number.isFinite(minor) || minor !== version.minor) {\n return false;\n }\n }\n\n if (patchPart !== undefined && !isWildcardPart(patchPart)) {\n const patch = Number.parseInt(patchPart, 10);\n if (!Number.isFinite(patch) || patch !== version.patch) {\n return false;\n }\n }\n\n return true;\n};\n\nconst parseComparatorToken = (token: string): { operator: string; versionToken: string } => {\n const operators = [\">=\", \"<=\", \">\", \"<\", \"=\"];\n for (const operator of operators) {\n if (token.startsWith(operator)) {\n return {\n operator,\n versionToken: token.slice(operator.length).trim(),\n };\n }\n }\n\n return {\n operator: \"=\",\n versionToken: token.trim(),\n };\n};\n\nconst satisfiesComparator = (version: ParsedSemver, token: string): boolean | null => {\n if (token.length === 0 || token === \"*\") {\n return true;\n }\n\n if (token.startsWith(\"^\")) {\n const base = parseSemver(token.slice(1));\n if (base === null) {\n return null;\n }\n\n let upper: ParsedSemver;\n if (base.major > 0) {\n upper = { major: base.major + 1, minor: 0, patch: 0, prerelease: [] };\n } else if (base.minor > 0) {\n upper = { major: 0, minor: base.minor + 1, patch: 0, prerelease: [] };\n } else {\n upper = { major: 0, minor: 0, patch: base.patch + 1, prerelease: [] };\n }\n\n return compareSemver(version, base) >= 0 && compareSemver(version, upper) < 0;\n }\n\n if (token.startsWith(\"~\")) {\n const base = parseSemver(token.slice(1));\n if (base === null) {\n return null;\n }\n\n const upper: ParsedSemver = {\n major: base.major,\n minor: base.minor + 1,\n patch: 0,\n prerelease: [],\n };\n\n return compareSemver(version, base) >= 0 && compareSemver(version, upper) < 0;\n }\n\n const parsedComparator = parseComparatorToken(token);\n const hasWildcard = /(^|[.])(?:x|X|\\*)($|[.])/.test(parsedComparator.versionToken);\n if (hasWildcard) {\n if (parsedComparator.operator !== \"=\") {\n return null;\n }\n return matchesPartialVersion(version, parsedComparator.versionToken);\n }\n\n const parsedVersion = parseSemver(parsedComparator.versionToken);\n if (parsedVersion === null) {\n if (parsedComparator.operator !== \"=\") {\n return null;\n }\n\n return matchesPartialVersion(version, parsedComparator.versionToken);\n }\n\n const comparison = compareSemver(version, parsedVersion);\n switch (parsedComparator.operator) {\n case \">\":\n return comparison > 0;\n case \">=\":\n return comparison >= 0;\n case \"<\":\n return comparison < 0;\n case \"<=\":\n return comparison <= 0;\n case \"=\":\n return comparison === 0;\n default:\n return null;\n }\n};\n\nconst satisfiesRangeClause = (version: ParsedSemver, clause: string): boolean | null => {\n const hyphenMatch = clause.match(/^\\s*(.+?)\\s+-\\s+(.+?)\\s*$/);\n if (hyphenMatch !== null) {\n const lower = hyphenMatch[1];\n const upper = hyphenMatch[2];\n if (lower === undefined || upper === undefined) {\n return null;\n }\n\n const lowerResult = satisfiesComparator(version, `>=${lower}`);\n const upperResult = satisfiesComparator(version, `<=${upper}`);\n if (lowerResult === null || upperResult === null) {\n return null;\n }\n\n return lowerResult && upperResult;\n }\n\n const tokens = clause\n .split(/\\s+/)\n .map((token) => token.trim())\n .filter((token) => token.length > 0);\n\n if (tokens.length === 0) {\n return true;\n }\n\n for (const token of tokens) {\n const matched = satisfiesComparator(version, token);\n if (matched === null) {\n return null;\n }\n\n if (!matched) {\n return false;\n }\n }\n\n return true;\n};\n\nconst resolveRangeVersion = (versions: readonly string[], requested: string): string | null => {\n const clauses = requested\n .split(\"||\")\n .map((clause) => clause.trim())\n .filter((clause) => clause.length > 0);\n\n if (clauses.length === 0) {\n return null;\n }\n\n const parsedVersions = versions\n .map((version) => ({ version, parsed: parseSemver(version) }))\n .filter(\n (candidate): candidate is { version: string; parsed: ParsedSemver } =>\n candidate.parsed !== null,\n )\n .sort((a, b) => compareSemver(b.parsed, a.parsed));\n\n for (const candidate of parsedVersions) {\n let clauseMatched = false;\n let clauseUnsupported = false;\n\n for (const clause of clauses) {\n const matched = satisfiesRangeClause(candidate.parsed, clause);\n if (matched === null) {\n clauseUnsupported = true;\n continue;\n }\n\n if (matched) {\n clauseMatched = true;\n break;\n }\n }\n\n if (clauseMatched) {\n return candidate.version;\n }\n\n if (clauseUnsupported && clauses.length === 1) {\n return null;\n }\n }\n\n return null;\n};\n\nconst slimPackumentForGraph = (payload: NpmPackumentRaw): NpmPackumentGraph => {\n const versions = payload.versions ?? {};\n const dependenciesByVersion: Record<string, Record<string, string>> = {};\n const versionNames = Object.keys(versions);\n\n for (const [version, manifest] of Object.entries(versions)) {\n const dependenciesRaw = manifest?.dependencies ?? {};\n const dependencies: Record<string, string> = {};\n for (const [dependencyName, dependencyRange] of Object.entries(dependenciesRaw)) {\n if (dependencyName.length > 0 && dependencyRange.length > 0) {\n dependencies[dependencyName] = dependencyRange;\n }\n }\n\n if (Object.keys(dependencies).length > 0) {\n dependenciesByVersion[version] = dependencies;\n }\n }\n\n const slim: NpmPackumentGraph = {\n versionNames,\n dependenciesByVersion,\n };\n if (payload[\"dist-tags\"] !== undefined) {\n slim[\"dist-tags\"] = payload[\"dist-tags\"];\n }\n return slim;\n};\n\nconst fetchPackument = async (name: string): Promise<NpmPackumentGraph | null> => {\n const encodedName = encodeURIComponent(name);\n try {\n return await cachedFetch<NpmPackumentGraph>({\n key: toGraphPackumentCacheKey(name),\n ttlMs: getPackumentCacheTtlMs(),\n cacheStore: PACKUMENT_CACHE_STORE,\n fetchFresh: async () => {\n const payload = await fetchJsonWithRetry<NpmPackumentRaw>(\n `https://registry.npmjs.org/${encodedName}`,\n {\n retries: MAX_RETRIES,\n baseDelayMs: RETRY_BASE_DELAY_MS,\n },\n );\n if (payload === null) {\n return null;\n }\n return slimPackumentForGraph(payload);\n },\n });\n } catch {\n return null;\n }\n};\n\nconst resolveRequestedVersion = (\n packument: NpmPackumentGraph,\n requested: string | null,\n): ResolvedVersion | null => {\n const versionKeys = [...packument.versionNames];\n const versionSet = new Set(versionKeys);\n const tags = packument[\"dist-tags\"] ?? {};\n const latest = tags[\"latest\"];\n\n if (requested !== null && versionSet.has(requested)) {\n return {\n version: requested,\n resolution: \"exact\",\n fallbackUsed: false,\n };\n }\n\n if (requested !== null) {\n const tagged = tags[requested];\n if (tagged !== undefined && versionSet.has(tagged)) {\n return {\n version: tagged,\n resolution: \"tag\",\n fallbackUsed: false,\n };\n }\n }\n\n if (requested !== null) {\n const matched = resolveRangeVersion(versionKeys, requested);\n if (matched !== null && versionSet.has(matched)) {\n return {\n version: matched,\n resolution: \"range\",\n fallbackUsed: false,\n };\n }\n }\n\n if (latest !== undefined && versionSet.has(latest)) {\n return {\n version: latest,\n resolution: \"latest\",\n fallbackUsed: requested !== null,\n };\n }\n\n const semverSorted = versionKeys\n .map((version) => ({ version, parsed: parseSemver(version) }))\n .filter(\n (candidate): candidate is { version: string; parsed: ParsedSemver } =>\n candidate.parsed !== null,\n )\n .sort((a, b) => compareSemver(b.parsed, a.parsed))\n .map((candidate) => candidate.version);\n const fallbackVersion = semverSorted[0] ?? versionKeys.sort((a, b) => b.localeCompare(a))[0];\n if (fallbackVersion === undefined) {\n return null;\n }\n\n return {\n version: fallbackVersion,\n resolution: \"latest\",\n fallbackUsed: requested !== null,\n };\n};\n\nexport const resolveRegistryGraphFromDirectSpecs = async (\n directSpecs: readonly DirectDependencySpec[],\n options: ResolveRegistryGraphOptions,\n): Promise<ResolveRegistryGraphResult> => {\n const maxNodes = Math.max(1, options.maxNodes);\n const maxDepth = Math.max(0, options.maxDepth);\n\n const queue: QueueItem[] = directSpecs.map((spec) => ({\n name: spec.name,\n requested: spec.requestedRange,\n depth: 0,\n }));\n const scopeByName = new Map(directSpecs.map((spec) => [spec.name, spec.scope]));\n const requestedByName = new Map(directSpecs.map((spec) => [spec.name, spec.requestedRange]));\n const packumentByName = new Map<string, NpmPackumentGraph | null>();\n const nodesByKey = new Map<string, LockedDependencyNode>();\n const directByName = new Map<string, ResolvedDirectDependency>();\n const assumptions = new Set<string>();\n let truncated = false;\n\n while (queue.length > 0) {\n if (nodesByKey.size >= maxNodes) {\n truncated = true;\n assumptions.add(`Dependency graph truncated at ${maxNodes} nodes.`);\n break;\n }\n\n const item = queue.shift();\n if (item === undefined) {\n break;\n }\n\n let packument = packumentByName.get(item.name) ?? null;\n if (!packumentByName.has(item.name)) {\n packument = await fetchPackument(item.name);\n packumentByName.set(item.name, packument);\n }\n\n if (packument === null) {\n if (scopeByName.has(item.name)) {\n assumptions.add(`Could not resolve direct dependency from registry: ${item.name}.`);\n }\n continue;\n }\n\n const resolved = resolveRequestedVersion(packument, item.requested);\n if (resolved === null) {\n if (scopeByName.has(item.name)) {\n assumptions.add(`Could not resolve direct dependency version: ${item.name}.`);\n }\n continue;\n }\n\n if (scopeByName.has(item.name) && !directByName.has(item.name)) {\n directByName.set(item.name, {\n name: item.name,\n requestedRange: requestedByName.get(item.name) ?? \"latest\",\n resolvedVersion: resolved.version,\n resolution: resolved.resolution,\n scope: scopeByName.get(item.name) ?? \"prod\",\n });\n }\n\n if (resolved.fallbackUsed && item.requested !== null) {\n assumptions.add(\n `Resolved ${item.name}@${item.requested} to latest (${resolved.version}) because exact/tag/range match was unavailable.`,\n );\n }\n\n const nodeKey = `${item.name}@${resolved.version}`;\n if (nodesByKey.has(nodeKey)) {\n continue;\n }\n\n const manifestDependencies = packument.dependenciesByVersion[resolved.version] ?? {};\n const dependencies = Object.entries(manifestDependencies)\n .filter(\n ([dependencyName, dependencyRange]) =>\n dependencyName.length > 0 && dependencyRange.length > 0,\n )\n .sort((a, b) => a[0].localeCompare(b[0]));\n\n nodesByKey.set(nodeKey, {\n name: item.name,\n version: resolved.version,\n dependencies: dependencies.map(\n ([dependencyName, dependencyRange]) => `${dependencyName}@${dependencyRange}`,\n ),\n });\n\n if (item.depth >= maxDepth && dependencies.length > 0) {\n truncated = true;\n assumptions.add(`Dependency graph truncated at depth ${maxDepth}.`);\n continue;\n }\n\n for (const [dependencyName, dependencyRange] of dependencies) {\n if (nodesByKey.size + queue.length >= maxNodes) {\n truncated = true;\n assumptions.add(`Dependency graph truncated at ${maxNodes} nodes.`);\n break;\n }\n\n queue.push({\n name: dependencyName,\n requested: dependencyRange,\n depth: item.depth + 1,\n });\n }\n }\n\n return {\n nodes: [...nodesByKey.values()].sort(\n (a, b) => a.name.localeCompare(b.name) || a.version.localeCompare(b.version),\n ),\n directDependencies: [...directByName.values()].sort((a, b) => a.name.localeCompare(b.name)),\n assumptions: [...assumptions].sort((a, b) => a.localeCompare(b)),\n truncated,\n };\n};\n","import type { LockfileExtraction } from \"../domain/types.js\";\nimport { loadPackageJson, selectLockfile } from \"../infrastructure/fs-loader.js\";\nimport { parsePackageJson } from \"../parsing/package-json-loader.js\";\nimport { parseLockfileExtraction } from \"./parse-lockfile-extraction.js\";\nimport { resolveRegistryGraphFromDirectSpecs } from \"./resolve-registry-graph.js\";\n\ntype LockfileKind = \"pnpm\" | \"npm\" | \"npm-shrinkwrap\" | \"yarn\" | \"bun\";\n\nexport type PreparedDependencyExtraction =\n | {\n available: false;\n reason: \"package_json_not_found\" | \"lockfile_not_found\";\n }\n | {\n available: true;\n lockfileKind: LockfileKind;\n extraction: LockfileExtraction;\n };\n\nexport const prepareDependencyExtraction = async (\n repositoryPath: string,\n): Promise<PreparedDependencyExtraction> => {\n const packageJson = loadPackageJson(repositoryPath);\n if (packageJson === null) {\n return {\n available: false,\n reason: \"package_json_not_found\",\n };\n }\n\n const directSpecs = parsePackageJson(packageJson.raw);\n const lockfile = selectLockfile(repositoryPath);\n\n if (lockfile === null) {\n const resolvedGraph = await resolveRegistryGraphFromDirectSpecs(directSpecs, {\n maxNodes: 500,\n maxDepth: 8,\n });\n if (resolvedGraph.nodes.length === 0) {\n return {\n available: false,\n reason: \"lockfile_not_found\",\n };\n }\n\n return {\n available: true,\n lockfileKind: \"npm\",\n extraction: {\n kind: \"npm\",\n directDependencies: resolvedGraph.directDependencies.map((dependency) => ({\n name: dependency.name,\n requestedRange: dependency.requestedRange,\n scope: dependency.scope,\n })),\n nodes: resolvedGraph.nodes,\n },\n };\n }\n\n return {\n available: true,\n lockfileKind: lockfile.kind,\n extraction: parseLockfileExtraction(lockfile.kind, lockfile.raw, directSpecs),\n };\n};\n","import type { ExternalAnalysisSummary } from \"@codesentinel/core\";\nimport { buildExternalAnalysisSummary } from \"../domain/external-analysis.js\";\nimport {\n DEFAULT_EXTERNAL_ANALYSIS_CONFIG,\n type DependencyMetadataProvider,\n type ExternalAnalysisConfig,\n} from \"../domain/types.js\";\nimport { collectDependencyMetadata } from \"./collect-dependency-metadata.js\";\nimport { prepareDependencyExtraction } from \"./prepare-dependency-extraction.js\";\n\nexport type AnalyzeDependencyExposureInput = {\n repositoryPath: string;\n config?: Partial<ExternalAnalysisConfig>;\n};\n\nexport type DependencyExposureProgressEvent =\n | { stage: \"package_json_loaded\" }\n | { stage: \"lockfile_selected\"; kind: \"pnpm\" | \"npm\" | \"npm-shrinkwrap\" | \"yarn\" | \"bun\" }\n | { stage: \"lockfile_parsed\"; dependencyNodes: number; directDependencies: number }\n | { stage: \"metadata_fetch_started\"; total: number }\n | { stage: \"metadata_fetch_progress\"; completed: number; total: number; packageName: string }\n | { stage: \"metadata_fetch_completed\"; total: number }\n | { stage: \"summary_built\"; totalDependencies: number; directDependencies: number };\n\nconst withDefaults = (\n overrides: Partial<ExternalAnalysisConfig> | undefined,\n): ExternalAnalysisConfig => ({\n ...DEFAULT_EXTERNAL_ANALYSIS_CONFIG,\n ...overrides,\n});\n\nexport const analyzeDependencyExposure = async (\n input: AnalyzeDependencyExposureInput,\n metadataProvider: DependencyMetadataProvider,\n onProgress?: (event: DependencyExposureProgressEvent) => void,\n): Promise<ExternalAnalysisSummary> => {\n const config = withDefaults(input.config);\n\n try {\n const prepared = await prepareDependencyExtraction(input.repositoryPath);\n if (!prepared.available) {\n return {\n targetPath: input.repositoryPath,\n available: false,\n reason: prepared.reason,\n };\n }\n\n onProgress?.({ stage: \"package_json_loaded\" });\n onProgress?.({ stage: \"lockfile_selected\", kind: prepared.lockfileKind });\n\n const { extraction } = prepared;\n\n onProgress?.({\n stage: \"lockfile_parsed\",\n dependencyNodes: extraction.nodes.length,\n directDependencies: extraction.directDependencies.length,\n });\n onProgress?.({ stage: \"metadata_fetch_started\", total: extraction.nodes.length });\n const metadataEntries = await collectDependencyMetadata(\n extraction,\n metadataProvider,\n config.metadataRequestConcurrency,\n (event) =>\n onProgress?.({\n stage: \"metadata_fetch_progress\",\n completed: event.completed,\n total: event.total,\n packageName: event.packageName,\n }),\n );\n onProgress?.({ stage: \"metadata_fetch_completed\", total: extraction.nodes.length });\n\n const metadataByKey = new Map<string, Awaited<(typeof metadataEntries)[number]>[\"metadata\"]>();\n for (const entry of metadataEntries) {\n metadataByKey.set(entry.key, entry.metadata);\n }\n\n const summary = buildExternalAnalysisSummary(\n input.repositoryPath,\n extraction,\n metadataByKey,\n config,\n );\n if (summary.available) {\n onProgress?.({\n stage: \"summary_built\",\n totalDependencies: summary.metrics.totalDependencies,\n directDependencies: summary.metrics.directDependencies,\n });\n }\n\n return summary;\n } catch (error) {\n const message = error instanceof Error ? error.message : \"unknown\";\n if (message.includes(\"unsupported_lockfile_format\")) {\n return {\n targetPath: input.repositoryPath,\n available: false,\n reason: \"unsupported_lockfile_format\",\n };\n }\n\n return {\n targetPath: input.repositoryPath,\n available: false,\n reason: \"invalid_lockfile\",\n };\n }\n};\n","import type { ExternalAnalysisSummary } from \"@codesentinel/core\";\nimport { buildExternalAnalysisSummary } from \"../domain/external-analysis.js\";\nimport {\n DEFAULT_EXTERNAL_ANALYSIS_CONFIG,\n type DependencyMetadataProvider,\n type ExternalAnalysisConfig,\n type LockfileExtraction,\n} from \"../domain/types.js\";\nimport { resolveRegistryGraphFromDirectSpecs } from \"./resolve-registry-graph.js\";\n\nexport type AnalyzeDependencyCandidateInput = {\n dependency: string;\n config?: Partial<ExternalAnalysisConfig>;\n maxNodes?: number;\n maxDepth?: number;\n};\n\nexport type AnalyzeDependencyCandidateResult =\n | {\n available: false;\n reason: \"invalid_dependency_spec\" | \"package_not_found\";\n dependency: string;\n }\n | {\n available: true;\n dependency: {\n name: string;\n requested: string | null;\n resolvedVersion: string;\n resolution: \"exact\" | \"tag\" | \"range\" | \"latest\";\n };\n graph: {\n nodeCount: number;\n truncated: boolean;\n maxNodes: number;\n maxDepth: number;\n };\n assumptions: readonly string[];\n external: ExternalAnalysisSummary;\n };\n\nconst DEFAULT_MAX_NODES = 250;\nconst DEFAULT_MAX_DEPTH = 6;\n\nconst withDefaults = (\n overrides: Partial<ExternalAnalysisConfig> | undefined,\n): ExternalAnalysisConfig => ({\n ...DEFAULT_EXTERNAL_ANALYSIS_CONFIG,\n ...overrides,\n});\n\nconst parseDependencySpec = (value: string): { name: string; requested: string | null } | null => {\n const trimmed = value.trim();\n if (trimmed.length === 0 || /\\s/.test(trimmed)) {\n return null;\n }\n\n if (trimmed.startsWith(\"@\")) {\n const splitIndex = trimmed.lastIndexOf(\"@\");\n if (splitIndex <= 0) {\n return { name: trimmed, requested: null };\n }\n\n const name = trimmed.slice(0, splitIndex);\n const requested = trimmed.slice(splitIndex + 1);\n if (name.length === 0 || requested.length === 0) {\n return null;\n }\n\n return { name, requested };\n }\n\n const splitIndex = trimmed.lastIndexOf(\"@\");\n if (splitIndex <= 0) {\n return { name: trimmed, requested: null };\n }\n\n const name = trimmed.slice(0, splitIndex);\n const requested = trimmed.slice(splitIndex + 1);\n if (name.length === 0 || requested.length === 0) {\n return null;\n }\n\n return { name, requested };\n};\n\nconst mapWithConcurrency = async <T, R>(\n values: readonly T[],\n limit: number,\n handler: (value: T) => Promise<R>,\n): Promise<readonly R[]> => {\n const effectiveLimit = Math.max(1, limit);\n const workerCount = Math.min(effectiveLimit, values.length);\n const UNSET = Symbol(\"map_with_concurrency_unset\");\n const results = new Array<R | typeof UNSET>(values.length).fill(UNSET);\n let index = 0;\n\n const workers: Promise<void>[] = Array.from({ length: workerCount }, async () => {\n // This loop always terminates: each iteration advances `index`,\n // and workers return once `index >= values.length`.\n while (true) {\n const current = index;\n index += 1;\n if (current >= values.length) {\n return;\n }\n\n const value = values[current] as T;\n results[current] = await handler(value);\n }\n });\n\n await Promise.all(workers);\n if (results.some((value) => value === UNSET)) {\n throw new Error(\"map_with_concurrency_incomplete_results\");\n }\n return results as R[];\n};\n\nexport const analyzeDependencyCandidate = async (\n input: AnalyzeDependencyCandidateInput,\n metadataProvider: DependencyMetadataProvider,\n): Promise<AnalyzeDependencyCandidateResult> => {\n const parsed = parseDependencySpec(input.dependency);\n if (parsed === null) {\n return {\n available: false,\n reason: \"invalid_dependency_spec\",\n dependency: input.dependency,\n };\n }\n\n const maxNodes = Math.max(1, input.maxNodes ?? DEFAULT_MAX_NODES);\n const maxDepth = Math.max(0, input.maxDepth ?? DEFAULT_MAX_DEPTH);\n const config = withDefaults(input.config);\n\n const graph = await resolveRegistryGraphFromDirectSpecs(\n [\n {\n name: parsed.name,\n requestedRange: parsed.requested ?? \"latest\",\n scope: \"prod\",\n },\n ],\n { maxNodes, maxDepth },\n );\n\n const direct = graph.directDependencies.find((dependency) => dependency.name === parsed.name);\n if (direct === undefined || graph.nodes.length === 0) {\n return {\n available: false,\n reason: \"package_not_found\",\n dependency: input.dependency,\n };\n }\n\n const metadataEntries = await mapWithConcurrency(\n graph.nodes,\n config.metadataRequestConcurrency,\n async (node) => ({\n key: `${node.name}@${node.version}`,\n metadata: await metadataProvider.getMetadata(node.name, node.version, {\n directDependency: node.name === parsed.name,\n }),\n }),\n );\n\n const metadataByKey = new Map<string, Awaited<(typeof metadataEntries)[number]>[\"metadata\"]>();\n for (const entry of metadataEntries) {\n metadataByKey.set(entry.key, entry.metadata);\n }\n\n const extraction: LockfileExtraction = {\n kind: \"npm\",\n directDependencies: [\n {\n name: parsed.name,\n requestedRange: parsed.requested ?? \"latest\",\n scope: \"prod\",\n },\n ],\n nodes: graph.nodes,\n };\n\n const external = buildExternalAnalysisSummary(\n `npm:${parsed.name}`,\n extraction,\n metadataByKey,\n config,\n );\n\n return {\n available: true,\n dependency: {\n name: parsed.name,\n requested: parsed.requested,\n resolvedVersion: direct.resolvedVersion,\n resolution: direct.resolution,\n },\n graph: {\n nodeCount: graph.nodes.length,\n truncated: graph.truncated,\n maxNodes,\n maxDepth,\n },\n assumptions: graph.assumptions,\n external,\n };\n};\n","import type {\n DependencyMetadata,\n DependencyMetadataProvider,\n DependencyMetadataRequestContext,\n} from \"../domain/types.js\";\nimport { cachedFetch } from \"./cached-fetch.js\";\nimport { fetchJsonWithRetry } from \"./fetch-json-with-retry.js\";\nimport {\n getNpmMetadataCacheStore,\n getPackumentCacheTtlMs,\n getWeeklyDownloadsCacheTtlMs,\n toMetadataPackumentCacheKey,\n toWeeklyDownloadsCacheKey,\n} from \"./npm-metadata-cache.js\";\n\ntype NpmPackagePayload = {\n time?: Record<string, string>;\n maintainers?: Array<{ name?: string; email?: string }>;\n};\n\ntype NpmDownloadsPayload = {\n downloads?: number;\n};\n\nconst ONE_DAY_MS = 24 * 60 * 60 * 1000;\nconst MAX_RETRIES = 3;\nconst RETRY_BASE_DELAY_MS = 500;\nconst round4 = (value: number): number => Number(value.toFixed(4));\n\nconst parseDate = (iso: string | undefined): number | null => {\n if (iso === undefined) {\n return null;\n }\n\n const value = Date.parse(iso);\n return Number.isNaN(value) ? null : value;\n};\n\nexport class NpmRegistryMetadataProvider implements DependencyMetadataProvider {\n private readonly cache = new Map<string, DependencyMetadata | null>();\n private readonly cacheStore = getNpmMetadataCacheStore();\n\n private async fetchWeeklyDownloads(name: string): Promise<number | null> {\n const encodedName = encodeURIComponent(name);\n const payload = await cachedFetch<NpmDownloadsPayload>({\n key: toWeeklyDownloadsCacheKey(name),\n ttlMs: getWeeklyDownloadsCacheTtlMs(),\n cacheStore: this.cacheStore,\n fetchFresh: async () =>\n await fetchJsonWithRetry<NpmDownloadsPayload>(\n `https://api.npmjs.org/downloads/point/last-week/${encodedName}`,\n { retries: MAX_RETRIES, baseDelayMs: RETRY_BASE_DELAY_MS },\n ),\n });\n if (payload === null) {\n return null;\n }\n\n const downloads = payload.downloads;\n if (typeof downloads !== \"number\" || Number.isNaN(downloads) || downloads < 0) {\n return null;\n }\n\n return Math.floor(downloads);\n }\n\n async getMetadata(\n name: string,\n version: string,\n context: DependencyMetadataRequestContext,\n ): Promise<DependencyMetadata | null> {\n const key = `${name}@${version}`;\n if (this.cache.has(key)) {\n return this.cache.get(key) ?? null;\n }\n\n try {\n const encodedName = encodeURIComponent(name);\n const payload = await cachedFetch<NpmPackagePayload>({\n key: toMetadataPackumentCacheKey(name),\n ttlMs: getPackumentCacheTtlMs(),\n cacheStore: this.cacheStore,\n fetchFresh: async () => {\n const fresh = await fetchJsonWithRetry<NpmPackagePayload>(\n `https://registry.npmjs.org/${encodedName}`,\n {\n retries: MAX_RETRIES,\n baseDelayMs: RETRY_BASE_DELAY_MS,\n },\n );\n if (fresh === null) {\n return null;\n }\n const slim: NpmPackagePayload = {};\n if (fresh.time !== undefined) {\n slim.time = fresh.time;\n }\n if (fresh.maintainers !== undefined) {\n slim.maintainers = fresh.maintainers;\n }\n return slim;\n },\n });\n if (payload === null) {\n this.cache.set(key, null);\n return null;\n }\n const timeEntries = payload.time ?? {};\n\n const publishDates = Object.entries(timeEntries)\n .filter(([tag]) => tag !== \"created\" && tag !== \"modified\")\n .map(([, date]) => parseDate(date))\n .filter((value): value is number => value !== null)\n .sort((a, b) => a - b);\n\n const modifiedAt = parseDate(timeEntries[\"modified\"]);\n const now = Date.now();\n const daysSinceLastRelease =\n modifiedAt === null ? null : Math.max(0, round4((now - modifiedAt) / ONE_DAY_MS));\n\n let releaseFrequencyDays: number | null = null;\n if (publishDates.length >= 2) {\n const totalIntervals = publishDates.length - 1;\n let sum = 0;\n for (let i = 1; i < publishDates.length; i += 1) {\n const current = publishDates[i];\n const previous = publishDates[i - 1];\n if (current !== undefined && previous !== undefined) {\n sum += current - previous;\n }\n }\n\n releaseFrequencyDays = round4(sum / totalIntervals / ONE_DAY_MS);\n }\n\n const maintainers = payload.maintainers ?? [];\n const maintainerCount = maintainers.length > 0 ? maintainers.length : null;\n const weeklyDownloads = context.directDependency\n ? await this.fetchWeeklyDownloads(name).catch(() => null)\n : null;\n\n const metadata: DependencyMetadata = {\n name,\n version,\n weeklyDownloads,\n maintainerCount,\n releaseFrequencyDays,\n daysSinceLastRelease,\n repositoryActivity30d: null,\n busFactor: null,\n };\n\n this.cache.set(key, metadata);\n return metadata;\n } catch {\n this.cache.set(key, null);\n return null;\n }\n }\n}\n","import type { DependencyMetadata, DependencyMetadataProvider } from \"../domain/types.js\";\n\nexport class NoopMetadataProvider implements DependencyMetadataProvider {\n getMetadata(\n _name: string,\n _version: string,\n _context: { directDependency: boolean },\n ): Promise<DependencyMetadata | null> {\n return Promise.resolve(null);\n }\n}\n","import type { ExternalAnalysisSummary } from \"@codesentinel/core\";\nimport {\n analyzeDependencyExposure,\n type DependencyExposureProgressEvent,\n type AnalyzeDependencyExposureInput,\n} from \"./application/analyze-dependency-exposure.js\";\nimport {\n analyzeDependencyCandidate,\n type AnalyzeDependencyCandidateInput,\n type AnalyzeDependencyCandidateResult,\n} from \"./application/analyze-dependency-candidate.js\";\nimport { NpmRegistryMetadataProvider } from \"./infrastructure/npm-registry-metadata-provider.js\";\nimport { NoopMetadataProvider } from \"./infrastructure/noop-metadata-provider.js\";\n\nexport type { AnalyzeDependencyExposureInput } from \"./application/analyze-dependency-exposure.js\";\nexport type { DependencyExposureProgressEvent } from \"./application/analyze-dependency-exposure.js\";\nexport type {\n AnalyzeDependencyCandidateInput,\n AnalyzeDependencyCandidateResult,\n} from \"./application/analyze-dependency-candidate.js\";\n\nexport const analyzeDependencyExposureFromProject = async (\n input: AnalyzeDependencyExposureInput,\n onProgress?: (event: DependencyExposureProgressEvent) => void,\n): Promise<ExternalAnalysisSummary> => {\n const metadataProvider =\n process.env[\"CODESENTINEL_EXTERNAL_METADATA\"] === \"none\"\n ? new NoopMetadataProvider()\n : new NpmRegistryMetadataProvider();\n\n return analyzeDependencyExposure(input, metadataProvider, onProgress);\n};\n\nexport const analyzeDependencyCandidateFromRegistry = async (\n input: AnalyzeDependencyCandidateInput,\n): Promise<AnalyzeDependencyCandidateResult> => {\n const metadataProvider =\n process.env[\"CODESENTINEL_EXTERNAL_METADATA\"] === \"none\"\n ? new NoopMetadataProvider()\n : new NpmRegistryMetadataProvider();\n\n return analyzeDependencyCandidate(input, metadataProvider);\n};\n","import type {\n AnalyzeSummary,\n RepositoryHealthSummary,\n RiskFactorTrace,\n RiskTrace,\n} from \"@codesentinel/core\";\n\nexport const SNAPSHOT_SCHEMA_VERSION = \"codesentinel.snapshot.v1\" as const;\nexport const REPORT_SCHEMA_VERSION = \"codesentinel.report.v1\" as const;\nexport const RISK_MODEL_VERSION = \"deterministic-v1\" as const;\n\nexport type SnapshotSchemaVersion = typeof SNAPSHOT_SCHEMA_VERSION;\nexport type ReportSchemaVersion = typeof REPORT_SCHEMA_VERSION;\n\nexport type RiskTier = \"low\" | \"moderate\" | \"elevated\" | \"high\" | \"very_high\";\nexport type HealthTier = \"critical\" | \"weak\" | \"fair\" | \"good\" | \"excellent\";\n\nexport type ReportFormat = \"json\" | \"text\" | \"md\";\n\nexport type CodeSentinelSnapshot = {\n schemaVersion: SnapshotSchemaVersion;\n generatedAt: string;\n riskModelVersion: string;\n source: {\n targetPath: string;\n };\n analysis: AnalyzeSummary;\n trace?: RiskTrace;\n analysisConfig?: Readonly<Record<string, string | number | boolean | null>>;\n};\n\nexport type RenderedFactor = {\n id: string;\n label: string;\n contribution: number;\n confidence: number;\n evidence: string;\n};\n\nexport type HotspotReportItem = {\n target: string;\n score: number;\n normalizedScore: number;\n topFactors: readonly RenderedFactor[];\n suggestedActions: readonly string[];\n biggestLevers: readonly string[];\n};\n\nexport type RepositoryDimensionScores = {\n structural: number | null;\n evolution: number | null;\n external: number | null;\n interactions: number | null;\n};\n\nexport type SnapshotDiff = {\n riskScoreDelta: number;\n normalizedScoreDelta: number;\n fileRiskChanges: ReadonlyArray<{ target: string; before: number; after: number; delta: number }>;\n moduleRiskChanges: ReadonlyArray<{\n target: string;\n before: number;\n after: number;\n delta: number;\n }>;\n newHotspots: readonly string[];\n resolvedHotspots: readonly string[];\n newCycles: readonly string[];\n resolvedCycles: readonly string[];\n externalChanges: {\n highRiskAdded: readonly string[];\n highRiskRemoved: readonly string[];\n singleMaintainerAdded: readonly string[];\n singleMaintainerRemoved: readonly string[];\n abandonedAdded: readonly string[];\n abandonedRemoved: readonly string[];\n };\n};\n\nexport type CodeSentinelReport = {\n schemaVersion: ReportSchemaVersion;\n generatedAt: string;\n repository: {\n targetPath: string;\n riskScore: number;\n normalizedScore: number;\n riskTier: RiskTier;\n healthTier: HealthTier;\n confidence: number | null;\n dimensionScores: RepositoryDimensionScores;\n };\n health: RepositoryHealthSummary;\n hotspots: readonly HotspotReportItem[];\n structural: {\n cycleCount: number;\n cycles: readonly string[];\n fragileClusters: ReadonlyArray<{\n id: string;\n kind: string;\n score: number;\n files: readonly string[];\n }>;\n };\n external:\n | {\n available: false;\n reason: string;\n }\n | {\n available: true;\n highRiskDependencies: readonly string[];\n highRiskDevelopmentDependencies: readonly string[];\n singleMaintainerDependencies: readonly string[];\n abandonedDependencies: readonly string[];\n };\n appendix: {\n snapshotSchemaVersion: string;\n riskModelVersion: string;\n timestamp: string;\n normalization: string;\n analysisConfig?: Readonly<Record<string, string | number | boolean | null>>;\n };\n diff?: SnapshotDiff;\n};\n\nexport const round4 = (value: number): number => Number(value.toFixed(4));\n\nexport const toRiskTier = (score: number): RiskTier => {\n if (score < 20) {\n return \"low\";\n }\n if (score < 40) {\n return \"moderate\";\n }\n if (score < 60) {\n return \"elevated\";\n }\n if (score < 80) {\n return \"high\";\n }\n return \"very_high\";\n};\n\nexport const toHealthTier = (score: number): HealthTier => {\n if (score < 20) {\n return \"critical\";\n }\n if (score < 40) {\n return \"weak\";\n }\n if (score < 60) {\n return \"fair\";\n }\n if (score < 80) {\n return \"good\";\n }\n return \"excellent\";\n};\n\nconst factorLabelById: Readonly<Record<string, string>> = {\n \"repository.structural\": \"Structural complexity\",\n \"repository.evolution\": \"Change volatility\",\n \"repository.external\": \"External dependency pressure\",\n \"repository.composite.interactions\": \"Intersection amplification\",\n \"file.structural\": \"File structural complexity\",\n \"file.evolution\": \"File change volatility\",\n \"file.external\": \"File external pressure\",\n \"file.composite.interactions\": \"File interaction amplification\",\n \"module.average_file_risk\": \"Average file risk\",\n \"module.peak_file_risk\": \"Peak file risk\",\n \"dependency.signals\": \"Dependency risk signals\",\n \"dependency.staleness\": \"Dependency staleness\",\n \"dependency.maintainer_concentration\": \"Maintainer concentration\",\n \"dependency.topology\": \"Dependency topology pressure\",\n \"dependency.bus_factor\": \"Dependency bus factor\",\n \"dependency.popularity_dampening\": \"Popularity dampening\",\n};\n\nexport const factorLabel = (factorId: string): string => factorLabelById[factorId] ?? factorId;\n\nexport const summarizeEvidence = (factor: RiskFactorTrace): string => {\n const entries = Object.entries(factor.rawMetrics)\n .filter(([, value]) => value !== null)\n .sort((a, b) => a[0].localeCompare(b[0]))\n .slice(0, 3)\n .map(([key, value]) => `${key}=${value}`);\n\n if (entries.length > 0) {\n return entries.join(\", \");\n }\n\n const evidence = [...factor.evidence]\n .map((entry) => {\n if (entry.kind === \"file_metric\") {\n return `${entry.target}:${entry.metric}`;\n }\n if (entry.kind === \"dependency_metric\") {\n return `${entry.target}:${entry.metric}`;\n }\n if (entry.kind === \"repository_metric\") {\n return entry.metric;\n }\n if (entry.kind === \"graph_cycle\") {\n return `cycle:${entry.cycleId}`;\n }\n return `${entry.fileA}<->${entry.fileB}`;\n })\n .sort((a, b) => a.localeCompare(b));\n\n return evidence.join(\", \");\n};\n","import type { CodeSentinelSnapshot, SnapshotDiff } from \"./domain.js\";\nimport { round4 } from \"./domain.js\";\n\ntype ScoreEntry = { target: string; before: number; after: number; delta: number };\n\nconst diffSets = (\n current: readonly string[],\n baseline: readonly string[],\n): { added: readonly string[]; removed: readonly string[] } => {\n const currentSet = new Set(current);\n const baselineSet = new Set(baseline);\n\n const added = [...currentSet]\n .filter((item) => !baselineSet.has(item))\n .sort((a, b) => a.localeCompare(b));\n const removed = [...baselineSet]\n .filter((item) => !currentSet.has(item))\n .sort((a, b) => a.localeCompare(b));\n\n return { added, removed };\n};\n\nconst diffScoreMap = (\n current: ReadonlyMap<string, number>,\n baseline: ReadonlyMap<string, number>,\n): readonly ScoreEntry[] => {\n const keys = [...new Set([...current.keys(), ...baseline.keys()])].sort((a, b) =>\n a.localeCompare(b),\n );\n\n return keys\n .map((key) => {\n const before = baseline.get(key) ?? 0;\n const after = current.get(key) ?? 0;\n const delta = round4(after - before);\n return {\n target: key,\n before: round4(before),\n after: round4(after),\n delta,\n };\n })\n .filter((entry) => entry.delta !== 0)\n .sort((a, b) => Math.abs(b.delta) - Math.abs(a.delta) || a.target.localeCompare(b.target));\n};\n\nconst cycleKey = (nodes: readonly string[]): string =>\n [...nodes].sort((a, b) => a.localeCompare(b)).join(\" -> \");\n\nexport const compareSnapshots = (\n current: CodeSentinelSnapshot,\n baseline: CodeSentinelSnapshot,\n): SnapshotDiff => {\n const currentFileScores = new Map(\n current.analysis.risk.fileScores.map((item) => [item.file, item.score]),\n );\n const baselineFileScores = new Map(\n baseline.analysis.risk.fileScores.map((item) => [item.file, item.score]),\n );\n\n const currentModuleScores = new Map(\n current.analysis.risk.moduleScores.map((item) => [item.module, item.score]),\n );\n const baselineModuleScores = new Map(\n baseline.analysis.risk.moduleScores.map((item) => [item.module, item.score]),\n );\n\n const currentHotspots = current.analysis.risk.hotspots.slice(0, 10).map((item) => item.file);\n const baselineHotspots = baseline.analysis.risk.hotspots.slice(0, 10).map((item) => item.file);\n\n const currentCycles = current.analysis.structural.cycles.map((cycle) => cycleKey(cycle.nodes));\n const baselineCycles = baseline.analysis.structural.cycles.map((cycle) => cycleKey(cycle.nodes));\n\n const currentExternal = current.analysis.external.available\n ? current.analysis.external\n : {\n highRiskDependencies: [] as string[],\n singleMaintainerDependencies: [] as string[],\n abandonedDependencies: [] as string[],\n };\n const baselineExternal = baseline.analysis.external.available\n ? baseline.analysis.external\n : {\n highRiskDependencies: [] as string[],\n singleMaintainerDependencies: [] as string[],\n abandonedDependencies: [] as string[],\n };\n\n const highRisk = diffSets(\n currentExternal.highRiskDependencies,\n baselineExternal.highRiskDependencies,\n );\n const singleMaintainer = diffSets(\n currentExternal.singleMaintainerDependencies,\n baselineExternal.singleMaintainerDependencies,\n );\n const abandoned = diffSets(\n currentExternal.abandonedDependencies,\n baselineExternal.abandonedDependencies,\n );\n\n const hotspots = diffSets(currentHotspots, baselineHotspots);\n const cycles = diffSets(currentCycles, baselineCycles);\n\n return {\n riskScoreDelta: round4(current.analysis.risk.riskScore - baseline.analysis.risk.riskScore),\n normalizedScoreDelta: round4(\n current.analysis.risk.normalizedScore - baseline.analysis.risk.normalizedScore,\n ),\n fileRiskChanges: diffScoreMap(currentFileScores, baselineFileScores),\n moduleRiskChanges: diffScoreMap(currentModuleScores, baselineModuleScores),\n newHotspots: hotspots.added,\n resolvedHotspots: hotspots.removed,\n newCycles: cycles.added,\n resolvedCycles: cycles.removed,\n externalChanges: {\n highRiskAdded: highRisk.added,\n highRiskRemoved: highRisk.removed,\n singleMaintainerAdded: singleMaintainer.added,\n singleMaintainerRemoved: singleMaintainer.removed,\n abandonedAdded: abandoned.added,\n abandonedRemoved: abandoned.removed,\n },\n };\n};\n","import type { TargetTrace } from \"@codesentinel/core\";\nimport {\n REPORT_SCHEMA_VERSION,\n factorLabel,\n round4,\n toHealthTier,\n summarizeEvidence,\n toRiskTier,\n type CodeSentinelReport,\n type CodeSentinelSnapshot,\n type HotspotReportItem,\n type RepositoryDimensionScores,\n type RenderedFactor,\n type SnapshotDiff,\n} from \"./domain.js\";\n\nconst findTraceTarget = (\n snapshot: CodeSentinelSnapshot,\n targetType: TargetTrace[\"targetType\"],\n targetId: string,\n): TargetTrace | undefined =>\n snapshot.trace?.targets.find(\n (target) => target.targetType === targetType && target.targetId === targetId,\n );\n\nconst toRenderedFactors = (target: TargetTrace | undefined): readonly RenderedFactor[] => {\n if (target === undefined) {\n return [];\n }\n\n return [...target.factors]\n .sort((a, b) => b.contribution - a.contribution || a.factorId.localeCompare(b.factorId))\n .slice(0, 4)\n .map((factor) => ({\n id: factor.factorId,\n label: factorLabel(factor.factorId),\n contribution: round4(factor.contribution),\n confidence: round4(factor.confidence),\n evidence: summarizeEvidence(factor),\n }));\n};\n\nconst suggestedActions = (target: TargetTrace | undefined): readonly string[] => {\n if (target === undefined) {\n return [];\n }\n\n const actions: string[] = [];\n for (const lever of target.reductionLevers) {\n switch (lever.factorId) {\n case \"file.evolution\":\n case \"repository.evolution\":\n actions.push(\"Reduce recent churn and volatile edit frequency in this area.\");\n break;\n case \"file.structural\":\n case \"repository.structural\":\n actions.push(\"Reduce fan-in/fan-out concentration and simplify deep dependency paths.\");\n break;\n case \"file.composite.interactions\":\n case \"repository.composite.interactions\":\n actions.push(\"Stabilize central files before concurrent structural changes.\");\n break;\n case \"file.external\":\n case \"repository.external\":\n actions.push(\"Review external dependency pressure for this hotspot.\");\n break;\n default:\n actions.push(`Reduce ${factorLabel(lever.factorId).toLowerCase()} influence.`);\n break;\n }\n }\n\n return [...new Set(actions)].slice(0, 3);\n};\n\nconst hotspotItems = (snapshot: CodeSentinelSnapshot): readonly HotspotReportItem[] =>\n snapshot.analysis.risk.hotspots.slice(0, 10).map((hotspot) => {\n const fileScore = snapshot.analysis.risk.fileScores.find((item) => item.file === hotspot.file);\n const traceTarget = findTraceTarget(snapshot, \"file\", hotspot.file);\n const factors = toRenderedFactors(traceTarget);\n\n return {\n target: hotspot.file,\n score: hotspot.score,\n normalizedScore: fileScore?.normalizedScore ?? round4(hotspot.score / 100),\n topFactors: factors,\n suggestedActions: suggestedActions(traceTarget),\n biggestLevers: (traceTarget?.reductionLevers ?? [])\n .slice(0, 3)\n .map((lever) => `${factorLabel(lever.factorId)} (${lever.estimatedImpact})`),\n };\n });\n\nconst repositoryConfidence = (snapshot: CodeSentinelSnapshot): number | null => {\n const target = findTraceTarget(snapshot, \"repository\", snapshot.analysis.structural.targetPath);\n if (target === undefined || target.factors.length === 0) {\n return null;\n }\n\n const weight = target.factors.reduce((sum, factor) => sum + factor.contribution, 0);\n if (weight <= 0) {\n return null;\n }\n\n const weighted = target.factors.reduce(\n (sum, factor) => sum + factor.confidence * factor.contribution,\n 0,\n );\n return round4(weighted / weight);\n};\n\nconst repositoryDimensionScores = (snapshot: CodeSentinelSnapshot): RepositoryDimensionScores => {\n const target = findTraceTarget(snapshot, \"repository\", snapshot.analysis.structural.targetPath);\n if (target === undefined) {\n return {\n structural: null,\n evolution: null,\n external: null,\n interactions: null,\n };\n }\n\n const structural = target.factors.find((factor) => factor.factorId === \"repository.structural\");\n const evolution = target.factors.find((factor) => factor.factorId === \"repository.evolution\");\n const external = target.factors.find((factor) => factor.factorId === \"repository.external\");\n const interactions = target.factors.find(\n (factor) => factor.factorId === \"repository.composite.interactions\",\n );\n\n const interactionScore =\n interactions === undefined\n ? null\n : round4(\n ((interactions.rawMetrics[\"structuralEvolution\"] ?? 0) +\n (interactions.rawMetrics[\"centralInstability\"] ?? 0) +\n (interactions.rawMetrics[\"dependencyAmplification\"] ?? 0)) *\n 100,\n );\n\n return {\n structural:\n structural === undefined\n ? null\n : round4((structural.rawMetrics[\"structuralDimension\"] ?? 0) * 100),\n evolution:\n evolution === undefined\n ? null\n : round4((evolution.rawMetrics[\"evolutionDimension\"] ?? 0) * 100),\n external:\n external === undefined ? null : round4((external.rawMetrics[\"externalDimension\"] ?? 0) * 100),\n interactions: interactionScore,\n };\n};\n\nexport const createReport = (\n snapshot: CodeSentinelSnapshot,\n diff?: SnapshotDiff,\n): CodeSentinelReport => {\n const external = snapshot.analysis.external;\n\n return {\n schemaVersion: REPORT_SCHEMA_VERSION,\n generatedAt: new Date().toISOString(),\n repository: {\n targetPath: snapshot.analysis.structural.targetPath,\n riskScore: snapshot.analysis.risk.riskScore,\n normalizedScore: snapshot.analysis.risk.normalizedScore,\n riskTier: toRiskTier(snapshot.analysis.risk.riskScore),\n healthTier: toHealthTier(snapshot.analysis.health.healthScore),\n confidence: repositoryConfidence(snapshot),\n dimensionScores: repositoryDimensionScores(snapshot),\n },\n health: snapshot.analysis.health,\n hotspots: hotspotItems(snapshot),\n structural: {\n cycleCount: snapshot.analysis.structural.metrics.cycleCount,\n cycles: snapshot.analysis.structural.cycles.map((cycle) =>\n [...cycle.nodes].sort((a, b) => a.localeCompare(b)).join(\" -> \"),\n ),\n fragileClusters: snapshot.analysis.risk.fragileClusters.map((cluster) => ({\n id: cluster.id,\n kind: cluster.kind,\n score: cluster.score,\n files: [...cluster.files].sort((a, b) => a.localeCompare(b)),\n })),\n },\n external: !external.available\n ? {\n available: false,\n reason: external.reason,\n }\n : {\n available: true,\n highRiskDependencies: [...external.highRiskDependencies].sort((a, b) =>\n a.localeCompare(b),\n ),\n highRiskDevelopmentDependencies: [...external.highRiskDevelopmentDependencies].sort(\n (a, b) => a.localeCompare(b),\n ),\n singleMaintainerDependencies: [...external.singleMaintainerDependencies].sort((a, b) =>\n a.localeCompare(b),\n ),\n abandonedDependencies: [...external.abandonedDependencies].sort((a, b) =>\n a.localeCompare(b),\n ),\n },\n appendix: {\n snapshotSchemaVersion: snapshot.schemaVersion,\n riskModelVersion: snapshot.riskModelVersion,\n timestamp: snapshot.generatedAt,\n normalization:\n \"Scores are deterministic 0-100 outputs from risk-engine normalized factors and interaction terms.\",\n ...(snapshot.analysisConfig === undefined ? {} : { analysisConfig: snapshot.analysisConfig }),\n },\n ...(diff === undefined ? {} : { diff }),\n };\n};\n","import type { CodeSentinelReport } from \"./domain.js\";\n\nconst renderTextDiff = (report: CodeSentinelReport): string[] => {\n if (report.diff === undefined) {\n return [];\n }\n\n return [\n \"\",\n \"Diff\",\n ` riskScoreDelta: ${report.diff.riskScoreDelta}`,\n ` normalizedScoreDelta: ${report.diff.normalizedScoreDelta}`,\n ` newHotspots: ${report.diff.newHotspots.join(\", \") || \"none\"}`,\n ` resolvedHotspots: ${report.diff.resolvedHotspots.join(\", \") || \"none\"}`,\n ` newCycles: ${report.diff.newCycles.join(\", \") || \"none\"}`,\n ` resolvedCycles: ${report.diff.resolvedCycles.join(\", \") || \"none\"}`,\n ];\n};\n\nexport const renderTextReport = (report: CodeSentinelReport): string => {\n const lines: string[] = [];\n lines.push(\"Repository Summary\");\n lines.push(` target: ${report.repository.targetPath}`);\n lines.push(` riskScore: ${report.repository.riskScore}`);\n lines.push(` normalizedScore: ${report.repository.normalizedScore}`);\n lines.push(` riskTier: ${report.repository.riskTier}`);\n lines.push(` healthTier: ${report.repository.healthTier}`);\n lines.push(` confidence: ${report.repository.confidence ?? \"n/a\"}`);\n\n lines.push(\"\");\n lines.push(\"Dimension Scores (0-100)\");\n lines.push(` structural: ${report.repository.dimensionScores.structural ?? \"n/a\"}`);\n lines.push(` evolution: ${report.repository.dimensionScores.evolution ?? \"n/a\"}`);\n lines.push(` external: ${report.repository.dimensionScores.external ?? \"n/a\"}`);\n lines.push(` interactions: ${report.repository.dimensionScores.interactions ?? \"n/a\"}`);\n\n lines.push(\"\");\n lines.push(\"Health Summary\");\n lines.push(` healthScore: ${report.health.healthScore}`);\n lines.push(` normalizedScore: ${report.health.normalizedScore}`);\n lines.push(` modularity: ${report.health.dimensions.modularity}`);\n lines.push(` changeHygiene: ${report.health.dimensions.changeHygiene}`);\n lines.push(` testHealth: ${report.health.dimensions.testHealth}`);\n lines.push(` ownershipDistribution: ${report.health.dimensions.ownershipDistribution}`);\n lines.push(\" topIssues:\");\n for (const issue of report.health.topIssues.slice(0, 5)) {\n const ruleSuffix = issue.ruleId === undefined ? \"\" : ` [rule=${issue.ruleId}]`;\n lines.push(\n ` - [${issue.severity}] (${issue.dimension}) ${issue.id}${ruleSuffix} @ ${issue.target}: ${issue.message}`,\n );\n }\n if (report.health.topIssues.length === 0) {\n lines.push(\" - none\");\n }\n\n lines.push(\"\");\n lines.push(\"Top Hotspots\");\n for (const hotspot of report.hotspots) {\n lines.push(` - ${hotspot.target} | score=${hotspot.score}`);\n for (const factor of hotspot.topFactors) {\n lines.push(\n ` factor: ${factor.label} contribution=${factor.contribution} confidence=${factor.confidence}`,\n );\n lines.push(` evidence: ${factor.evidence}`);\n }\n lines.push(` priority actions: ${hotspot.suggestedActions.join(\" | \") || \"none\"}`);\n }\n\n lines.push(\"\");\n lines.push(\"Structural Observations\");\n lines.push(` cycleCount: ${report.structural.cycleCount}`);\n lines.push(` cycles: ${report.structural.cycles.join(\" ; \") || \"none\"}`);\n lines.push(` fragileClusters: ${report.structural.fragileClusters.length}`);\n\n lines.push(\"\");\n lines.push(\"External Exposure\");\n if (!report.external.available) {\n lines.push(` unavailable: ${report.external.reason}`);\n } else {\n lines.push(\n ` highRiskDependencies: ${report.external.highRiskDependencies.join(\", \") || \"none\"}`,\n );\n lines.push(\n ` highRiskDevelopmentDependencies: ${report.external.highRiskDevelopmentDependencies.join(\", \") || \"none\"}`,\n );\n lines.push(\n ` singleMaintainerDependencies: ${report.external.singleMaintainerDependencies.join(\", \") || \"none\"}`,\n );\n lines.push(\n ` abandonedDependencies: ${report.external.abandonedDependencies.join(\", \") || \"none\"}`,\n );\n }\n\n lines.push(\"\");\n lines.push(\"Appendix\");\n lines.push(` snapshotSchemaVersion: ${report.appendix.snapshotSchemaVersion}`);\n lines.push(` riskModelVersion: ${report.appendix.riskModelVersion}`);\n lines.push(` timestamp: ${report.appendix.timestamp}`);\n lines.push(` normalization: ${report.appendix.normalization}`);\n\n lines.push(...renderTextDiff(report));\n\n return lines.join(\"\\n\");\n};\n\nconst renderMarkdownDiff = (report: CodeSentinelReport): string[] => {\n if (report.diff === undefined) {\n return [];\n }\n\n return [\n \"\",\n \"## Diff\",\n `- riskScoreDelta: \\`${report.diff.riskScoreDelta}\\``,\n `- normalizedScoreDelta: \\`${report.diff.normalizedScoreDelta}\\``,\n `- newHotspots: ${report.diff.newHotspots.map((item) => `\\`${item}\\``).join(\", \") || \"none\"}`,\n `- resolvedHotspots: ${report.diff.resolvedHotspots.map((item) => `\\`${item}\\``).join(\", \") || \"none\"}`,\n `- newCycles: ${report.diff.newCycles.map((item) => `\\`${item}\\``).join(\", \") || \"none\"}`,\n `- resolvedCycles: ${report.diff.resolvedCycles.map((item) => `\\`${item}\\``).join(\", \") || \"none\"}`,\n ];\n};\n\nexport const renderMarkdownReport = (report: CodeSentinelReport): string => {\n const lines: string[] = [];\n lines.push(\"# CodeSentinel Report\");\n lines.push(\"\");\n lines.push(\"## Repository Summary\");\n lines.push(`- target: \\`${report.repository.targetPath}\\``);\n lines.push(`- riskScore: \\`${report.repository.riskScore}\\``);\n lines.push(`- normalizedScore: \\`${report.repository.normalizedScore}\\``);\n lines.push(`- riskTier: \\`${report.repository.riskTier}\\``);\n lines.push(`- healthTier: \\`${report.repository.healthTier}\\``);\n lines.push(`- confidence: \\`${report.repository.confidence ?? \"n/a\"}\\``);\n\n lines.push(\"\");\n lines.push(\"## Dimension Scores (0-100)\");\n lines.push(`- structural: \\`${report.repository.dimensionScores.structural ?? \"n/a\"}\\``);\n lines.push(`- evolution: \\`${report.repository.dimensionScores.evolution ?? \"n/a\"}\\``);\n lines.push(`- external: \\`${report.repository.dimensionScores.external ?? \"n/a\"}\\``);\n lines.push(`- interactions: \\`${report.repository.dimensionScores.interactions ?? \"n/a\"}\\``);\n\n lines.push(\"\");\n lines.push(\"## Health Summary\");\n lines.push(`- healthScore: \\`${report.health.healthScore}\\``);\n lines.push(`- normalizedScore: \\`${report.health.normalizedScore}\\``);\n lines.push(`- modularity: \\`${report.health.dimensions.modularity}\\``);\n lines.push(`- changeHygiene: \\`${report.health.dimensions.changeHygiene}\\``);\n lines.push(`- testHealth: \\`${report.health.dimensions.testHealth}\\``);\n lines.push(`- ownershipDistribution: \\`${report.health.dimensions.ownershipDistribution}\\``);\n if (report.health.topIssues.length === 0) {\n lines.push(\"- top issues: none\");\n } else {\n lines.push(\"- top issues:\");\n for (const issue of report.health.topIssues.slice(0, 5)) {\n const ruleSuffix = issue.ruleId === undefined ? \"\" : ` [rule=${issue.ruleId}]`;\n lines.push(\n ` - [${issue.severity}] \\`${issue.id}\\`${ruleSuffix} (\\`${issue.dimension}\\`) @ \\`${issue.target}\\`: ${issue.message}`,\n );\n }\n }\n\n lines.push(\"\");\n lines.push(\"## Top Hotspots\");\n for (const hotspot of report.hotspots) {\n lines.push(`- **${hotspot.target}** (score: \\`${hotspot.score}\\`)`);\n lines.push(` - Top factors:`);\n for (const factor of hotspot.topFactors) {\n lines.push(\n ` - ${factor.label}: contribution=\\`${factor.contribution}\\`, confidence=\\`${factor.confidence}\\``,\n );\n lines.push(` - evidence: \\`${factor.evidence}\\``);\n }\n lines.push(` - Priority actions: ${hotspot.suggestedActions.join(\" | \") || \"none\"}`);\n }\n\n lines.push(\"\");\n lines.push(\"## Structural Observations\");\n lines.push(`- cycles detected: \\`${report.structural.cycleCount}\\``);\n lines.push(\n `- cycles: ${report.structural.cycles.map((cycle) => `\\`${cycle}\\``).join(\", \") || \"none\"}`,\n );\n lines.push(`- fragile clusters: \\`${report.structural.fragileClusters.length}\\``);\n\n lines.push(\"\");\n lines.push(\"## External Exposure Summary\");\n if (!report.external.available) {\n lines.push(`- unavailable: \\`${report.external.reason}\\``);\n } else {\n lines.push(\n `- high-risk dependencies: ${report.external.highRiskDependencies.map((item) => `\\`${item}\\``).join(\", \") || \"none\"}`,\n );\n lines.push(\n `- high-risk development dependencies: ${report.external.highRiskDevelopmentDependencies.map((item) => `\\`${item}\\``).join(\", \") || \"none\"}`,\n );\n lines.push(\n `- single maintainer dependencies: ${report.external.singleMaintainerDependencies.map((item) => `\\`${item}\\``).join(\", \") || \"none\"}`,\n );\n lines.push(\n `- abandoned dependencies: ${report.external.abandonedDependencies.map((item) => `\\`${item}\\``).join(\", \") || \"none\"}`,\n );\n }\n\n lines.push(\"\");\n lines.push(\"## Appendix\");\n lines.push(`- snapshot schema: \\`${report.appendix.snapshotSchemaVersion}\\``);\n lines.push(`- risk model version: \\`${report.appendix.riskModelVersion}\\``);\n lines.push(`- timestamp: \\`${report.appendix.timestamp}\\``);\n lines.push(`- normalization: ${report.appendix.normalization}`);\n\n lines.push(...renderMarkdownDiff(report));\n\n return lines.join(\"\\n\");\n};\n","import type { AnalyzeSummary, RiskTrace } from \"@codesentinel/core\";\nimport {\n RISK_MODEL_VERSION,\n SNAPSHOT_SCHEMA_VERSION,\n type CodeSentinelSnapshot,\n} from \"./domain.js\";\n\nexport type CreateSnapshotInput = {\n analysis: AnalyzeSummary;\n trace?: RiskTrace;\n generatedAt?: string;\n analysisConfig?: Readonly<Record<string, string | number | boolean | null>>;\n};\n\nexport const createSnapshot = (input: CreateSnapshotInput): CodeSentinelSnapshot => ({\n schemaVersion: SNAPSHOT_SCHEMA_VERSION,\n generatedAt: input.generatedAt ?? new Date().toISOString(),\n riskModelVersion: RISK_MODEL_VERSION,\n source: {\n targetPath: input.analysis.structural.targetPath,\n },\n analysis: input.analysis,\n ...(input.trace === undefined ? {} : { trace: input.trace }),\n ...(input.analysisConfig === undefined ? {} : { analysisConfig: input.analysisConfig }),\n});\n\nexport const parseSnapshot = (raw: string): CodeSentinelSnapshot => {\n const parsed = JSON.parse(raw) as Partial<CodeSentinelSnapshot>;\n if (parsed.schemaVersion !== SNAPSHOT_SCHEMA_VERSION) {\n throw new Error(\"unsupported_snapshot_schema\");\n }\n\n if (typeof parsed.generatedAt !== \"string\") {\n throw new Error(\"invalid_snapshot_generated_at\");\n }\n\n if (parsed.analysis === undefined || parsed.analysis === null) {\n throw new Error(\"invalid_snapshot_analysis\");\n }\n\n if (parsed.source === undefined || typeof parsed.source.targetPath !== \"string\") {\n throw new Error(\"invalid_snapshot_source\");\n }\n\n return parsed as CodeSentinelSnapshot;\n};\n","import type { CodeSentinelReport, ReportFormat } from \"./domain.js\";\nimport { compareSnapshots } from \"./diff.js\";\nimport { createReport } from \"./report.js\";\nimport { renderMarkdownReport, renderTextReport } from \"./renderers.js\";\nimport { createSnapshot, parseSnapshot } from \"./snapshot.js\";\n\nexport {\n SNAPSHOT_SCHEMA_VERSION,\n REPORT_SCHEMA_VERSION,\n RISK_MODEL_VERSION,\n factorLabel,\n summarizeEvidence,\n type CodeSentinelSnapshot,\n type CodeSentinelReport,\n type SnapshotDiff,\n type ReportFormat,\n} from \"./domain.js\";\n\nexport { createSnapshot, parseSnapshot, compareSnapshots, createReport };\n\nexport const formatReport = (report: CodeSentinelReport, format: ReportFormat): string => {\n if (format === \"json\") {\n return JSON.stringify(report, null, 2);\n }\n\n if (format === \"md\") {\n return renderMarkdownReport(report);\n }\n\n return renderTextReport(report);\n};\n","import type { EvidenceRef } from \"@codesentinel/core\";\nimport type { CodeSentinelSnapshot, SnapshotDiff } from \"@codesentinel/reporter\";\n\nexport type ViolationSeverity = \"info\" | \"warn\" | \"error\";\n\nexport type Violation = {\n id: string;\n severity: ViolationSeverity;\n message: string;\n targets: readonly string[];\n evidenceRefs: readonly EvidenceRef[];\n};\n\nexport type FailOnLevel = \"error\" | \"warn\";\n\nexport type GateConfig = {\n maxRiskDelta?: number;\n maxHealthDelta?: number;\n noNewCycles?: boolean;\n noNewHighRiskDeps?: boolean;\n maxNewHotspots?: number;\n maxRiskScore?: number;\n minHealthScore?: number;\n newHotspotScoreThreshold?: number;\n failOn: FailOnLevel;\n};\n\nexport type GateEvaluationInput = {\n current: CodeSentinelSnapshot;\n baseline?: CodeSentinelSnapshot;\n diff?: SnapshotDiff;\n gateConfig: GateConfig;\n};\n\nexport type GateEvaluationResult = {\n violations: readonly Violation[];\n highestSeverity: ViolationSeverity | null;\n exitCode: 0 | 1 | 2;\n evaluatedGates: readonly string[];\n};\n\nexport const EXIT_CODES = {\n ok: 0,\n errorViolation: 1,\n warnViolation: 2,\n invalidConfiguration: 3,\n internalError: 4,\n} as const;\n\nexport class GovernanceConfigurationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"GovernanceConfigurationError\";\n }\n}\n\nexport const DEFAULT_NEW_HOTSPOT_SCORE_THRESHOLD = 60;\n","import type { EvidenceRef } from \"@codesentinel/core\";\nimport {\n DEFAULT_NEW_HOTSPOT_SCORE_THRESHOLD,\n GovernanceConfigurationError,\n type GateEvaluationInput,\n type GateEvaluationResult,\n type Violation,\n type ViolationSeverity,\n} from \"./domain.js\";\n\nconst severityRank: Readonly<Record<ViolationSeverity, number>> = {\n info: 0,\n warn: 1,\n error: 2,\n};\n\nconst compareSeverity = (\n left: ViolationSeverity | null,\n right: ViolationSeverity | null,\n): ViolationSeverity | null => {\n if (left === null) {\n return right;\n }\n if (right === null) {\n return left;\n }\n\n return severityRank[left] >= severityRank[right] ? left : right;\n};\n\nconst stableSortViolations = (violations: readonly Violation[]): readonly Violation[] =>\n [...violations].sort((a, b) => {\n const severity = severityRank[b.severity] - severityRank[a.severity];\n if (severity !== 0) {\n return severity;\n }\n\n if (a.id !== b.id) {\n return a.id.localeCompare(b.id);\n }\n\n const aTarget = a.targets[0] ?? \"\";\n const bTarget = b.targets[0] ?? \"\";\n if (aTarget !== bTarget) {\n return aTarget.localeCompare(bTarget);\n }\n\n return a.message.localeCompare(b.message);\n });\n\nconst makeViolation = (\n id: string,\n severity: ViolationSeverity,\n message: string,\n targets: readonly string[],\n evidenceRefs: readonly EvidenceRef[],\n): Violation => ({\n id,\n severity,\n message,\n targets: [...targets].sort((a, b) => a.localeCompare(b)),\n evidenceRefs,\n});\n\nconst requireDiff = (input: GateEvaluationInput, gateId: string): void => {\n if (input.baseline === undefined || input.diff === undefined) {\n throw new GovernanceConfigurationError(`${gateId} requires --compare <baseline.json>`);\n }\n};\n\nconst validateGateConfig = (input: GateEvaluationInput): void => {\n const config = input.gateConfig;\n\n if (\n config.maxRiskDelta !== undefined &&\n (!Number.isFinite(config.maxRiskDelta) || config.maxRiskDelta < 0)\n ) {\n throw new GovernanceConfigurationError(\"max-risk-delta must be a finite number >= 0\");\n }\n\n if (\n config.maxHealthDelta !== undefined &&\n (!Number.isFinite(config.maxHealthDelta) || config.maxHealthDelta < 0)\n ) {\n throw new GovernanceConfigurationError(\"max-health-delta must be a finite number >= 0\");\n }\n\n if (\n config.maxNewHotspots !== undefined &&\n (!Number.isInteger(config.maxNewHotspots) || config.maxNewHotspots < 0)\n ) {\n throw new GovernanceConfigurationError(\"max-new-hotspots must be an integer >= 0\");\n }\n\n if (\n config.maxRiskScore !== undefined &&\n (!Number.isFinite(config.maxRiskScore) || config.maxRiskScore < 0 || config.maxRiskScore > 100)\n ) {\n throw new GovernanceConfigurationError(\"max-risk-score must be a number in [0, 100]\");\n }\n\n if (\n config.minHealthScore !== undefined &&\n (!Number.isFinite(config.minHealthScore) ||\n config.minHealthScore < 0 ||\n config.minHealthScore > 100)\n ) {\n throw new GovernanceConfigurationError(\"min-health-score must be a number in [0, 100]\");\n }\n\n if (\n config.newHotspotScoreThreshold !== undefined &&\n (!Number.isFinite(config.newHotspotScoreThreshold) ||\n config.newHotspotScoreThreshold < 0 ||\n config.newHotspotScoreThreshold > 100)\n ) {\n throw new GovernanceConfigurationError(\n \"new-hotspot-score-threshold must be a number in [0, 100]\",\n );\n }\n};\n\nexport const evaluateGates = (input: GateEvaluationInput): GateEvaluationResult => {\n validateGateConfig(input);\n\n const config = input.gateConfig;\n const violations: Violation[] = [];\n const evaluatedGates: string[] = [];\n\n if (config.maxRiskScore !== undefined) {\n evaluatedGates.push(\"max-risk-score\");\n const current = input.current.analysis.risk.riskScore;\n if (current > config.maxRiskScore) {\n violations.push(\n makeViolation(\n \"max-risk-score\",\n \"error\",\n `Risk score ${current} exceeds configured max ${config.maxRiskScore}.`,\n [input.current.analysis.structural.targetPath],\n [{ kind: \"repository_metric\", metric: \"riskScore\" }],\n ),\n );\n }\n }\n\n if (config.minHealthScore !== undefined) {\n evaluatedGates.push(\"min-health-score\");\n const current = input.current.analysis.health.healthScore;\n if (current < config.minHealthScore) {\n violations.push(\n makeViolation(\n \"min-health-score\",\n \"error\",\n `Health score ${current} is below configured minimum ${config.minHealthScore}.`,\n [input.current.analysis.structural.targetPath],\n [{ kind: \"repository_metric\", metric: \"healthScore\" }],\n ),\n );\n }\n }\n\n if (config.maxRiskDelta !== undefined) {\n evaluatedGates.push(\"max-risk-delta\");\n requireDiff(input, \"max-risk-delta\");\n const baseline = input.baseline;\n if (baseline === undefined) {\n throw new GovernanceConfigurationError(\"max-risk-delta requires baseline snapshot\");\n }\n\n const delta =\n input.current.analysis.risk.normalizedScore - baseline.analysis.risk.normalizedScore;\n if (delta > config.maxRiskDelta) {\n violations.push(\n makeViolation(\n \"max-risk-delta\",\n \"error\",\n `Risk normalized score delta ${delta.toFixed(4)} exceeds allowed ${config.maxRiskDelta}.`,\n [input.current.analysis.structural.targetPath],\n [{ kind: \"repository_metric\", metric: \"normalizedScore\" }],\n ),\n );\n }\n }\n\n if (config.maxHealthDelta !== undefined) {\n evaluatedGates.push(\"max-health-delta\");\n requireDiff(input, \"max-health-delta\");\n const baseline = input.baseline;\n if (baseline === undefined) {\n throw new GovernanceConfigurationError(\"max-health-delta requires baseline snapshot\");\n }\n\n const delta =\n input.current.analysis.health.normalizedScore - baseline.analysis.health.normalizedScore;\n if (delta < -config.maxHealthDelta) {\n violations.push(\n makeViolation(\n \"max-health-delta\",\n \"error\",\n `Health normalized score delta ${delta.toFixed(4)} is below allowed minimum ${(-config.maxHealthDelta).toFixed(4)}.`,\n [input.current.analysis.structural.targetPath],\n [{ kind: \"repository_metric\", metric: \"healthNormalizedScore\" }],\n ),\n );\n }\n }\n\n if (config.noNewCycles === true) {\n evaluatedGates.push(\"no-new-cycles\");\n requireDiff(input, \"no-new-cycles\");\n const diff = input.diff;\n if (diff === undefined) {\n throw new GovernanceConfigurationError(\"no-new-cycles requires diff\");\n }\n if (diff.newCycles.length > 0) {\n violations.push(\n makeViolation(\n \"no-new-cycles\",\n \"error\",\n `Detected ${diff.newCycles.length} new structural cycle(s).`,\n diff.newCycles,\n [{ kind: \"repository_metric\", metric: \"cycleCount\" }],\n ),\n );\n }\n }\n\n if (config.noNewHighRiskDeps === true) {\n evaluatedGates.push(\"no-new-high-risk-deps\");\n requireDiff(input, \"no-new-high-risk-deps\");\n const diff = input.diff;\n if (diff === undefined) {\n throw new GovernanceConfigurationError(\"no-new-high-risk-deps requires diff\");\n }\n if (diff.externalChanges.highRiskAdded.length > 0) {\n violations.push(\n makeViolation(\n \"no-new-high-risk-deps\",\n \"error\",\n `Detected ${diff.externalChanges.highRiskAdded.length} new high-risk dependency(ies).`,\n diff.externalChanges.highRiskAdded,\n diff.externalChanges.highRiskAdded.map((name) => ({\n kind: \"dependency_metric\",\n target: name,\n metric: \"highRiskDependencies\",\n })),\n ),\n );\n }\n }\n\n if (config.maxNewHotspots !== undefined) {\n evaluatedGates.push(\"max-new-hotspots\");\n requireDiff(input, \"max-new-hotspots\");\n const diff = input.diff;\n if (diff === undefined) {\n throw new GovernanceConfigurationError(\"max-new-hotspots requires diff\");\n }\n\n const scoreByFile = new Map(\n input.current.analysis.risk.fileScores.map((item) => [item.file, item.score]),\n );\n const threshold = config.newHotspotScoreThreshold ?? DEFAULT_NEW_HOTSPOT_SCORE_THRESHOLD;\n const counted = diff.newHotspots.filter((file) => (scoreByFile.get(file) ?? 0) >= threshold);\n\n if (counted.length > config.maxNewHotspots) {\n violations.push(\n makeViolation(\n \"max-new-hotspots\",\n \"warn\",\n `Detected ${counted.length} new hotspot(s) above score ${threshold}; allowed max is ${config.maxNewHotspots}.`,\n counted,\n counted.map((file) => ({ kind: \"file_metric\", target: file, metric: \"score\" })),\n ),\n );\n }\n }\n\n const ordered = stableSortViolations(violations);\n const highestSeverity = ordered.reduce<ViolationSeverity | null>(\n (current, violation) => compareSeverity(current, violation.severity),\n null,\n );\n\n const exitCode: 0 | 1 | 2 =\n highestSeverity === \"error\"\n ? 1\n : highestSeverity === \"warn\" && config.failOn === \"warn\"\n ? 2\n : 0;\n\n return {\n violations: ordered,\n highestSeverity,\n exitCode,\n evaluatedGates: [...evaluatedGates].sort((a, b) => a.localeCompare(b)),\n };\n};\n","import { factorLabel, summarizeEvidence, type CodeSentinelSnapshot } from \"@codesentinel/reporter\";\nimport type { GateEvaluationResult, Violation } from \"./domain.js\";\n\nconst renderViolationText = (violation: Violation): string => {\n const targets = violation.targets.join(\", \") || \"n/a\";\n return `- [${violation.severity}] ${violation.id}: ${violation.message} (targets: ${targets})`;\n};\n\nexport const renderCheckText = (\n snapshot: CodeSentinelSnapshot,\n result: GateEvaluationResult,\n): string => {\n const lines: string[] = [];\n lines.push(\"CodeSentinel Check\");\n lines.push(`target: ${snapshot.analysis.structural.targetPath}`);\n lines.push(`riskScore: ${snapshot.analysis.risk.riskScore}`);\n lines.push(`evaluatedGates: ${result.evaluatedGates.join(\", \") || \"none\"}`);\n lines.push(`violations: ${result.violations.length}`);\n lines.push(`exitCode: ${result.exitCode}`);\n lines.push(\"\");\n lines.push(\"Violations\");\n if (result.violations.length === 0) {\n lines.push(\"- none\");\n } else {\n for (const violation of result.violations) {\n lines.push(renderViolationText(violation));\n }\n }\n\n return lines.join(\"\\n\");\n};\n\nexport const renderCheckMarkdown = (\n snapshot: CodeSentinelSnapshot,\n result: GateEvaluationResult,\n): string => {\n const lines: string[] = [];\n lines.push(\"## CodeSentinel CI Summary\");\n lines.push(`- target: \\`${snapshot.analysis.structural.targetPath}\\``);\n lines.push(`- riskScore: \\`${snapshot.analysis.risk.riskScore}\\``);\n lines.push(\n `- evaluatedGates: ${result.evaluatedGates.map((item) => `\\`${item}\\``).join(\", \") || \"none\"}`,\n );\n lines.push(`- violations: \\`${result.violations.length}\\``);\n lines.push(`- exitCode: \\`${result.exitCode}\\``);\n\n const repositoryTrace = snapshot.trace?.targets.find(\n (target) =>\n target.targetType === \"repository\" &&\n target.targetId === snapshot.analysis.structural.targetPath,\n );\n if (repositoryTrace !== undefined) {\n lines.push(\"\");\n lines.push(\"### Why\");\n const topFactors = [...repositoryTrace.factors]\n .sort((a, b) => b.contribution - a.contribution || a.factorId.localeCompare(b.factorId))\n .slice(0, 3);\n\n for (const factor of topFactors) {\n lines.push(\n `- ${factorLabel(factor.factorId)}: contribution=\\`${factor.contribution}\\`, evidence=\\`${summarizeEvidence(factor)}\\``,\n );\n }\n }\n\n lines.push(\"\");\n lines.push(\"### Violations\");\n if (result.violations.length === 0) {\n lines.push(\"- none\");\n } else {\n for (const violation of result.violations) {\n lines.push(`- [${violation.severity}] **${violation.id}**: ${violation.message}`);\n if (violation.targets.length > 0) {\n lines.push(` - targets: ${violation.targets.map((target) => `\\`${target}\\``).join(\", \")}`);\n }\n }\n }\n\n return lines.join(\"\\n\");\n};\n","import { mkdirSync, rmSync } from \"node:fs\";\nimport { basename, join, resolve } from \"node:path\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport type { CodeSentinelSnapshot } from \"@codesentinel/reporter\";\nimport {\n BaselineAutoResolutionError,\n resolveAutoBaseline,\n type BaselineAutoResolution,\n type GitCommandResult,\n} from \"./baseline-auto-resolver.js\";\n\nconst execFileAsync = promisify(execFile);\n\nconst SENTINEL_TMP_DIR = \".codesentinel-tmp\";\nconst WORKTREE_DIR = \"worktrees\";\n\nexport class BaselineRefResolutionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"BaselineRefResolutionError\";\n }\n}\n\nconst runGit = async (repositoryPath: string, args: readonly string[]): Promise<string> => {\n const result = await tryRunGit(repositoryPath, args);\n if (result.ok) {\n return result.stdout;\n }\n throw new BaselineRefResolutionError(result.message);\n};\n\nconst tryRunGit = async (\n repositoryPath: string,\n args: readonly string[],\n): Promise<GitCommandResult> => {\n try {\n const { stdout } = await execFileAsync(\"git\", [\"-C\", repositoryPath, ...args], {\n encoding: \"utf8\",\n });\n return { ok: true, stdout: stdout.trim() };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"unknown git error\";\n return { ok: false, message };\n }\n};\n\nconst buildWorktreePath = (repoRoot: string, sha: string): string => {\n const tmpRoot = join(repoRoot, SENTINEL_TMP_DIR, WORKTREE_DIR);\n mkdirSync(tmpRoot, { recursive: true });\n\n const baseName = `baseline-${sha.slice(0, 12)}-${process.pid}`;\n const candidate = resolve(tmpRoot, baseName);\n return candidate;\n};\n\nconst sanitizeSnapshotForWorktree = (\n snapshot: CodeSentinelSnapshot,\n worktreePath: string,\n canonicalPath: string,\n): CodeSentinelSnapshot => {\n const replacePrefix = (value: string): string =>\n value.startsWith(worktreePath) ? `${canonicalPath}${value.slice(worktreePath.length)}` : value;\n\n const structural = snapshot.analysis.structural;\n\n return {\n ...snapshot,\n source: {\n targetPath: replacePrefix(snapshot.source.targetPath),\n },\n analysis: {\n ...snapshot.analysis,\n structural: {\n ...structural,\n targetPath: replacePrefix(structural.targetPath),\n nodes: structural.nodes.map((node) => ({\n ...node,\n absolutePath: replacePrefix(node.absolutePath),\n })),\n },\n evolution: {\n ...snapshot.analysis.evolution,\n targetPath: replacePrefix(snapshot.analysis.evolution.targetPath),\n },\n external: {\n ...snapshot.analysis.external,\n targetPath: replacePrefix(snapshot.analysis.external.targetPath),\n },\n },\n };\n};\n\nexport type BaselineRefResolutionResult = {\n baselineSnapshot: CodeSentinelSnapshot;\n resolvedRef: string;\n resolvedSha: string;\n};\n\nexport type ResolveBaselineFromRefInput = {\n repositoryPath: string;\n baselineRef: string;\n analyzeWorktree: (worktreePath: string, repositoryRoot: string) => Promise<CodeSentinelSnapshot>;\n};\n\nexport type ResolveAutoBaselineRefInput = {\n repositoryPath: string;\n baselineSha?: string;\n mainBranchCandidates?: readonly string[];\n environment?: Readonly<Record<string, string | undefined>>;\n};\n\nexport const resolveBaselineSnapshotFromRef = async (\n input: ResolveBaselineFromRefInput,\n): Promise<BaselineRefResolutionResult> => {\n const repositoryPath = resolve(input.repositoryPath);\n const ref = input.baselineRef.trim();\n if (ref.length === 0) {\n throw new BaselineRefResolutionError(\"baseline-ref cannot be empty\");\n }\n\n const repoRoot = await runGit(repositoryPath, [\"rev-parse\", \"--show-toplevel\"]);\n const sha = await runGit(repositoryPath, [\"rev-parse\", \"--verify\", `${ref}^{commit}`]);\n\n const worktreePath = buildWorktreePath(repoRoot, sha);\n\n const cleanup = (): void => {\n try {\n rmSync(worktreePath, { recursive: true, force: true });\n } catch {\n // Best-effort fallback cleanup if worktree remove fails.\n }\n };\n\n try {\n await runGit(repoRoot, [\"worktree\", \"add\", \"--detach\", worktreePath, sha]);\n\n const snapshot = await input.analyzeWorktree(worktreePath, repoRoot);\n const sanitized = sanitizeSnapshotForWorktree(snapshot, worktreePath, repoRoot);\n\n return {\n baselineSnapshot: sanitized,\n resolvedRef: ref,\n resolvedSha: sha,\n };\n } finally {\n try {\n await runGit(repoRoot, [\"worktree\", \"remove\", \"--force\", worktreePath]);\n } catch {\n cleanup();\n }\n }\n};\n\nexport const baselineTempDirectoryName = (): string =>\n basename(join(SENTINEL_TMP_DIR, WORKTREE_DIR));\n\nexport const resolveAutoBaselineRef = async (\n input: ResolveAutoBaselineRefInput,\n): Promise<BaselineAutoResolution> => {\n const repositoryPath = resolve(input.repositoryPath);\n const repoRoot = await runGit(repositoryPath, [\"rev-parse\", \"--show-toplevel\"]);\n\n try {\n return await resolveAutoBaseline({\n ...(input.baselineSha === undefined ? {} : { baselineSha: input.baselineSha }),\n ...(input.environment === undefined ? {} : { environment: input.environment }),\n ...(input.mainBranchCandidates === undefined\n ? {}\n : { mainBranchCandidates: input.mainBranchCandidates }),\n git: {\n resolveCommit: async (ref: string): Promise<GitCommandResult> =>\n tryRunGit(repoRoot, [\"rev-parse\", \"--verify\", ref]),\n mergeBase: async (leftRef: string, rightRef: string): Promise<GitCommandResult> =>\n tryRunGit(repoRoot, [\"merge-base\", leftRef, rightRef]),\n currentBranch: async (): Promise<GitCommandResult> =>\n tryRunGit(repoRoot, [\"symbolic-ref\", \"--quiet\", \"--short\", \"HEAD\"]),\n isShallowRepository: async (): Promise<GitCommandResult> =>\n tryRunGit(repoRoot, [\"rev-parse\", \"--is-shallow-repository\"]),\n },\n });\n } catch (error) {\n if (error instanceof BaselineAutoResolutionError) {\n throw new BaselineRefResolutionError(error.message);\n }\n throw error;\n }\n};\n","export class BaselineAutoResolutionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"BaselineAutoResolutionError\";\n }\n}\n\nexport type BaselineAutoResolutionStrategy =\n | \"explicit_sha\"\n | \"ci_base_branch\"\n | \"main_branch_previous_commit\"\n | \"feature_branch_merge_base\";\n\nexport type BaselineAutoResolutionAttempt = {\n step: string;\n candidate: string;\n outcome: \"resolved\" | \"failed\" | \"skipped\";\n detail?: string;\n};\n\nexport type BaselineAutoResolution = {\n strategy: BaselineAutoResolutionStrategy;\n resolvedRef: string;\n resolvedSha: string;\n attempts: readonly BaselineAutoResolutionAttempt[];\n baseBranch?: string;\n};\n\nexport type GitCommandResult = { ok: true; stdout: string } | { ok: false; message: string };\n\nexport type BaselineAutoGitAdapter = {\n resolveCommit: (ref: string) => Promise<GitCommandResult>;\n mergeBase: (leftRef: string, rightRef: string) => Promise<GitCommandResult>;\n currentBranch: () => Promise<GitCommandResult>;\n isShallowRepository: () => Promise<GitCommandResult>;\n};\n\nexport type ResolveAutoBaselineInput = {\n baselineSha?: string;\n environment?: Readonly<Record<string, string | undefined>>;\n mainBranchCandidates?: readonly string[];\n git: BaselineAutoGitAdapter;\n};\n\nconst DEFAULT_MAIN_BRANCH_CANDIDATES = [\"main\", \"master\"] as const;\n\nconst providerBaseBranchKeys = [\n \"GITHUB_BASE_REF\",\n \"CI_MERGE_REQUEST_TARGET_BRANCH_NAME\",\n \"BITBUCKET_PR_DESTINATION_BRANCH\",\n] as const;\n\nconst normalizeMainBranches = (input: readonly string[] | undefined): readonly string[] => {\n const source = input === undefined || input.length === 0 ? DEFAULT_MAIN_BRANCH_CANDIDATES : input;\n const seen = new Set<string>();\n const values: string[] = [];\n\n for (const candidate of source) {\n const trimmed = candidate.trim();\n if (trimmed.length === 0 || seen.has(trimmed)) {\n continue;\n }\n seen.add(trimmed);\n values.push(trimmed);\n }\n\n return values.length > 0 ? values : DEFAULT_MAIN_BRANCH_CANDIDATES;\n};\n\nconst firstNonEmptyEnv = (\n environment: Readonly<Record<string, string | undefined>>,\n): { key: string; value: string } | undefined => {\n for (const key of providerBaseBranchKeys) {\n const value = environment[key]?.trim();\n if (value !== undefined && value.length > 0) {\n return { key, value };\n }\n }\n return undefined;\n};\n\nconst asBoolean = (value: string): boolean => {\n return value.trim().toLowerCase() === \"true\";\n};\n\nconst buildNoBaselineMessage = (): string => {\n return \"unable to resolve auto baseline; set --baseline-ref <ref> explicitly or provide --baseline <snapshot.json>\";\n};\n\nexport const resolveAutoBaseline = async (\n input: ResolveAutoBaselineInput,\n): Promise<BaselineAutoResolution> => {\n const attempts: BaselineAutoResolutionAttempt[] = [];\n const mainBranches = normalizeMainBranches(input.mainBranchCandidates);\n const environment = input.environment ?? {};\n\n const baselineSha = input.baselineSha?.trim();\n if (baselineSha !== undefined && baselineSha.length > 0) {\n const result = await input.git.resolveCommit(`${baselineSha}^{commit}`);\n if (result.ok) {\n attempts.push({ step: \"explicit-sha\", candidate: baselineSha, outcome: \"resolved\" });\n return {\n strategy: \"explicit_sha\",\n resolvedRef: baselineSha,\n resolvedSha: result.stdout,\n attempts,\n };\n }\n\n attempts.push({\n step: \"explicit-sha\",\n candidate: baselineSha,\n outcome: \"failed\",\n detail: result.message,\n });\n throw new BaselineAutoResolutionError(\n `invalid --baseline-sha '${baselineSha}': ${result.message}`,\n );\n }\n\n const providerBaseBranch = firstNonEmptyEnv(environment);\n if (providerBaseBranch !== undefined) {\n const originRef = `origin/${providerBaseBranch.value}`;\n const originResult = await input.git.resolveCommit(`${originRef}^{commit}`);\n if (originResult.ok) {\n attempts.push({\n step: `ci-base-branch:${providerBaseBranch.key}`,\n candidate: originRef,\n outcome: \"resolved\",\n });\n return {\n strategy: \"ci_base_branch\",\n resolvedRef: originRef,\n resolvedSha: originResult.stdout,\n attempts,\n baseBranch: providerBaseBranch.value,\n };\n }\n attempts.push({\n step: `ci-base-branch:${providerBaseBranch.key}`,\n candidate: originRef,\n outcome: \"failed\",\n detail: originResult.message,\n });\n\n const localRef = providerBaseBranch.value;\n const localResult = await input.git.resolveCommit(`${localRef}^{commit}`);\n if (localResult.ok) {\n attempts.push({\n step: `ci-base-branch-local:${providerBaseBranch.key}`,\n candidate: localRef,\n outcome: \"resolved\",\n });\n return {\n strategy: \"ci_base_branch\",\n resolvedRef: localRef,\n resolvedSha: localResult.stdout,\n attempts,\n baseBranch: providerBaseBranch.value,\n };\n }\n attempts.push({\n step: `ci-base-branch-local:${providerBaseBranch.key}`,\n candidate: localRef,\n outcome: \"failed\",\n detail: localResult.message,\n });\n } else {\n attempts.push({\n step: \"ci-base-branch\",\n candidate: providerBaseBranchKeys.join(\",\"),\n outcome: \"skipped\",\n detail: \"no CI base branch environment variable found\",\n });\n }\n\n const branchResult = await input.git.currentBranch();\n const branchName = branchResult.ok ? branchResult.stdout.trim() : undefined;\n if (branchName !== undefined && mainBranches.includes(branchName)) {\n const headPrevious = await input.git.resolveCommit(\"HEAD~1^{commit}\");\n if (headPrevious.ok) {\n attempts.push({\n step: \"main-branch-head-previous\",\n candidate: \"HEAD~1\",\n outcome: \"resolved\",\n });\n return {\n strategy: \"main_branch_previous_commit\",\n resolvedRef: \"HEAD~1\",\n resolvedSha: headPrevious.stdout,\n attempts,\n };\n }\n attempts.push({\n step: \"main-branch-head-previous\",\n candidate: \"HEAD~1\",\n outcome: \"failed\",\n detail: headPrevious.message,\n });\n throw new BaselineAutoResolutionError(\n `unable to resolve baseline from HEAD~1 on branch '${branchName}': ${headPrevious.message}`,\n );\n }\n\n if (branchName === undefined) {\n attempts.push({\n step: \"current-branch\",\n candidate: \"HEAD\",\n outcome: \"skipped\",\n detail: \"detached HEAD or symbolic-ref unavailable\",\n });\n } else {\n attempts.push({\n step: \"current-branch\",\n candidate: branchName,\n outcome: \"resolved\",\n detail: \"feature branch detected\",\n });\n }\n\n const mergeBaseCandidates = [\n ...mainBranches.map((candidate) => `origin/${candidate}`),\n ...mainBranches,\n ];\n\n for (const candidate of mergeBaseCandidates) {\n const mergeBase = await input.git.mergeBase(\"HEAD\", candidate);\n if (mergeBase.ok) {\n attempts.push({\n step: \"merge-base\",\n candidate: `HEAD..${candidate}`,\n outcome: \"resolved\",\n });\n return {\n strategy: \"feature_branch_merge_base\",\n resolvedRef: mergeBase.stdout,\n resolvedSha: mergeBase.stdout,\n attempts,\n };\n }\n attempts.push({\n step: \"merge-base\",\n candidate: `HEAD..${candidate}`,\n outcome: \"failed\",\n detail: mergeBase.message,\n });\n }\n\n const shallowResult = await input.git.isShallowRepository();\n const shallowRepository = shallowResult.ok && asBoolean(shallowResult.stdout);\n if (shallowRepository) {\n throw new BaselineAutoResolutionError(\n `${buildNoBaselineMessage()}; repository appears shallow. Fetch full history (for example: git fetch --unshallow or fetch-depth: 0).`,\n );\n }\n\n throw new BaselineAutoResolutionError(buildNoBaselineMessage());\n};\n","import type { AnalyzeSummary } from \"@codesentinel/core\";\n\nexport type AnalyzeOutputMode = \"summary\" | \"json\";\n\ntype EvolutionAvailable = Extract<AnalyzeSummary[\"evolution\"], { available: true }>;\ntype ExternalAvailable = Extract<AnalyzeSummary[\"external\"], { available: true }>;\n\nconst toHealthTier = (score: number): \"critical\" | \"weak\" | \"fair\" | \"good\" | \"excellent\" => {\n if (score < 20) {\n return \"critical\";\n }\n if (score < 40) {\n return \"weak\";\n }\n if (score < 60) {\n return \"fair\";\n }\n if (score < 80) {\n return \"good\";\n }\n return \"excellent\";\n};\n\ntype SummaryShape = {\n targetPath: string;\n structural: AnalyzeSummary[\"structural\"][\"metrics\"];\n evolution:\n | {\n available: false;\n reason: \"not_git_repository\";\n }\n | {\n available: true;\n metrics: EvolutionAvailable[\"metrics\"];\n hotspotsTop: readonly string[];\n };\n external:\n | {\n available: false;\n reason:\n | \"package_json_not_found\"\n | \"lockfile_not_found\"\n | \"unsupported_lockfile_format\"\n | \"invalid_lockfile\";\n }\n | {\n available: true;\n metrics: ExternalAvailable[\"metrics\"];\n highRiskDependenciesTop: readonly string[];\n highRiskDevelopmentDependenciesTop: readonly string[];\n transitiveExposureDependenciesTop: readonly string[];\n };\n risk: {\n riskScore: number;\n normalizedScore: number;\n hotspotsTop: ReadonlyArray<{\n file: string;\n score: number;\n }>;\n fragileClusterCount: number;\n dependencyAmplificationZoneCount: number;\n };\n health: {\n healthScore: number;\n healthTier: \"critical\" | \"weak\" | \"fair\" | \"good\" | \"excellent\";\n normalizedScore: number;\n dimensions: AnalyzeSummary[\"health\"][\"dimensions\"];\n topIssues: AnalyzeSummary[\"health\"][\"topIssues\"];\n };\n};\n\nconst createSummaryShape = (summary: AnalyzeSummary): SummaryShape => ({\n targetPath: summary.structural.targetPath,\n structural: summary.structural.metrics,\n evolution: summary.evolution.available\n ? {\n available: true,\n metrics: summary.evolution.metrics,\n hotspotsTop: summary.evolution.hotspots.slice(0, 5).map((hotspot) => hotspot.filePath),\n }\n : {\n available: false,\n reason: summary.evolution.reason,\n },\n external: summary.external.available\n ? {\n available: true,\n metrics: summary.external.metrics,\n highRiskDependenciesTop: summary.external.highRiskDependencies.slice(0, 10),\n highRiskDevelopmentDependenciesTop: summary.external.highRiskDevelopmentDependencies.slice(\n 0,\n 10,\n ),\n transitiveExposureDependenciesTop: summary.external.transitiveExposureDependencies.slice(\n 0,\n 10,\n ),\n }\n : {\n available: false,\n reason: summary.external.reason,\n },\n risk: {\n riskScore: summary.risk.riskScore,\n normalizedScore: summary.risk.normalizedScore,\n hotspotsTop: summary.risk.hotspots.slice(0, 5).map((hotspot) => ({\n file: hotspot.file,\n score: hotspot.score,\n })),\n fragileClusterCount: summary.risk.fragileClusters.length,\n dependencyAmplificationZoneCount: summary.risk.dependencyAmplificationZones.length,\n },\n health: {\n healthScore: summary.health.healthScore,\n healthTier: toHealthTier(summary.health.healthScore),\n normalizedScore: summary.health.normalizedScore,\n dimensions: summary.health.dimensions,\n topIssues: summary.health.topIssues.slice(0, 5),\n },\n});\n\nexport const formatAnalyzeOutput = (summary: AnalyzeSummary, mode: AnalyzeOutputMode): string =>\n mode === \"json\"\n ? JSON.stringify(summary, null, 2)\n : JSON.stringify(createSummaryShape(summary), null, 2);\n","import type { AnalyzeSummary, RiskFactorTrace, RiskTrace, TargetTrace } from \"@codesentinel/core\";\nimport type { ExplainFormat } from \"./run-explain-command.js\";\n\nexport type ExplainOutputPayload = {\n summary: AnalyzeSummary;\n trace: RiskTrace;\n selectedTargets: readonly TargetTrace[];\n};\n\nconst sortFactorByContribution = (left: RiskFactorTrace, right: RiskFactorTrace): number =>\n right.contribution - left.contribution || left.factorId.localeCompare(right.factorId);\n\nconst toRiskBand = (score: number): \"low\" | \"moderate\" | \"elevated\" | \"high\" | \"very_high\" => {\n if (score < 20) {\n return \"low\";\n }\n if (score < 40) {\n return \"moderate\";\n }\n if (score < 60) {\n return \"elevated\";\n }\n if (score < 80) {\n return \"high\";\n }\n return \"very_high\";\n};\n\nconst factorLabelById: Readonly<Record<string, string>> = {\n \"repository.structural\": \"Structural complexity\",\n \"repository.evolution\": \"Change volatility\",\n \"repository.external\": \"External dependency pressure\",\n \"repository.composite.interactions\": \"Intersection amplification\",\n \"file.structural\": \"File structural complexity\",\n \"file.evolution\": \"File change volatility\",\n \"file.external\": \"File external pressure\",\n \"file.composite.interactions\": \"File interaction amplification\",\n \"module.average_file_risk\": \"Average file risk\",\n \"module.peak_file_risk\": \"Peak file risk\",\n \"dependency.signals\": \"Dependency risk signals\",\n \"dependency.staleness\": \"Dependency staleness\",\n \"dependency.maintainer_concentration\": \"Maintainer concentration\",\n \"dependency.topology\": \"Dependency topology pressure\",\n \"dependency.bus_factor\": \"Dependency bus factor\",\n \"dependency.popularity_dampening\": \"Popularity dampening\",\n};\n\nconst formatFactorLabel = (factorId: string): string => factorLabelById[factorId] ?? factorId;\n\nconst formatNumber = (value: number | null | undefined): string =>\n value === null || value === undefined ? \"n/a\" : `${value}`;\n\nconst formatDimension = (value: number | null): string => (value === null ? \"n/a\" : `${value}`);\n\nconst formatFactorSummary = (factor: RiskFactorTrace): string =>\n `${formatFactorLabel(factor.factorId)} (+${factor.contribution}, confidence=${factor.confidence})`;\n\nconst formatFactorContribution = (factor: RiskFactorTrace): string =>\n `${formatFactorLabel(factor.factorId)}=${factor.contribution}`;\n\nconst formatFactorEvidence = (factor: RiskFactorTrace): string => {\n if (factor.factorId === \"repository.structural\") {\n return `structural dimension=${formatNumber(factor.rawMetrics[\"structuralDimension\"])}`;\n }\n\n if (factor.factorId === \"repository.evolution\") {\n return `evolution dimension=${formatNumber(factor.rawMetrics[\"evolutionDimension\"])}`;\n }\n\n if (factor.factorId === \"repository.external\") {\n return `external dimension=${formatNumber(factor.rawMetrics[\"externalDimension\"])}`;\n }\n\n if (factor.factorId === \"repository.composite.interactions\") {\n return `structural×evolution=${formatNumber(factor.rawMetrics[\"structuralEvolution\"])}, central instability=${formatNumber(factor.rawMetrics[\"centralInstability\"])}, dependency amplification=${formatNumber(factor.rawMetrics[\"dependencyAmplification\"])}`;\n }\n\n if (factor.factorId === \"file.structural\") {\n return `fanIn=${formatNumber(factor.rawMetrics[\"fanIn\"])}, fanOut=${formatNumber(factor.rawMetrics[\"fanOut\"])}, depth=${formatNumber(factor.rawMetrics[\"depth\"])}, inCycle=${formatNumber(factor.rawMetrics[\"cycleParticipation\"])}, structuralAttenuation=${formatNumber(factor.rawMetrics[\"structuralAttenuation\"])}`;\n }\n\n if (factor.factorId === \"file.evolution\") {\n return `commitCount=${formatNumber(factor.rawMetrics[\"commitCount\"])}, churnTotal=${formatNumber(factor.rawMetrics[\"churnTotal\"])}, recentVolatility=${formatNumber(factor.rawMetrics[\"recentVolatility\"])}`;\n }\n\n if (factor.factorId === \"file.external\") {\n return `repositoryExternalPressure=${formatNumber(factor.rawMetrics[\"repositoryExternalPressure\"])}, dependencyAffinity=${formatNumber(factor.rawMetrics[\"dependencyAffinity\"])}`;\n }\n\n if (factor.factorId === \"file.composite.interactions\") {\n return `structural×evolution=${formatNumber(factor.rawMetrics[\"structuralEvolutionInteraction\"])}, central instability=${formatNumber(factor.rawMetrics[\"centralInstabilityInteraction\"])}, dependency amplification=${formatNumber(factor.rawMetrics[\"dependencyAmplificationInteraction\"])}`;\n }\n\n return \"evidence available in trace\";\n};\n\nconst findRepositoryTarget = (targets: readonly TargetTrace[]): TargetTrace | undefined =>\n targets.find((target) => target.targetType === \"repository\");\n\nconst repositoryDimensionScores = (\n repositoryTarget: TargetTrace | undefined,\n): {\n structural: number | null;\n evolution: number | null;\n external: number | null;\n interactions: number | null;\n} => {\n if (repositoryTarget === undefined) {\n return {\n structural: null,\n evolution: null,\n external: null,\n interactions: null,\n };\n }\n\n const structural = repositoryTarget.factors.find(\n (factor) => factor.factorId === \"repository.structural\",\n );\n const evolution = repositoryTarget.factors.find(\n (factor) => factor.factorId === \"repository.evolution\",\n );\n const external = repositoryTarget.factors.find(\n (factor) => factor.factorId === \"repository.external\",\n );\n const interactions = repositoryTarget.factors.find(\n (factor) => factor.factorId === \"repository.composite.interactions\",\n );\n\n return {\n structural:\n structural === undefined\n ? null\n : Number(((structural.rawMetrics[\"structuralDimension\"] ?? 0) * 100).toFixed(4)),\n evolution:\n evolution === undefined\n ? null\n : Number(((evolution.rawMetrics[\"evolutionDimension\"] ?? 0) * 100).toFixed(4)),\n external:\n external === undefined\n ? null\n : Number(((external.rawMetrics[\"externalDimension\"] ?? 0) * 100).toFixed(4)),\n interactions:\n interactions === undefined\n ? null\n : Number(\n (\n ((interactions.rawMetrics[\"structuralEvolution\"] ?? 0) +\n (interactions.rawMetrics[\"centralInstability\"] ?? 0) +\n (interactions.rawMetrics[\"dependencyAmplification\"] ?? 0)) *\n 100\n ).toFixed(4),\n ),\n };\n};\n\nconst buildRepositoryActions = (\n payload: ExplainOutputPayload,\n repositoryTarget: TargetTrace | undefined,\n): readonly string[] => {\n if (repositoryTarget === undefined) {\n return [\"No repository trace available.\"];\n }\n\n const topHotspots = payload.summary.risk.hotspots.slice(0, 3).map((hotspot) => hotspot.file);\n const highRiskDependencies = payload.summary.external.available\n ? payload.summary.external.highRiskDependencies.slice(0, 3)\n : [];\n\n const actions: string[] = [];\n for (const lever of repositoryTarget.reductionLevers) {\n if (lever.factorId === \"repository.evolution\") {\n actions.push(\n `Reduce volatility/churn in top hotspots first: ${topHotspots.join(\", \") || \"no hotspots available\"}.`,\n );\n continue;\n }\n\n if (lever.factorId === \"repository.structural\") {\n actions.push(\n `Lower fan-in/fan-out and break cycles in central files: ${topHotspots.join(\", \") || \"no hotspots available\"}.`,\n );\n continue;\n }\n\n if (lever.factorId === \"repository.composite.interactions\") {\n actions.push(\n \"Stabilize central files before refactors; interaction effects are amplifying risk.\",\n );\n continue;\n }\n\n if (lever.factorId === \"repository.external\") {\n actions.push(\n `Review high-risk direct dependencies: ${highRiskDependencies.join(\", \") || \"none detected\"}.`,\n );\n continue;\n }\n }\n\n if (actions.length === 0) {\n actions.push(\"No clear reduction levers available from current trace.\");\n }\n\n return actions.slice(0, 3);\n};\n\nconst renderTargetText = (target: TargetTrace): string => {\n const lines: string[] = [];\n lines.push(`${target.targetType}: ${target.targetId}`);\n lines.push(` score: ${target.totalScore} (${target.normalizedScore})`);\n lines.push(\" top factors:\");\n\n const topFactors = [...target.factors].sort(sortFactorByContribution).slice(0, 5);\n for (const factor of topFactors) {\n lines.push(` - ${formatFactorSummary(factor)}`);\n lines.push(` evidence: ${formatFactorEvidence(factor)}`);\n }\n\n lines.push(\" reduction levers:\");\n for (const lever of target.reductionLevers) {\n lines.push(\n ` - ${formatFactorLabel(lever.factorId)} | estimatedImpact=${lever.estimatedImpact}`,\n );\n }\n\n return lines.join(\"\\n\");\n};\n\nconst renderText = (payload: ExplainOutputPayload): string => {\n const lines: string[] = [];\n const repositoryTarget =\n findRepositoryTarget(payload.selectedTargets) ?? findRepositoryTarget(payload.trace.targets);\n const repositoryTopFactors =\n repositoryTarget === undefined\n ? []\n : [...repositoryTarget.factors].sort(sortFactorByContribution).slice(0, 3);\n const dimensionScores = repositoryDimensionScores(repositoryTarget);\n const compositeFactors = repositoryTopFactors.filter((factor) => factor.family === \"composite\");\n\n lines.push(`target: ${payload.summary.structural.targetPath}`);\n lines.push(`riskScore: ${payload.summary.risk.riskScore}`);\n lines.push(`riskBand: ${toRiskBand(payload.summary.risk.riskScore)}`);\n lines.push(`selectedTargets: ${payload.selectedTargets.length}`);\n lines.push(\"dimensionScores:\");\n lines.push(` structural: ${formatDimension(dimensionScores.structural)}`);\n lines.push(` evolution: ${formatDimension(dimensionScores.evolution)}`);\n lines.push(` external: ${formatDimension(dimensionScores.external)}`);\n lines.push(` interactions: ${formatDimension(dimensionScores.interactions)}`);\n lines.push(\"\");\n lines.push(\"explanation:\");\n lines.push(\n ` key drivers: ${repositoryTopFactors.map(formatFactorSummary).join(\"; \") || \"insufficient data\"}`,\n );\n lines.push(\n ` contributions: ${repositoryTopFactors.map(formatFactorContribution).join(\", \") || \"insufficient data\"}`,\n );\n lines.push(\n ` interaction effects: ${compositeFactors.map((factor) => `${formatFactorLabel(factor.factorId)} [${formatFactorEvidence(factor)}]`).join(\"; \") || \"none\"}`,\n );\n lines.push(` priority actions: ${buildRepositoryActions(payload, repositoryTarget).join(\" \")}`);\n lines.push(\"\");\n\n for (const target of payload.selectedTargets) {\n lines.push(renderTargetText(target));\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\").trimEnd();\n};\n\nconst renderMarkdown = (payload: ExplainOutputPayload): string => {\n const lines: string[] = [];\n const repositoryTarget =\n findRepositoryTarget(payload.selectedTargets) ?? findRepositoryTarget(payload.trace.targets);\n const repositoryTopFactors =\n repositoryTarget === undefined\n ? []\n : [...repositoryTarget.factors].sort(sortFactorByContribution).slice(0, 3);\n const dimensionScores = repositoryDimensionScores(repositoryTarget);\n const compositeFactors = repositoryTopFactors.filter((factor) => factor.family === \"composite\");\n\n lines.push(`# CodeSentinel Explanation`);\n lines.push(`- target: \\`${payload.summary.structural.targetPath}\\``);\n lines.push(`- riskScore: \\`${payload.summary.risk.riskScore}\\``);\n lines.push(`- riskBand: \\`${toRiskBand(payload.summary.risk.riskScore)}\\``);\n lines.push(`- selectedTargets: \\`${payload.selectedTargets.length}\\``);\n lines.push(\"\");\n lines.push(\"## Dimension Scores (0-100)\");\n lines.push(`- structural: \\`${formatDimension(dimensionScores.structural)}\\``);\n lines.push(`- evolution: \\`${formatDimension(dimensionScores.evolution)}\\``);\n lines.push(`- external: \\`${formatDimension(dimensionScores.external)}\\``);\n lines.push(`- interactions: \\`${formatDimension(dimensionScores.interactions)}\\``);\n lines.push(\"\");\n lines.push(`## Summary`);\n lines.push(\n `- key drivers: ${repositoryTopFactors.map(formatFactorSummary).join(\"; \") || \"insufficient data\"}`,\n );\n lines.push(\n `- contributions: ${repositoryTopFactors.map(formatFactorContribution).join(\", \") || \"insufficient data\"}`,\n );\n lines.push(\n `- interaction effects: ${compositeFactors.map((factor) => `${formatFactorLabel(factor.factorId)} [${formatFactorEvidence(factor)}]`).join(\"; \") || \"none\"}`,\n );\n lines.push(`- priority actions: ${buildRepositoryActions(payload, repositoryTarget).join(\" \")}`);\n lines.push(\"\");\n\n for (const target of payload.selectedTargets) {\n lines.push(`## ${target.targetType}: \\`${target.targetId}\\``);\n lines.push(`- score: \\`${target.totalScore}\\` (\\`${target.normalizedScore}\\`)`);\n lines.push(`- Top factors:`);\n for (const factor of [...target.factors].sort(sortFactorByContribution).slice(0, 5)) {\n lines.push(\n ` - \\`${formatFactorLabel(factor.factorId)}\\` contribution=\\`${factor.contribution}\\` confidence=\\`${factor.confidence}\\``,\n );\n lines.push(` - evidence: \\`${formatFactorEvidence(factor)}\\``);\n }\n lines.push(`- Reduction levers:`);\n for (const lever of target.reductionLevers) {\n lines.push(\n ` - \\`${formatFactorLabel(lever.factorId)}\\` estimatedImpact=\\`${lever.estimatedImpact}\\``,\n );\n }\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\").trimEnd();\n};\n\nexport const formatExplainOutput = (\n payload: ExplainOutputPayload,\n format: ExplainFormat,\n): string => {\n if (format === \"json\") {\n return JSON.stringify(payload, null, 2);\n }\n\n if (format === \"md\") {\n return renderMarkdown(payload);\n }\n\n return renderText(payload);\n};\n","import type { AnalyzeDependencyCandidateResult } from \"@codesentinel/dependency-firewall\";\n\nexport type DependencyRiskOutputMode = \"summary\" | \"json\";\n\ntype UnavailableResult = Extract<AnalyzeDependencyCandidateResult, { available: false }>;\ntype AvailableResult = Extract<AnalyzeDependencyCandidateResult, { available: true }>;\n\ntype DependencyRiskSummaryShape =\n | {\n available: false;\n reason: UnavailableResult[\"reason\"];\n dependency: string;\n }\n | {\n available: true;\n dependency: AvailableResult[\"dependency\"];\n graph: AvailableResult[\"graph\"];\n assumptions: readonly string[];\n external: {\n available: boolean;\n metrics: Record<string, unknown> | null;\n ownRiskSignals: readonly string[];\n inheritedRiskSignals: readonly string[];\n highRiskDependenciesTop: readonly string[];\n transitiveExposureDependenciesTop: readonly string[];\n };\n };\n\nconst createSummaryShape = (\n result: AnalyzeDependencyCandidateResult,\n): DependencyRiskSummaryShape => {\n if (!result.available) {\n return {\n available: false,\n reason: result.reason,\n dependency: result.dependency,\n };\n }\n\n const direct = result.external.available ? result.external.dependencies[0] : undefined;\n\n return {\n available: true,\n dependency: result.dependency,\n graph: result.graph,\n assumptions: result.assumptions,\n external: {\n available: result.external.available,\n metrics: result.external.available ? result.external.metrics : null,\n ownRiskSignals: direct?.ownRiskSignals ?? [],\n inheritedRiskSignals: direct?.inheritedRiskSignals ?? [],\n highRiskDependenciesTop: result.external.available\n ? result.external.highRiskDependencies.slice(0, 10)\n : [],\n transitiveExposureDependenciesTop: result.external.available\n ? result.external.transitiveExposureDependencies.slice(0, 10)\n : [],\n },\n };\n};\n\nexport const formatDependencyRiskOutput = (\n result: AnalyzeDependencyCandidateResult,\n mode: DependencyRiskOutputMode,\n): string =>\n mode === \"json\"\n ? JSON.stringify(result, null, 2)\n : JSON.stringify(createSummaryShape(result), null, 2);\n","export type LogLevel = \"silent\" | \"error\" | \"warn\" | \"info\" | \"debug\";\n\nconst logLevelRank: Readonly<Record<Exclude<LogLevel, \"silent\">, number>> = {\n error: 0,\n warn: 1,\n info: 2,\n debug: 3,\n};\n\nexport type Logger = {\n error: (message: string) => void;\n warn: (message: string) => void;\n info: (message: string) => void;\n debug: (message: string) => void;\n};\n\nconst noop = (): void => {};\n\nexport const createSilentLogger = (): Logger => ({\n error: noop,\n warn: noop,\n info: noop,\n debug: noop,\n});\n\nconst shouldLog = (\n configuredLevel: LogLevel,\n messageLevel: Exclude<LogLevel, \"silent\">,\n): boolean => {\n if (configuredLevel === \"silent\") {\n return false;\n }\n\n return logLevelRank[messageLevel] <= logLevelRank[configuredLevel];\n};\n\nconst write = (messageLevel: Exclude<LogLevel, \"silent\">, message: string): void => {\n process.stderr.write(`[codesentinel] ${messageLevel.toUpperCase()} ${message}\\n`);\n};\n\nexport const createStderrLogger = (level: LogLevel): Logger => {\n if (level === \"silent\") {\n return createSilentLogger();\n }\n\n return {\n error: (message) => {\n if (shouldLog(level, \"error\")) {\n write(\"error\", message);\n }\n },\n warn: (message) => {\n if (shouldLog(level, \"warn\")) {\n write(\"warn\", message);\n }\n },\n info: (message) => {\n if (shouldLog(level, \"info\")) {\n write(\"info\", message);\n }\n },\n debug: (message) => {\n if (shouldLog(level, \"debug\")) {\n write(\"debug\", message);\n }\n },\n };\n};\n\nexport const parseLogLevel = (value: string | undefined): LogLevel => {\n switch (value) {\n case \"silent\":\n case \"error\":\n case \"warn\":\n case \"info\":\n case \"debug\":\n return value;\n default:\n return \"info\";\n }\n};\n","import { spawn } from \"node:child_process\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { stderr, stdin } from \"node:process\";\nimport { clearScreenDown, cursorTo, emitKeypressEvents } from \"node:readline\";\n\nconst UPDATE_CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000;\nconst UPDATE_CACHE_PATH = join(homedir(), \".cache\", \"codesentinel\", \"update-check.json\");\nconst SEMVER_PATTERN =\n /^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)(?:-(?<prerelease>[0-9A-Za-z.-]+))?(?:\\+[0-9A-Za-z.-]+)?$/;\nconst ANSI = {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n cyan: \"\\x1b[36m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n} as const;\n\nconst hideCursor = (): void => {\n stderr.write(\"\\x1b[?25l\");\n};\n\nconst showCursor = (): void => {\n stderr.write(\"\\x1b[?25h\");\n};\n\ntype Semver = {\n major: number;\n minor: number;\n patch: number;\n prerelease: readonly (number | string)[];\n};\n\ntype UpdateCheckCache = {\n lastCheckedAt: string;\n};\n\nconst parsePrereleaseIdentifier = (identifier: string): number | string => {\n if (/^\\d+$/.test(identifier)) {\n return Number.parseInt(identifier, 10);\n }\n return identifier;\n};\n\nconst parseSemver = (value: string): Semver | null => {\n const match = SEMVER_PATTERN.exec(value.trim());\n if (match === null) {\n return null;\n }\n\n const groups = match.groups;\n if (groups === undefined) {\n return null;\n }\n\n const majorRaw = groups[\"major\"];\n const minorRaw = groups[\"minor\"];\n const patchRaw = groups[\"patch\"];\n const prereleaseRaw = groups[\"prerelease\"];\n if (majorRaw === undefined || minorRaw === undefined || patchRaw === undefined) {\n return null;\n }\n\n const prerelease =\n prereleaseRaw === undefined || prereleaseRaw.length === 0\n ? []\n : prereleaseRaw.split(\".\").map(parsePrereleaseIdentifier);\n\n return {\n major: Number.parseInt(majorRaw, 10),\n minor: Number.parseInt(minorRaw, 10),\n patch: Number.parseInt(patchRaw, 10),\n prerelease,\n };\n};\n\nconst comparePrerelease = (\n left: readonly (number | string)[],\n right: readonly (number | string)[],\n): number => {\n if (left.length === 0 && right.length === 0) {\n return 0;\n }\n if (left.length === 0) {\n return 1;\n }\n if (right.length === 0) {\n return -1;\n }\n\n const length = Math.max(left.length, right.length);\n for (let index = 0; index < length; index += 1) {\n const leftValue = left[index];\n const rightValue = right[index];\n if (leftValue === undefined) {\n return -1;\n }\n if (rightValue === undefined) {\n return 1;\n }\n\n if (typeof leftValue === \"number\" && typeof rightValue === \"number\") {\n if (leftValue !== rightValue) {\n return leftValue > rightValue ? 1 : -1;\n }\n continue;\n }\n\n if (typeof leftValue === \"number\" && typeof rightValue === \"string\") {\n return -1;\n }\n if (typeof leftValue === \"string\" && typeof rightValue === \"number\") {\n return 1;\n }\n\n if (leftValue !== rightValue) {\n return leftValue > rightValue ? 1 : -1;\n }\n }\n\n return 0;\n};\n\nexport const compareVersions = (left: string, right: string): number | null => {\n const leftParsed = parseSemver(left);\n const rightParsed = parseSemver(right);\n if (leftParsed === null || rightParsed === null) {\n return null;\n }\n\n if (leftParsed.major !== rightParsed.major) {\n return leftParsed.major > rightParsed.major ? 1 : -1;\n }\n if (leftParsed.minor !== rightParsed.minor) {\n return leftParsed.minor > rightParsed.minor ? 1 : -1;\n }\n if (leftParsed.patch !== rightParsed.patch) {\n return leftParsed.patch > rightParsed.patch ? 1 : -1;\n }\n\n return comparePrerelease(leftParsed.prerelease, rightParsed.prerelease);\n};\n\nconst isTruthy = (value: string | undefined): boolean => {\n if (value === undefined) {\n return false;\n }\n return [\"1\", \"true\", \"yes\", \"on\"].includes(value.trim().toLowerCase());\n};\n\nexport const parseNpmViewVersionOutput = (output: string): string | null => {\n const trimmed = output.trim();\n if (trimmed.length === 0) {\n return null;\n }\n\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n if (typeof parsed === \"string\" && parsed.trim().length > 0) {\n return parsed.trim();\n }\n if (Array.isArray(parsed) && parsed.length > 0) {\n const latest = (parsed as unknown[]).at(-1);\n if (typeof latest === \"string\" && latest.trim().length > 0) {\n return latest.trim();\n }\n }\n } catch {\n return trimmed;\n }\n\n return null;\n};\n\nexport const renderUpdateInProgressMessage = (packageName: string): string =>\n `Updating CodeSentinel via \\`npm install -g ${packageName}\\`...\\n`;\n\nexport const renderUpdateSuccessMessage = (): string =>\n \"🎉 Update ran successfully! Please restart CodeSentinel.\\n\";\n\nexport const renderAlreadyUpToDateMessage = (currentVersion: string): string =>\n `CodeSentinel is already up to date (${currentVersion}).\\n`;\n\nexport const renderUpdateCheckFailedMessage = (): string =>\n \"CodeSentinel could not check for updates right now. Please try again later.\\n\";\n\nconst readCache = async (): Promise<UpdateCheckCache | null> => {\n try {\n const raw = await readFile(UPDATE_CACHE_PATH, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n if (\n typeof parsed === \"object\" &&\n parsed !== null &&\n typeof (parsed as { lastCheckedAt?: unknown }).lastCheckedAt === \"string\"\n ) {\n return { lastCheckedAt: (parsed as { lastCheckedAt: string }).lastCheckedAt };\n }\n } catch {\n return null;\n }\n\n return null;\n};\n\nconst writeCache = async (cache: UpdateCheckCache): Promise<void> => {\n await mkdir(dirname(UPDATE_CACHE_PATH), { recursive: true });\n await writeFile(UPDATE_CACHE_PATH, JSON.stringify(cache), \"utf8\");\n};\n\nexport const shouldRunUpdateCheck = (input: {\n argv: readonly string[];\n env: NodeJS.ProcessEnv;\n isInteractive: boolean;\n nowMs: number;\n lastCheckedAt: string | null;\n}): boolean => {\n if (!input.isInteractive) {\n return false;\n }\n if (isTruthy(input.env[\"CI\"])) {\n return false;\n }\n if (isTruthy(input.env[\"CODESENTINEL_NO_UPDATE_NOTIFIER\"])) {\n return false;\n }\n if (input.argv.some((argument) => argument === \"--help\" || argument === \"-h\")) {\n return false;\n }\n if (input.argv.some((argument) => argument === \"--version\" || argument === \"-V\")) {\n return false;\n }\n\n if (input.lastCheckedAt === null) {\n return true;\n }\n\n const lastCheckedMs = Date.parse(input.lastCheckedAt);\n if (!Number.isFinite(lastCheckedMs)) {\n return true;\n }\n\n return input.nowMs - lastCheckedMs >= UPDATE_CHECK_INTERVAL_MS;\n};\n\nconst runCommand = async (\n command: string,\n args: readonly string[],\n mode: \"capture\" | \"inherit\",\n): Promise<{ code: number; stdout: string }> => {\n return await new Promise((resolvePromise, reject) => {\n const child = spawn(command, [...args], {\n stdio: mode === \"inherit\" ? \"inherit\" : [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let stdoutRaw = \"\";\n if (mode === \"capture\" && child.stdout !== null) {\n child.stdout.setEncoding(\"utf8\");\n child.stdout.on(\"data\", (chunk: string) => {\n stdoutRaw += chunk;\n });\n }\n\n child.on(\"error\", (error) => {\n reject(error);\n });\n child.on(\"close\", (code) => {\n resolvePromise({ code: code ?? 1, stdout: stdoutRaw });\n });\n });\n};\n\nconst fetchLatestVersion = async (packageName: string): Promise<string | null> => {\n const result = await runCommand(\"npm\", [\"view\", packageName, \"version\", \"--json\"], \"capture\");\n if (result.code !== 0) {\n return null;\n }\n return parseNpmViewVersionOutput(result.stdout);\n};\n\ntype UpdatePromptChoice = \"install\" | \"skip\";\n\nconst renderUpdatePrompt = (\n packageName: string,\n latestVersion: string,\n currentVersion: string,\n selectedIndex: number,\n): number => {\n const options: readonly string[] = [\n `1. Update now (runs \\`npm install -g ${packageName}\\`)`,\n \"2. Skip\",\n ];\n\n const lines = [\n ` ${ANSI.bold}${ANSI.cyan}✨ Update available! ${currentVersion} -> ${latestVersion}${ANSI.reset}`,\n \"\",\n ` ${ANSI.dim}Release notes: https://github.com/getcodesentinel/codesentinel/releases/latest${ANSI.reset}`,\n \"\",\n ...options.map((option, index) => {\n const selected = index === selectedIndex;\n const prefix = selected ? `${ANSI.green}>${ANSI.reset}` : \" \";\n const text = selected ? `${ANSI.bold}${option}${ANSI.reset}` : option;\n return `${prefix} ${text}`;\n }),\n \"\",\n ` ${ANSI.dim}Use ↑/↓ to choose. Press enter to continue. Press q or Ctrl+C to exit.${ANSI.reset}`,\n ];\n\n stderr.write(lines.join(\"\\n\"));\n return lines.length;\n};\n\nconst promptInstall = async (\n packageName: string,\n latestVersion: string,\n currentVersion: string,\n): Promise<UpdatePromptChoice> => {\n if (!stdin.isTTY || !stderr.isTTY || typeof stdin.setRawMode !== \"function\") {\n stderr.write(\n `New version ${latestVersion} is available (current ${currentVersion}). Run: npm install -g @getcodesentinel/codesentinel@latest\\n`,\n );\n return \"skip\";\n }\n\n return await new Promise<UpdatePromptChoice>((resolve) => {\n emitKeypressEvents(stdin);\n\n let selectedIndex = 0;\n const previousRawMode = stdin.isRaw;\n\n const clearPromptArea = (): void => {\n cursorTo(stderr, 0, 0);\n clearScreenDown(stderr);\n };\n\n const redraw = (): void => {\n clearPromptArea();\n renderUpdatePrompt(packageName, latestVersion, currentVersion, selectedIndex);\n };\n\n const cleanup = (choice: UpdatePromptChoice): void => {\n stdin.off(\"keypress\", onKeypress);\n stdin.pause();\n if (typeof stdin.setRawMode === \"function\") {\n stdin.setRawMode(previousRawMode);\n }\n clearPromptArea();\n showCursor();\n if (choice === \"install\") {\n stderr.write(`${ANSI.yellow}${renderUpdateInProgressMessage(packageName)}${ANSI.reset}`);\n } else {\n stderr.write(\"\\n\");\n }\n resolve(choice);\n };\n\n const onKeypress = (_str: string, key: { name?: string; ctrl?: boolean }): void => {\n if (key.ctrl === true && key.name === \"c\") {\n cleanup(\"skip\");\n return;\n }\n\n if (key.name === \"q\") {\n cleanup(\"skip\");\n return;\n }\n\n if (key.name === \"up\") {\n selectedIndex = selectedIndex > 0 ? selectedIndex - 1 : 1;\n redraw();\n return;\n }\n if (key.name === \"down\") {\n selectedIndex = selectedIndex < 1 ? selectedIndex + 1 : 0;\n redraw();\n return;\n }\n if (key.name === \"return\" || key.name === \"enter\") {\n cleanup(selectedIndex === 0 ? \"install\" : \"skip\");\n }\n };\n\n stdin.on(\"keypress\", onKeypress);\n if (typeof stdin.setRawMode === \"function\") {\n hideCursor();\n stdin.setRawMode(true);\n }\n stdin.resume();\n redraw();\n });\n};\n\nconst installLatestVersion = async (packageName: string): Promise<boolean> => {\n const result = await runCommand(\"npm\", [\"install\", \"-g\", `${packageName}@latest`], \"inherit\");\n return result.code === 0;\n};\n\nexport const runManualCliUpdate = async (input: {\n packageName: string;\n currentVersion: string;\n}): Promise<number> => {\n const latestVersion = await fetchLatestVersion(input.packageName);\n if (latestVersion === null) {\n stderr.write(renderUpdateCheckFailedMessage());\n return 1;\n }\n\n const comparison = compareVersions(latestVersion, input.currentVersion);\n if (comparison === null) {\n stderr.write(renderUpdateCheckFailedMessage());\n return 1;\n }\n\n if (comparison <= 0) {\n stderr.write(renderAlreadyUpToDateMessage(input.currentVersion));\n return 0;\n }\n\n const choice = await promptInstall(input.packageName, latestVersion, input.currentVersion);\n if (choice !== \"install\") {\n return 0;\n }\n\n const installed = await installLatestVersion(input.packageName);\n if (installed) {\n stderr.write(renderUpdateSuccessMessage());\n return 0;\n }\n\n stderr.write(\n \"CodeSentinel update failed. You can retry with: npm install -g @getcodesentinel/codesentinel@latest\\n\",\n );\n return 1;\n};\n\nexport const checkForCliUpdates = async (input: {\n packageName: string;\n currentVersion: string;\n argv: readonly string[];\n env: NodeJS.ProcessEnv;\n}): Promise<void> => {\n try {\n const nowMs = Date.now();\n const cache = await readCache();\n const shouldCheck = shouldRunUpdateCheck({\n argv: input.argv,\n env: input.env,\n isInteractive: Boolean(process.stdout.isTTY) && Boolean(process.stdin.isTTY),\n nowMs,\n lastCheckedAt: cache?.lastCheckedAt ?? null,\n });\n if (!shouldCheck) {\n return;\n }\n\n await writeCache({ lastCheckedAt: new Date(nowMs).toISOString() });\n\n const latestVersion = await fetchLatestVersion(input.packageName);\n if (latestVersion === null) {\n return;\n }\n\n const comparison = compareVersions(latestVersion, input.currentVersion);\n if (comparison === null || comparison <= 0) {\n return;\n }\n\n const choice = await promptInstall(input.packageName, latestVersion, input.currentVersion);\n if (choice !== \"install\") {\n return;\n }\n\n const installed = await installLatestVersion(input.packageName);\n if (installed) {\n stderr.write(renderUpdateSuccessMessage());\n process.exit(0);\n } else {\n stderr.write(\n \"CodeSentinel update failed. You can retry with: npm install -g @getcodesentinel/codesentinel@latest\\n\",\n );\n }\n } catch {\n // Update checks are best-effort and must never block the CLI command.\n }\n};\n","import { spawn } from \"node:child_process\";\nimport { stderr, stdin, stdout } from \"node:process\";\nimport { clearScreenDown, cursorTo, emitKeypressEvents, moveCursor } from \"node:readline\";\nimport type { Interface as ReadlineInterface } from \"node:readline\";\nimport { createInterface as createPromisesInterface } from \"node:readline/promises\";\n\nconst ANSI = {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n cyan: \"\\x1b[36m\",\n green: \"\\x1b[32m\",\n} as const;\n\ntype MenuActionDefinition = {\n label: string;\n description: string;\n commandBuilder: () => readonly string[] | null | Promise<readonly string[] | null>;\n};\n\nconst isWhitespace = (value: string): boolean => /\\s/.test(value);\n\nexport const splitShellLikeArgs = (input: string): string[] => {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return [];\n }\n\n const result: string[] = [];\n let current = \"\";\n let quote: '\"' | \"'\" | null = null;\n let escaping = false;\n\n for (const character of trimmed) {\n if (escaping) {\n current += character;\n escaping = false;\n continue;\n }\n\n if (character === \"\\\\\") {\n escaping = true;\n continue;\n }\n\n if (quote !== null) {\n if (character === quote) {\n quote = null;\n } else {\n current += character;\n }\n continue;\n }\n\n if (character === '\"' || character === \"'\") {\n quote = character;\n continue;\n }\n\n if (isWhitespace(character)) {\n if (current.length > 0) {\n result.push(current);\n current = \"\";\n }\n continue;\n }\n\n current += character;\n }\n\n if (escaping) {\n current += \"\\\\\";\n }\n if (quote !== null) {\n throw new Error(\"Unterminated quoted argument\");\n }\n if (current.length > 0) {\n result.push(current);\n }\n\n return result;\n};\n\nconst renderMenu = (\n currentVersion: string,\n actions: readonly MenuActionDefinition[],\n selectedIndex: number,\n): void => {\n const optionLabels = actions.map((action, index) => `${index + 1}. ${action.label}`);\n const labelWidth = optionLabels.reduce((max, label) => Math.max(max, label.length), 0);\n const lines = [\n ` ${ANSI.bold}${ANSI.cyan}CodeSentinel${ANSI.reset} ${ANSI.dim}v${currentVersion}${ANSI.reset}`,\n \"\",\n \" Choose an action:\",\n \"\",\n ...actions.map((action, index) => {\n const selected = index === selectedIndex;\n const prefix = selected ? `${ANSI.green}>${ANSI.reset}` : \" \";\n const label = optionLabels[index]?.padEnd(labelWidth, \" \") ?? \"\";\n const renderedLabel = selected ? `${ANSI.bold}${label}${ANSI.reset}` : label;\n return `${prefix} ${renderedLabel} ${ANSI.dim}${action.description}${ANSI.reset}`;\n }),\n \"\",\n ` ${ANSI.dim}Use ↑/↓ to choose. Press enter to continue. Press q or Ctrl+C to exit.${ANSI.reset}`,\n ];\n\n stderr.write(lines.join(\"\\n\"));\n};\n\nconst clearTerminal = (): void => {\n cursorTo(stderr, 0, 0);\n clearScreenDown(stderr);\n};\n\nconst hideCursor = (): void => {\n stderr.write(\"\\x1b[?25l\");\n};\n\nconst showCursor = (): void => {\n stderr.write(\"\\x1b[?25h\");\n};\n\nconst promptSelection = async (\n currentVersion: string,\n actions: readonly MenuActionDefinition[],\n): Promise<number | \"exit\"> => {\n if (!stdin.isTTY || !stderr.isTTY || typeof stdin.setRawMode !== \"function\") {\n return \"exit\";\n }\n\n return await new Promise<number | \"exit\">((resolve) => {\n emitKeypressEvents(stdin);\n\n let selectedIndex = 0;\n const previousRawMode = stdin.isRaw;\n\n const redraw = (): void => {\n clearTerminal();\n renderMenu(currentVersion, actions, selectedIndex);\n moveCursor(stderr, -1, 0);\n };\n\n const cleanup = (selection: number | \"exit\"): void => {\n stdin.off(\"keypress\", onKeypress);\n stdin.pause();\n stdin.setRawMode(previousRawMode);\n clearTerminal();\n showCursor();\n resolve(selection);\n };\n\n const onKeypress = (_str: string, key: { name?: string; ctrl?: boolean }): void => {\n if (key.ctrl === true && key.name === \"c\") {\n cleanup(\"exit\");\n return;\n }\n\n if (key.name === \"q\") {\n cleanup(\"exit\");\n return;\n }\n\n if (key.name === \"up\") {\n selectedIndex = selectedIndex > 0 ? selectedIndex - 1 : actions.length - 1;\n redraw();\n return;\n }\n\n if (key.name === \"down\") {\n selectedIndex = selectedIndex < actions.length - 1 ? selectedIndex + 1 : 0;\n redraw();\n return;\n }\n\n if (key.name === \"return\" || key.name === \"enter\") {\n cleanup(selectedIndex);\n }\n };\n\n stdin.on(\"keypress\", onKeypress);\n hideCursor();\n stdin.setRawMode(true);\n stdin.resume();\n redraw();\n });\n};\n\nconst createPrompt = (): ReadlineInterface =>\n createPromisesInterface({\n input: stdin,\n output: stderr,\n }) as unknown as ReadlineInterface;\n\nconst promptText = async (\n prompt: ReadlineInterface,\n label: string,\n defaultValue?: string,\n): Promise<string> => {\n const suffix = defaultValue === undefined ? \"\" : ` [${defaultValue}]`;\n const answer = await (prompt as unknown as ReturnType<typeof createPromisesInterface>).question(\n `${label}${suffix}: `,\n );\n const trimmed = answer.trim();\n return trimmed.length > 0 ? trimmed : (defaultValue ?? \"\");\n};\n\nconst buildDependencyRiskArgs = async (): Promise<readonly string[] | null> => {\n const prompt = createPrompt();\n\n try {\n const dependency = await promptText(prompt, \"Dependency spec\", \"\");\n if (dependency.length === 0) {\n stderr.write(\"A dependency spec is required.\\n\");\n return null;\n }\n\n return [\"dependency-risk\", dependency];\n } finally {\n prompt.close();\n }\n};\n\nconst waitForReturnToMenu = async (): Promise<void> => {\n const prompt = createPromisesInterface({\n input: stdin,\n output: stderr,\n });\n\n try {\n await prompt.question(\"Press enter to return to the menu...\");\n } finally {\n prompt.close();\n }\n};\n\nconst runCliCommand = async (scriptPath: string, args: readonly string[]): Promise<number> => {\n return await new Promise((resolve, reject) => {\n const child = spawn(process.execPath, [...process.execArgv, scriptPath, ...args], {\n stdio: \"inherit\",\n env: {\n ...process.env,\n CODESENTINEL_NO_UPDATE_NOTIFIER: \"1\",\n },\n });\n\n child.on(\"error\", (error) => {\n reject(error);\n });\n child.on(\"close\", (code) => {\n resolve(code ?? 1);\n });\n });\n};\n\nexport const runInteractiveCliMenu = async (input: {\n currentVersion: string;\n scriptPath: string;\n}): Promise<number> => {\n if (!stdin.isTTY || !stderr.isTTY || !stdout.isTTY) {\n stderr.write(\"Interactive menu requires a TTY.\\n\");\n return 1;\n }\n\n const actions: readonly MenuActionDefinition[] = [\n {\n label: \"Run overview\",\n description: \"combined analyze + explain + report\",\n commandBuilder: () => [\"run\"],\n },\n {\n label: \"Analyze repository\",\n description: \"structural and health scoring summary\",\n commandBuilder: () => [\"analyze\"],\n },\n {\n label: \"Explain hotspots\",\n description: \"top findings in markdown by default\",\n commandBuilder: () => [\"explain\", \"--format\", \"md\"],\n },\n {\n label: \"Generate report\",\n description: \"create a full report for a repository\",\n commandBuilder: () => [\"report\", \"--format\", \"md\"],\n },\n {\n label: \"Run policy check\",\n description: \"execute governance gates\",\n commandBuilder: () => [\"check\"],\n },\n {\n label: \"Scan dependency risk\",\n description: \"inspect a package from the registry\",\n commandBuilder: buildDependencyRiskArgs,\n },\n ];\n\n while (true) {\n const selectedIndex = await promptSelection(input.currentVersion, actions);\n if (selectedIndex === \"exit\") {\n stderr.write(\"\\n\");\n return 0;\n }\n\n const selectedAction = actions[selectedIndex];\n if (selectedAction === undefined) {\n stderr.write(\"\\n\");\n return 1;\n }\n\n const args = await selectedAction.commandBuilder();\n if (args === null) {\n await waitForReturnToMenu();\n continue;\n }\n\n const exitCode = await runCliCommand(input.scriptPath, args);\n if (exitCode !== 0) {\n stderr.write(`\\nCommand exited with code ${exitCode}.\\n`);\n } else {\n stderr.write(\"\\n\");\n }\n await waitForReturnToMenu();\n }\n};\n","import { resolve } from \"node:path\";\nimport type { AnalyzeSummary } from \"@codesentinel/core\";\nimport {\n buildProjectGraphSummary,\n type ParseTypescriptProjectProgressEvent,\n} from \"@codesentinel/code-graph\";\nimport {\n analyzeDependencyExposureFromProject,\n type DependencyExposureProgressEvent,\n} from \"@codesentinel/dependency-firewall\";\nimport {\n analyzeRepositoryEvolutionFromGit,\n type EvolutionAnalysisProgressEvent,\n} from \"@codesentinel/git-analyzer\";\nimport {\n computeRepositoryHealthSummary,\n type HealthEngineConfig,\n} from \"@codesentinel/health-engine\";\nimport { computeRepositoryRiskSummary, type RiskEngineConfig } from \"@codesentinel/risk-engine\";\nimport { createSilentLogger, type Logger } from \"./logger.js\";\n\nexport type AuthorIdentityCliMode = \"likely_merge\" | \"strict_email\";\nexport type ScoringProfileCliMode = \"default\" | \"personal\";\nexport type AnalysisRuntimeOptions = {\n recentWindowDays?: number;\n scoringProfile?: ScoringProfileCliMode;\n};\n\nconst resolveTargetPath = (inputPath: string | undefined, cwd: string): string =>\n resolve(cwd, inputPath ?? \".\");\n\nexport type AnalysisInputs = {\n structural: AnalyzeSummary[\"structural\"];\n evolution: AnalyzeSummary[\"evolution\"];\n external: AnalyzeSummary[\"external\"];\n};\n\nconst scoringProfileConfig: Readonly<\n Record<ScoringProfileCliMode, Partial<RiskEngineConfig> | undefined>\n> = {\n default: undefined,\n personal: {\n evolutionFactorWeights: {\n frequency: 0.26,\n churn: 0.24,\n recentVolatility: 0.2,\n ownershipConcentration: 0.08,\n busFactorRisk: 0.04,\n },\n },\n};\n\nconst healthProfileConfig: Readonly<\n Record<ScoringProfileCliMode, Partial<HealthEngineConfig> | undefined>\n> = {\n default: undefined,\n personal: {\n ownershipPenaltyMultiplier: 0.25,\n },\n};\n\nexport const resolveRiskConfigForProfile = (\n scoringProfile: ScoringProfileCliMode | undefined,\n): Partial<RiskEngineConfig> | undefined => {\n return scoringProfileConfig[scoringProfile ?? \"default\"];\n};\n\nexport const resolveHealthConfigForProfile = (\n scoringProfile: ScoringProfileCliMode | undefined,\n): Partial<HealthEngineConfig> | undefined => {\n return healthProfileConfig[scoringProfile ?? \"default\"];\n};\n\nconst createExternalProgressReporter = (\n logger: Logger,\n): ((event: DependencyExposureProgressEvent) => void) => {\n let lastLoggedProgress = 0;\n\n return (event) => {\n switch (event.stage) {\n case \"package_json_loaded\":\n logger.debug(\"external: package.json loaded\");\n break;\n case \"lockfile_selected\":\n logger.info(`external: lockfile selected (${event.kind})`);\n break;\n case \"lockfile_parsed\":\n logger.info(\n `external: parsed ${event.dependencyNodes} locked dependencies (${event.directDependencies} direct)`,\n );\n break;\n case \"metadata_fetch_started\":\n logger.info(`external: fetching dependency metadata (${event.total} packages)`);\n break;\n case \"metadata_fetch_progress\": {\n const currentPercent =\n event.total === 0 ? 100 : Math.floor((event.completed / event.total) * 100);\n if (\n event.completed === event.total ||\n event.completed === 1 ||\n event.completed - lastLoggedProgress >= 25\n ) {\n lastLoggedProgress = event.completed;\n logger.info(\n `external: metadata progress ${event.completed}/${event.total} (${currentPercent}%)`,\n );\n logger.debug(`external: last package processed ${event.packageName}`);\n }\n break;\n }\n case \"metadata_fetch_completed\":\n logger.info(`external: metadata fetch completed (${event.total} packages)`);\n break;\n case \"summary_built\":\n logger.info(\n `external: summary built (${event.totalDependencies} total, ${event.directDependencies} direct)`,\n );\n break;\n }\n };\n};\n\nconst createStructuralProgressReporter = (\n logger: Logger,\n): ((event: ParseTypescriptProjectProgressEvent) => void) => {\n let lastProcessed = 0;\n\n return (event) => {\n switch (event.stage) {\n case \"config_resolved\":\n if (event.usedFallbackScan) {\n logger.info(\n `structural: using filesystem scan discovery (tsconfigs=${event.tsconfigCount})`,\n );\n } else {\n logger.info(`structural: discovered tsconfig graph (${event.tsconfigCount} configs)`);\n }\n break;\n case \"files_discovered\":\n logger.info(`structural: discovered ${event.totalSourceFiles} source files`);\n break;\n case \"program_created\":\n logger.debug(`structural: TypeScript program created (${event.totalSourceFiles} files)`);\n break;\n case \"file_processed\":\n if (\n event.processed === event.total ||\n event.processed === 1 ||\n event.processed - lastProcessed >= 50\n ) {\n lastProcessed = event.processed;\n logger.info(`structural: resolved ${event.processed}/${event.total} files`);\n logger.debug(`structural: last file processed ${event.filePath}`);\n }\n break;\n case \"edges_resolved\":\n logger.info(`structural: resolved ${event.totalEdges} dependency edges`);\n break;\n }\n };\n};\n\nconst createEvolutionProgressReporter = (\n logger: Logger,\n): ((event: EvolutionAnalysisProgressEvent) => void) => {\n let lastParsedRecords = 0;\n\n return (event) => {\n switch (event.stage) {\n case \"checking_git_repository\":\n logger.debug(\"evolution: checking git repository\");\n break;\n case \"not_git_repository\":\n logger.warn(\"evolution: target path is not a git repository\");\n break;\n case \"loading_commit_history\":\n logger.info(\"evolution: loading git history\");\n break;\n case \"history\":\n if (event.event.stage === \"git_log_received\") {\n logger.info(`evolution: git log loaded (${event.event.bytes} bytes)`);\n break;\n }\n\n if (event.event.stage === \"git_log_parsed\") {\n logger.info(`evolution: parsed ${event.event.commits} commits`);\n break;\n }\n\n if (\n event.event.stage === \"git_log_parse_progress\" &&\n (event.event.parsedRecords === event.event.totalRecords ||\n event.event.parsedRecords === 1 ||\n event.event.parsedRecords - lastParsedRecords >= 500)\n ) {\n lastParsedRecords = event.event.parsedRecords;\n const currentPercent =\n event.event.totalRecords === 0\n ? 100\n : Math.floor((event.event.parsedRecords / event.event.totalRecords) * 100);\n logger.info(\n `evolution: parse progress ${event.event.parsedRecords}/${event.event.totalRecords} (${currentPercent}%)`,\n );\n }\n break;\n case \"computing_metrics\":\n logger.info(\"evolution: computing metrics\");\n break;\n case \"analysis_completed\":\n logger.debug(`evolution: analysis completed (available=${event.available})`);\n break;\n }\n };\n};\n\nexport const collectAnalysisInputs = async (\n inputPath: string | undefined,\n authorIdentityMode: AuthorIdentityCliMode,\n options: AnalysisRuntimeOptions = {},\n logger: Logger = createSilentLogger(),\n): Promise<AnalysisInputs> => {\n const invocationCwd = process.env[\"INIT_CWD\"] ?? process.cwd();\n const targetPath = resolveTargetPath(inputPath, invocationCwd);\n logger.info(`analyzing repository: ${targetPath}`);\n\n logger.info(\"building structural graph\");\n const structural = buildProjectGraphSummary({\n projectPath: targetPath,\n onProgress: createStructuralProgressReporter(logger),\n });\n logger.debug(\n `structural metrics: nodes=${structural.metrics.nodeCount}, edges=${structural.metrics.edgeCount}, cycles=${structural.metrics.cycleCount}`,\n );\n\n logger.info(`analyzing git evolution (author identity: ${authorIdentityMode})`);\n const evolution = analyzeRepositoryEvolutionFromGit(\n {\n repositoryPath: targetPath,\n config: {\n authorIdentityMode,\n ...(options.recentWindowDays === undefined\n ? {}\n : { recentWindowDays: options.recentWindowDays }),\n },\n },\n createEvolutionProgressReporter(logger),\n );\n if (evolution.available) {\n logger.debug(\n `evolution metrics: commits=${evolution.metrics.totalCommits}, files=${evolution.metrics.totalFiles}, hotspotThreshold=${evolution.metrics.hotspotThresholdCommitCount}`,\n );\n } else {\n logger.warn(`evolution analysis unavailable: ${evolution.reason}`);\n }\n\n logger.info(\"analyzing external dependencies\");\n const external = await analyzeDependencyExposureFromProject(\n { repositoryPath: targetPath },\n createExternalProgressReporter(logger),\n );\n if (external.available) {\n logger.debug(\n `external metrics: total=${external.metrics.totalDependencies}, direct=${external.metrics.directDependencies}, transitive=${external.metrics.transitiveDependencies}`,\n );\n } else {\n logger.warn(`external analysis unavailable: ${external.reason}`);\n }\n\n return {\n structural,\n evolution,\n external,\n };\n};\n\nexport const runAnalyzeCommand = async (\n inputPath: string | undefined,\n authorIdentityMode: AuthorIdentityCliMode,\n options: AnalysisRuntimeOptions = {},\n logger: Logger = createSilentLogger(),\n): Promise<AnalyzeSummary> => {\n const analysisInputs = await collectAnalysisInputs(\n inputPath,\n authorIdentityMode,\n options,\n logger,\n );\n logger.info(\"computing risk summary\");\n const riskConfig = resolveRiskConfigForProfile(options.scoringProfile);\n const healthConfig = resolveHealthConfigForProfile(options.scoringProfile);\n const risk = computeRepositoryRiskSummary({\n structural: analysisInputs.structural,\n evolution: analysisInputs.evolution,\n external: analysisInputs.external,\n ...(riskConfig === undefined ? {} : { config: riskConfig }),\n });\n const health = computeRepositoryHealthSummary({\n structural: analysisInputs.structural,\n evolution: analysisInputs.evolution,\n ...(healthConfig === undefined ? {} : { config: healthConfig }),\n });\n logger.info(\n `analysis completed (riskScore=${risk.riskScore}, healthScore=${health.healthScore})`,\n );\n\n return {\n structural: analysisInputs.structural,\n evolution: analysisInputs.evolution,\n external: analysisInputs.external,\n risk,\n health,\n };\n};\n","export type NodeRecord = {\n id: string;\n absolutePath: string;\n relativePath: string;\n};\n\nexport type EdgeRecord = {\n from: string;\n to: string;\n};\n\nexport type GraphData = {\n nodes: readonly NodeRecord[];\n edges: readonly EdgeRecord[];\n adjacencyById: ReadonlyMap<string, readonly string[]>;\n};\n\nconst edgeKey = (from: string, to: string): string => `${from}\\u0000${to}`;\n\nexport const createGraphData = (\n nodes: readonly NodeRecord[],\n rawEdges: readonly EdgeRecord[],\n): GraphData => {\n const sortedNodes = [...nodes].sort((a, b) => a.id.localeCompare(b.id));\n const knownNodeIds = new Set(sortedNodes.map((node) => node.id));\n\n const uniqueEdgeMap = new Map<string, EdgeRecord>();\n for (const edge of rawEdges) {\n if (edge.from === edge.to) {\n continue;\n }\n\n if (!knownNodeIds.has(edge.from) || !knownNodeIds.has(edge.to)) {\n continue;\n }\n\n uniqueEdgeMap.set(edgeKey(edge.from, edge.to), edge);\n }\n\n const sortedEdges = [...uniqueEdgeMap.values()].sort((a, b) => {\n const fromCompare = a.from.localeCompare(b.from);\n if (fromCompare !== 0) {\n return fromCompare;\n }\n\n return a.to.localeCompare(b.to);\n });\n\n const adjacency = new Map<string, string[]>();\n for (const node of sortedNodes) {\n adjacency.set(node.id, []);\n }\n\n for (const edge of sortedEdges) {\n adjacency.get(edge.from)?.push(edge.to);\n }\n\n const adjacencyById = new Map<string, readonly string[]>();\n for (const [nodeId, targets] of adjacency.entries()) {\n adjacencyById.set(nodeId, [...targets]);\n }\n\n return {\n nodes: sortedNodes,\n edges: sortedEdges,\n adjacencyById,\n };\n};\n","type TarjanResult = {\n components: readonly (readonly string[])[];\n};\n\nexport const runTarjanScc = (\n adjacencyById: ReadonlyMap<string, readonly string[]>,\n): TarjanResult => {\n // SCC = group of nodes where every node can reach every other node through directed edges.\n // In this codebase, SCCs are used to detect dependency cycles before computing graph depth.\n let index = 0;\n const indices = new Map<string, number>();\n const lowLink = new Map<string, number>();\n const stack: string[] = [];\n const onStack = new Set<string>();\n const components: string[][] = [];\n\n const strongConnect = (nodeId: string): void => {\n indices.set(nodeId, index);\n lowLink.set(nodeId, index);\n index += 1;\n\n stack.push(nodeId);\n onStack.add(nodeId);\n\n const neighbors = adjacencyById.get(nodeId) ?? [];\n for (const nextId of neighbors) {\n if (!indices.has(nextId)) {\n strongConnect(nextId);\n const nodeLowLink = lowLink.get(nodeId);\n const nextLowLink = lowLink.get(nextId);\n if (nodeLowLink !== undefined && nextLowLink !== undefined && nextLowLink < nodeLowLink) {\n lowLink.set(nodeId, nextLowLink);\n }\n continue;\n }\n\n if (onStack.has(nextId)) {\n const nodeLowLink = lowLink.get(nodeId);\n const nextIndex = indices.get(nextId);\n if (nodeLowLink !== undefined && nextIndex !== undefined && nextIndex < nodeLowLink) {\n lowLink.set(nodeId, nextIndex);\n }\n }\n }\n\n const nodeLowLink = lowLink.get(nodeId);\n const nodeIndex = indices.get(nodeId);\n if (nodeLowLink === undefined || nodeIndex === undefined || nodeLowLink !== nodeIndex) {\n return;\n }\n\n const component: string[] = [];\n for (;;) {\n const popped = stack.pop();\n if (popped === undefined) {\n break;\n }\n\n onStack.delete(popped);\n component.push(popped);\n if (popped === nodeId) {\n break;\n }\n }\n\n component.sort((a, b) => a.localeCompare(b));\n components.push(component);\n };\n\n const nodeIds = [...adjacencyById.keys()].sort((a, b) => a.localeCompare(b));\n for (const nodeId of nodeIds) {\n if (!indices.has(nodeId)) {\n strongConnect(nodeId);\n }\n }\n\n components.sort((a, b) => {\n const firstA = a[0] ?? \"\";\n const firstB = b[0] ?? \"\";\n return firstA.localeCompare(firstB);\n });\n\n return { components };\n};\n","import type {\n FileDependency,\n GraphAnalysisSummary,\n GraphCycle,\n GraphMetrics,\n} from \"@codesentinel/core\";\nimport type { GraphData } from \"./graph-model.js\";\nimport { runTarjanScc } from \"./tarjan.js\";\n\ntype DepthComputation = {\n depthByNodeId: ReadonlyMap<string, number>;\n graphDepth: number;\n cycles: readonly GraphCycle[];\n};\n\nconst hasSelfLoop = (\n nodeId: string,\n adjacencyById: ReadonlyMap<string, readonly string[]>,\n): boolean => {\n const targets = adjacencyById.get(nodeId) ?? [];\n return targets.includes(nodeId);\n};\n\nconst computeCyclesAndDepth = (graph: GraphData): DepthComputation => {\n const { components } = runTarjanScc(graph.adjacencyById);\n\n const cycles: GraphCycle[] = [];\n const componentByNodeId = new Map<string, number>();\n components.forEach((component, index) => {\n for (const nodeId of component) {\n componentByNodeId.set(nodeId, index);\n }\n\n if (component.length > 1) {\n cycles.push({ nodes: [...component] });\n return;\n }\n\n const onlyNode = component[0];\n if (onlyNode !== undefined && hasSelfLoop(onlyNode, graph.adjacencyById)) {\n cycles.push({ nodes: [...component] });\n }\n });\n\n const dagOutgoing = new Map<number, Set<number>>();\n const inDegree = new Map<number, number>();\n\n for (let i = 0; i < components.length; i += 1) {\n dagOutgoing.set(i, new Set());\n inDegree.set(i, 0);\n }\n\n for (const edge of graph.edges) {\n const fromComponent = componentByNodeId.get(edge.from);\n const toComponent = componentByNodeId.get(edge.to);\n\n if (fromComponent === undefined || toComponent === undefined || fromComponent === toComponent) {\n continue;\n }\n\n const outgoing = dagOutgoing.get(fromComponent);\n if (outgoing?.has(toComponent) === true) {\n continue;\n }\n\n outgoing?.add(toComponent);\n inDegree.set(toComponent, (inDegree.get(toComponent) ?? 0) + 1);\n }\n\n const queue: number[] = [];\n const depthByComponent = new Map<number, number>();\n\n for (let i = 0; i < components.length; i += 1) {\n if ((inDegree.get(i) ?? 0) === 0) {\n queue.push(i);\n depthByComponent.set(i, 0);\n }\n }\n\n let cursor = 0;\n while (cursor < queue.length) {\n const componentId = queue[cursor];\n cursor += 1;\n\n if (componentId === undefined) {\n continue;\n }\n\n const currentDepth = depthByComponent.get(componentId) ?? 0;\n const outgoing = dagOutgoing.get(componentId) ?? new Set<number>();\n\n for (const nextComponent of outgoing) {\n const nextDepth = depthByComponent.get(nextComponent) ?? 0;\n if (currentDepth + 1 > nextDepth) {\n depthByComponent.set(nextComponent, currentDepth + 1);\n }\n\n const remainingIncoming = (inDegree.get(nextComponent) ?? 0) - 1;\n inDegree.set(nextComponent, remainingIncoming);\n if (remainingIncoming === 0) {\n queue.push(nextComponent);\n }\n }\n }\n\n const depthByNodeId = new Map<string, number>();\n let graphDepth = 0;\n\n components.forEach((component, componentId) => {\n const componentDepth = depthByComponent.get(componentId) ?? 0;\n if (componentDepth > graphDepth) {\n graphDepth = componentDepth;\n }\n\n for (const nodeId of component) {\n depthByNodeId.set(nodeId, componentDepth);\n }\n });\n\n cycles.sort((a, b) => {\n const firstA = a.nodes[0] ?? \"\";\n const firstB = b.nodes[0] ?? \"\";\n return firstA.localeCompare(firstB);\n });\n\n return {\n depthByNodeId,\n graphDepth,\n cycles,\n };\n};\n\nexport const createGraphAnalysisSummary = (\n targetPath: string,\n graph: GraphData,\n): GraphAnalysisSummary => {\n const fanInById = new Map<string, number>();\n const fanOutById = new Map<string, number>();\n\n for (const node of graph.nodes) {\n fanInById.set(node.id, 0);\n fanOutById.set(node.id, graph.adjacencyById.get(node.id)?.length ?? 0);\n }\n\n for (const edge of graph.edges) {\n fanInById.set(edge.to, (fanInById.get(edge.to) ?? 0) + 1);\n }\n\n const { cycles, depthByNodeId, graphDepth } = computeCyclesAndDepth(graph);\n\n let maxFanIn = 0;\n let maxFanOut = 0;\n\n const files: FileDependency[] = graph.nodes.map((node) => {\n const fanIn = fanInById.get(node.id) ?? 0;\n const fanOut = fanOutById.get(node.id) ?? 0;\n\n if (fanIn > maxFanIn) {\n maxFanIn = fanIn;\n }\n\n if (fanOut > maxFanOut) {\n maxFanOut = fanOut;\n }\n\n return {\n id: node.id,\n relativePath: node.relativePath,\n directDependencies: graph.adjacencyById.get(node.id) ?? [],\n fanIn,\n fanOut,\n depth: depthByNodeId.get(node.id) ?? 0,\n };\n });\n\n const metrics: GraphMetrics = {\n nodeCount: graph.nodes.length,\n edgeCount: graph.edges.length,\n cycleCount: cycles.length,\n graphDepth,\n maxFanIn,\n maxFanOut,\n };\n\n return {\n targetPath,\n nodes: graph.nodes,\n edges: graph.edges,\n cycles,\n files,\n metrics,\n };\n};\n","import { extname, isAbsolute, relative, resolve } from \"node:path\";\nimport * as ts from \"typescript\";\nimport type { EdgeRecord, NodeRecord } from \"../domain/graph-model.js\";\n\ntype ParsedProject = {\n nodes: readonly NodeRecord[];\n edges: readonly EdgeRecord[];\n};\n\nexport type ParseTypescriptProjectProgressEvent =\n | { stage: \"config_resolved\"; tsconfigCount: number; usedFallbackScan: boolean }\n | { stage: \"files_discovered\"; totalSourceFiles: number }\n | { stage: \"program_created\"; totalSourceFiles: number }\n | { stage: \"file_processed\"; processed: number; total: number; filePath: string }\n | { stage: \"edges_resolved\"; totalEdges: number };\n\nconst SOURCE_EXTENSIONS = new Set([\".ts\", \".tsx\", \".mts\", \".cts\", \".js\", \".jsx\", \".mjs\", \".cjs\"]);\nconst SCAN_EXCLUDES = [\n \"**/node_modules/**\",\n \"**/.git/**\",\n \"**/dist/**\",\n \"**/build/**\",\n \"**/.next/**\",\n \"**/coverage/**\",\n \"**/.turbo/**\",\n \"**/.cache/**\",\n \"**/out/**\",\n];\nconst SCAN_INCLUDES = [\"**/*\"];\nconst IGNORED_SEGMENTS = new Set([\n \"node_modules\",\n \".git\",\n \"dist\",\n \"build\",\n \".next\",\n \"coverage\",\n \".turbo\",\n \".cache\",\n \"out\",\n]);\n\nconst normalizePath = (pathValue: string): string => pathValue.replaceAll(\"\\\\\", \"/\");\n\nconst isProjectSourceFile = (filePath: string, projectRoot: string): boolean => {\n const extension = extname(filePath);\n if (!SOURCE_EXTENSIONS.has(extension)) {\n return false;\n }\n\n const relativePath = relative(projectRoot, filePath);\n if (relativePath.startsWith(\"..\")) {\n return false;\n }\n\n const normalizedRelativePath = normalizePath(relativePath);\n const segments = normalizedRelativePath.split(\"/\");\n return !segments.some((segment) => IGNORED_SEGMENTS.has(segment));\n};\n\nconst discoverSourceFilesByScan = (projectRoot: string): readonly string[] => {\n const files = ts.sys.readDirectory(\n projectRoot,\n [...SOURCE_EXTENSIONS],\n SCAN_EXCLUDES,\n SCAN_INCLUDES,\n );\n return files.map((filePath) => resolve(filePath));\n};\n\nconst parseTsConfigFile = (configPath: string): ts.ParsedCommandLine => {\n const parsedCommandLine = ts.getParsedCommandLineOfConfigFile(\n configPath,\n {},\n {\n ...ts.sys,\n onUnRecoverableConfigFileDiagnostic: () => {\n throw new Error(`Failed to parse TypeScript configuration at ${configPath}`);\n },\n },\n );\n\n if (parsedCommandLine === undefined) {\n throw new Error(`Failed to parse TypeScript configuration at ${configPath}`);\n }\n\n return parsedCommandLine;\n};\n\ntype CollectedTsConfigData = {\n fileNames: readonly string[];\n rootOptions: ts.CompilerOptions;\n visitedConfigCount: number;\n};\n\nconst collectFilesFromTsConfigGraph = (projectRoot: string): CollectedTsConfigData | null => {\n const rootConfigPath = ts.findConfigFile(\n projectRoot,\n (filePath) => ts.sys.fileExists(filePath),\n \"tsconfig.json\",\n );\n if (rootConfigPath === undefined) {\n return null;\n }\n\n const visitedConfigPaths = new Set<string>();\n const collectedFiles = new Set<string>();\n let rootOptions: ts.CompilerOptions | null = null;\n\n const visitConfig = (configPath: string): void => {\n const absoluteConfigPath = resolve(configPath);\n if (visitedConfigPaths.has(absoluteConfigPath)) {\n return;\n }\n\n visitedConfigPaths.add(absoluteConfigPath);\n const parsed = parseTsConfigFile(absoluteConfigPath);\n if (rootOptions === null) {\n rootOptions = parsed.options;\n }\n\n for (const filePath of parsed.fileNames) {\n collectedFiles.add(resolve(filePath));\n }\n\n for (const reference of parsed.projectReferences ?? []) {\n const referencePath = resolve(reference.path);\n const referenceConfigPath = ts.sys.directoryExists(referencePath)\n ? ts.findConfigFile(\n referencePath,\n (filePath) => ts.sys.fileExists(filePath),\n \"tsconfig.json\",\n )\n : referencePath;\n\n if (referenceConfigPath !== undefined && ts.sys.fileExists(referenceConfigPath)) {\n visitConfig(referenceConfigPath);\n }\n }\n };\n\n visitConfig(rootConfigPath);\n\n return {\n fileNames: [...collectedFiles],\n rootOptions: rootOptions ?? {\n moduleResolution: ts.ModuleResolutionKind.NodeNext,\n },\n visitedConfigCount: visitedConfigPaths.size,\n };\n};\n\nconst createCompilerOptions = (base: ts.CompilerOptions | undefined): ts.CompilerOptions => ({\n ...base,\n allowJs: true,\n moduleResolution: base?.moduleResolution ?? ts.ModuleResolutionKind.NodeNext,\n});\n\nconst parseTsConfig = (\n projectRoot: string,\n): {\n fileNames: readonly string[];\n options: ts.CompilerOptions;\n tsconfigCount: number;\n usedFallbackScan: boolean;\n} => {\n const collected = collectFilesFromTsConfigGraph(projectRoot);\n if (collected === null) {\n return {\n fileNames: discoverSourceFilesByScan(projectRoot),\n options: createCompilerOptions(undefined),\n tsconfigCount: 0,\n usedFallbackScan: true,\n };\n }\n\n if (collected.fileNames.length === 0) {\n return {\n fileNames: discoverSourceFilesByScan(projectRoot),\n options: createCompilerOptions(collected.rootOptions),\n tsconfigCount: collected.visitedConfigCount,\n usedFallbackScan: true,\n };\n }\n\n return {\n fileNames: collected.fileNames,\n options: createCompilerOptions(collected.rootOptions),\n tsconfigCount: collected.visitedConfigCount,\n usedFallbackScan: false,\n };\n};\n\nconst getSpecifierFromExpression = (expression: ts.Expression): string | undefined => {\n if (ts.isStringLiteral(expression)) {\n return expression.text;\n }\n\n if (ts.isNoSubstitutionTemplateLiteral(expression)) {\n return expression.text;\n }\n\n return undefined;\n};\n\nconst hasRuntimeImport = (importDeclaration: ts.ImportDeclaration): boolean => {\n const importClause = importDeclaration.importClause;\n if (importClause === undefined) {\n return true;\n }\n\n if (importClause.isTypeOnly) {\n return false;\n }\n\n if (importClause.name !== undefined) {\n return true;\n }\n\n const namedBindings = importClause.namedBindings;\n if (namedBindings === undefined) {\n return false;\n }\n\n if (ts.isNamespaceImport(namedBindings)) {\n return true;\n }\n\n if (namedBindings.elements.length === 0) {\n return true;\n }\n\n return namedBindings.elements.some((element) => !element.isTypeOnly);\n};\n\nconst extractModuleSpecifiers = (sourceFile: ts.SourceFile): readonly string[] => {\n const specifiers = new Set<string>();\n\n const visit = (node: ts.Node): void => {\n if (ts.isImportDeclaration(node)) {\n if (hasRuntimeImport(node) && node.moduleSpecifier !== undefined) {\n const specifier = getSpecifierFromExpression(node.moduleSpecifier);\n if (specifier !== undefined) {\n specifiers.add(specifier);\n }\n }\n return;\n }\n\n if (ts.isExportDeclaration(node)) {\n if (!node.isTypeOnly && node.moduleSpecifier !== undefined) {\n const specifier = getSpecifierFromExpression(node.moduleSpecifier);\n if (specifier !== undefined) {\n specifiers.add(specifier);\n }\n }\n return;\n }\n\n if (ts.isCallExpression(node)) {\n if (node.expression.kind === ts.SyntaxKind.ImportKeyword && node.arguments.length > 0) {\n const firstArgument = node.arguments[0];\n if (firstArgument !== undefined) {\n const specifier = getSpecifierFromExpression(firstArgument);\n if (specifier !== undefined) {\n specifiers.add(specifier);\n }\n }\n }\n\n if (\n ts.isIdentifier(node.expression) &&\n node.expression.text === \"require\" &&\n node.arguments.length > 0\n ) {\n const firstArgument = node.arguments[0];\n if (firstArgument !== undefined) {\n const specifier = getSpecifierFromExpression(firstArgument);\n if (specifier !== undefined) {\n specifiers.add(specifier);\n }\n }\n }\n }\n\n ts.forEachChild(node, visit);\n };\n\n visit(sourceFile);\n return [...specifiers];\n};\n\nexport const parseTypescriptProject = (\n projectPath: string,\n onProgress?: (event: ParseTypescriptProjectProgressEvent) => void,\n): ParsedProject => {\n const projectRoot = isAbsolute(projectPath) ? projectPath : resolve(projectPath);\n const { fileNames, options, tsconfigCount, usedFallbackScan } = parseTsConfig(projectRoot);\n onProgress?.({ stage: \"config_resolved\", tsconfigCount, usedFallbackScan });\n\n const sourceFilePaths = fileNames\n .filter((filePath) => isProjectSourceFile(filePath, projectRoot))\n .map((filePath) => normalizePath(resolve(filePath)));\n\n const uniqueSourceFilePaths = [...new Set(sourceFilePaths)].sort((a, b) => a.localeCompare(b));\n const sourceFilePathSet = new Set(uniqueSourceFilePaths);\n onProgress?.({ stage: \"files_discovered\", totalSourceFiles: uniqueSourceFilePaths.length });\n\n const program = ts.createProgram({\n rootNames: uniqueSourceFilePaths,\n options,\n });\n onProgress?.({ stage: \"program_created\", totalSourceFiles: uniqueSourceFilePaths.length });\n\n const nodeByAbsolutePath = new Map<string, NodeRecord>();\n for (const sourcePath of uniqueSourceFilePaths) {\n const relativePath = normalizePath(relative(projectRoot, sourcePath));\n const nodeId = relativePath;\n nodeByAbsolutePath.set(sourcePath, {\n id: nodeId,\n absolutePath: sourcePath,\n relativePath,\n });\n }\n\n const resolverCache = new Map<string, string | undefined>();\n const edges: EdgeRecord[] = [];\n\n for (const [index, sourcePath] of uniqueSourceFilePaths.entries()) {\n const sourceFile = program.getSourceFile(sourcePath);\n if (sourceFile === undefined) {\n continue;\n }\n\n const fromNode = nodeByAbsolutePath.get(sourcePath);\n if (fromNode === undefined) {\n continue;\n }\n\n const moduleSpecifiers = extractModuleSpecifiers(sourceFile);\n for (const specifier of moduleSpecifiers) {\n const cacheKey = `${sourcePath}\\u0000${specifier}`;\n let resolvedPath = resolverCache.get(cacheKey);\n\n if (resolvedPath === undefined && !resolverCache.has(cacheKey)) {\n const resolved = ts.resolveModuleName(\n specifier,\n sourcePath,\n options,\n ts.sys,\n ).resolvedModule;\n if (resolved !== undefined) {\n resolvedPath = normalizePath(resolve(resolved.resolvedFileName));\n }\n resolverCache.set(cacheKey, resolvedPath);\n }\n\n if (resolvedPath === undefined || !sourceFilePathSet.has(resolvedPath)) {\n continue;\n }\n\n const toNode = nodeByAbsolutePath.get(resolvedPath);\n if (toNode === undefined) {\n continue;\n }\n\n edges.push({ from: fromNode.id, to: toNode.id });\n }\n\n const processed = index + 1;\n if (processed === 1 || processed === uniqueSourceFilePaths.length || processed % 50 === 0) {\n onProgress?.({\n stage: \"file_processed\",\n processed,\n total: uniqueSourceFilePaths.length,\n filePath: fromNode.id,\n });\n }\n }\n onProgress?.({ stage: \"edges_resolved\", totalEdges: edges.length });\n\n return {\n nodes: [...nodeByAbsolutePath.values()],\n edges,\n };\n};\n","import type { GraphAnalysisSummary } from \"@codesentinel/core\";\nimport { createGraphData } from \"../domain/graph-model.js\";\nimport { createGraphAnalysisSummary } from \"../domain/graph-metrics.js\";\nimport {\n parseTypescriptProject,\n type ParseTypescriptProjectProgressEvent,\n} from \"../infrastructure/typescript-project.js\";\n\nexport type BuildProjectGraphSummaryInput = {\n projectPath: string;\n onProgress?: (event: ParseTypescriptProjectProgressEvent) => void;\n};\n\nexport const buildProjectGraphSummary = (\n input: BuildProjectGraphSummaryInput,\n): GraphAnalysisSummary => {\n const parsedProject = parseTypescriptProject(input.projectPath, input.onProgress);\n const graphData = createGraphData(parsedProject.nodes, parsedProject.edges);\n return createGraphAnalysisSummary(input.projectPath, graphData);\n};\n","import type {\n CouplingMatrix,\n FileAuthorShare,\n FileCoupling,\n FileEvolutionMetrics,\n Hotspot,\n RepositoryEvolutionSummary,\n} from \"@codesentinel/core\";\nimport type { EvolutionComputationConfig, GitCommitRecord } from \"./evolution-types.js\";\n\ntype FileAccumulator = {\n commitCount: number;\n recentCommitCount: number;\n churnAdded: number;\n churnDeleted: number;\n authors: Map<string, number>;\n};\n\ntype AuthorProfile = {\n authorId: string;\n commitCount: number;\n primaryName: string;\n emailStem: string | null;\n isBot: boolean;\n};\n\nconst pairKey = (a: string, b: string): string => `${a}\\u0000${b}`;\n\nconst round4 = (value: number): number => Number(value.toFixed(4));\n\nconst normalizeName = (value: string): string =>\n value\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n\nconst extractEmailStem = (authorId: string): string | null => {\n const normalized = authorId.trim().toLowerCase();\n const githubNoReplyMatch = normalized.match(/^\\d+\\+([^@]+)@users\\.noreply\\.github\\.com$/);\n if (githubNoReplyMatch?.[1] !== undefined) {\n return githubNoReplyMatch[1].replace(/[._+-]/g, \"\");\n }\n\n const atIndex = normalized.indexOf(\"@\");\n if (atIndex <= 0) {\n return null;\n }\n\n return normalized.slice(0, atIndex).replace(/[._+-]/g, \"\");\n};\n\nconst areNamesCompatible = (left: string, right: string): boolean => {\n if (left.length === 0 || right.length === 0) {\n return false;\n }\n\n if (left === right) {\n return true;\n }\n\n if (left.startsWith(`${right} `) || right.startsWith(`${left} `)) {\n return true;\n }\n\n return false;\n};\n\nconst chooseCanonicalAuthorId = (profiles: readonly AuthorProfile[]): string => {\n const ordered = [...profiles].sort((a, b) => {\n const aIsNoReply = a.authorId.includes(\"@users.noreply.github.com\");\n const bIsNoReply = b.authorId.includes(\"@users.noreply.github.com\");\n if (aIsNoReply !== bIsNoReply) {\n return aIsNoReply ? 1 : -1;\n }\n\n if (a.commitCount !== b.commitCount) {\n return b.commitCount - a.commitCount;\n }\n\n return a.authorId.localeCompare(b.authorId);\n });\n\n return ordered[0]?.authorId ?? \"\";\n};\n\nconst buildAuthorAliasMap = (commits: readonly GitCommitRecord[]): ReadonlyMap<string, string> => {\n const nameCountsByAuthorId = new Map<string, Map<string, number>>();\n const commitCountByAuthorId = new Map<string, number>();\n\n for (const commit of commits) {\n commitCountByAuthorId.set(\n commit.authorId,\n (commitCountByAuthorId.get(commit.authorId) ?? 0) + 1,\n );\n\n const normalizedName = normalizeName(commit.authorName);\n const names = nameCountsByAuthorId.get(commit.authorId) ?? new Map<string, number>();\n if (normalizedName.length > 0) {\n names.set(normalizedName, (names.get(normalizedName) ?? 0) + 1);\n }\n nameCountsByAuthorId.set(commit.authorId, names);\n }\n\n const profiles: AuthorProfile[] = [...commitCountByAuthorId.entries()].map(\n ([authorId, commitCount]) => {\n const names = nameCountsByAuthorId.get(authorId);\n const primaryName =\n names === undefined\n ? \"\"\n : ([...names.entries()].sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))[0]?.[0] ??\n \"\");\n const normalizedAuthorId = authorId.toLowerCase();\n const isBot = normalizedAuthorId.includes(\"[bot]\");\n\n return {\n authorId,\n commitCount,\n primaryName,\n emailStem: isBot ? null : extractEmailStem(authorId),\n isBot,\n };\n },\n );\n\n const groupsByStem = new Map<string, AuthorProfile[]>();\n for (const profile of profiles) {\n if (profile.emailStem === null || profile.emailStem.length < 4) {\n continue;\n }\n\n const current = groupsByStem.get(profile.emailStem) ?? [];\n current.push(profile);\n groupsByStem.set(profile.emailStem, current);\n }\n\n const aliasMap = new Map<string, string>();\n for (const profile of profiles) {\n aliasMap.set(profile.authorId, profile.authorId);\n }\n\n for (const group of groupsByStem.values()) {\n if (group.length < 2) {\n continue;\n }\n\n const compatible: AuthorProfile[] = [];\n for (const profile of group) {\n if (profile.isBot || profile.primaryName.length === 0) {\n continue;\n }\n\n compatible.push(profile);\n }\n\n if (compatible.length < 2) {\n continue;\n }\n\n const canonical = chooseCanonicalAuthorId(compatible);\n const canonicalProfile = compatible.find((candidate) => candidate.authorId === canonical);\n if (canonicalProfile === undefined) {\n continue;\n }\n\n for (const profile of compatible) {\n if (areNamesCompatible(profile.primaryName, canonicalProfile.primaryName)) {\n aliasMap.set(profile.authorId, canonical);\n }\n }\n }\n\n return aliasMap;\n};\n\nconst computeBusFactor = (\n authorDistribution: readonly FileAuthorShare[],\n threshold: number,\n): number => {\n if (authorDistribution.length === 0) {\n return 0;\n }\n\n let coveredShare = 0;\n for (let i = 0; i < authorDistribution.length; i += 1) {\n const entry = authorDistribution[i];\n if (entry === undefined) {\n continue;\n }\n\n coveredShare += entry.share;\n if (coveredShare >= threshold) {\n return i + 1;\n }\n }\n\n return authorDistribution.length;\n};\n\nconst finalizeAuthorDistribution = (\n authorCommits: ReadonlyMap<string, number>,\n): readonly FileAuthorShare[] => {\n const totalCommits = [...authorCommits.values()].reduce((sum, value) => sum + value, 0);\n if (totalCommits === 0) {\n return [];\n }\n\n return [...authorCommits.entries()]\n .map(([authorId, commits]) => ({\n authorId,\n commits,\n share: round4(commits / totalCommits),\n }))\n .sort((a, b) => b.commits - a.commits || a.authorId.localeCompare(b.authorId));\n};\n\nconst buildCouplingMatrix = (\n coChangeByPair: ReadonlyMap<string, number>,\n fileCommitCount: ReadonlyMap<string, number>,\n consideredCommits: number,\n skippedLargeCommits: number,\n maxCouplingPairs: number,\n): CouplingMatrix => {\n const allPairs: FileCoupling[] = [];\n\n for (const [key, coChangeCommits] of coChangeByPair.entries()) {\n const [fileA, fileB] = key.split(\"\\u0000\");\n if (fileA === undefined || fileB === undefined) {\n continue;\n }\n\n const fileACommits = fileCommitCount.get(fileA) ?? 0;\n const fileBCommits = fileCommitCount.get(fileB) ?? 0;\n const denominator = fileACommits + fileBCommits - coChangeCommits;\n const couplingScore = denominator === 0 ? 0 : round4(coChangeCommits / denominator);\n\n allPairs.push({\n fileA,\n fileB,\n coChangeCommits,\n couplingScore,\n });\n }\n\n allPairs.sort(\n (a, b) =>\n b.coChangeCommits - a.coChangeCommits ||\n b.couplingScore - a.couplingScore ||\n a.fileA.localeCompare(b.fileA) ||\n a.fileB.localeCompare(b.fileB),\n );\n\n const truncated = allPairs.length > maxCouplingPairs;\n\n return {\n pairs: truncated ? allPairs.slice(0, maxCouplingPairs) : allPairs,\n totalPairCount: allPairs.length,\n consideredCommits,\n skippedLargeCommits,\n truncated,\n };\n};\n\nconst selectHotspots = (\n files: readonly FileEvolutionMetrics[],\n config: EvolutionComputationConfig,\n): { hotspots: readonly Hotspot[]; threshold: number } => {\n if (files.length === 0) {\n return { hotspots: [], threshold: 0 };\n }\n\n const sorted = [...files].sort(\n (a, b) =>\n b.commitCount - a.commitCount ||\n b.churnTotal - a.churnTotal ||\n a.filePath.localeCompare(b.filePath),\n );\n\n const hotspotCount = Math.max(\n config.hotspotMinFiles,\n Math.ceil(sorted.length * config.hotspotTopPercent),\n );\n const selected = sorted.slice(0, hotspotCount);\n\n const hotspots = selected.map((file, index) => ({\n filePath: file.filePath,\n rank: index + 1,\n commitCount: file.commitCount,\n churnTotal: file.churnTotal,\n }));\n\n const threshold = selected[selected.length - 1]?.commitCount ?? 0;\n return { hotspots, threshold };\n};\n\nexport const computeRepositoryEvolutionSummary = (\n targetPath: string,\n commits: readonly GitCommitRecord[],\n config: EvolutionComputationConfig,\n): RepositoryEvolutionSummary => {\n const authorAliasById =\n config.authorIdentityMode === \"likely_merge\"\n ? buildAuthorAliasMap(commits)\n : new Map<string, string>();\n const fileStats = new Map<string, FileAccumulator>();\n const coChangeByPair = new Map<string, number>();\n\n const headCommitTimestamp =\n commits.length === 0 ? null : (commits[commits.length - 1]?.authoredAtUnix ?? null);\n const recentWindowStart =\n headCommitTimestamp === null\n ? Number.NEGATIVE_INFINITY\n : headCommitTimestamp - config.recentWindowDays * 24 * 60 * 60;\n\n let consideredCommits = 0;\n let skippedLargeCommits = 0;\n\n for (const commit of commits) {\n const uniqueFiles = new Set<string>();\n\n for (const fileChange of commit.fileChanges) {\n uniqueFiles.add(fileChange.filePath);\n const current = fileStats.get(fileChange.filePath) ?? {\n commitCount: 0,\n recentCommitCount: 0,\n churnAdded: 0,\n churnDeleted: 0,\n authors: new Map<string, number>(),\n };\n\n current.churnAdded += fileChange.additions;\n current.churnDeleted += fileChange.deletions;\n fileStats.set(fileChange.filePath, current);\n }\n\n for (const filePath of uniqueFiles) {\n const current = fileStats.get(filePath);\n if (current === undefined) {\n continue;\n }\n\n current.commitCount += 1;\n if (commit.authoredAtUnix >= recentWindowStart) {\n current.recentCommitCount += 1;\n }\n\n const effectiveAuthorId = authorAliasById.get(commit.authorId) ?? commit.authorId;\n current.authors.set(effectiveAuthorId, (current.authors.get(effectiveAuthorId) ?? 0) + 1);\n }\n\n const orderedFiles = [...uniqueFiles].sort((a, b) => a.localeCompare(b));\n if (orderedFiles.length > 1) {\n if (orderedFiles.length <= config.maxFilesPerCommitForCoupling) {\n consideredCommits += 1;\n for (let i = 0; i < orderedFiles.length - 1; i += 1) {\n for (let j = i + 1; j < orderedFiles.length; j += 1) {\n const fileA = orderedFiles[i];\n const fileB = orderedFiles[j];\n if (fileA === undefined || fileB === undefined) {\n continue;\n }\n\n const key = pairKey(fileA, fileB);\n coChangeByPair.set(key, (coChangeByPair.get(key) ?? 0) + 1);\n }\n }\n } else {\n skippedLargeCommits += 1;\n }\n }\n }\n\n const files: FileEvolutionMetrics[] = [...fileStats.entries()]\n .map(([filePath, stats]) => {\n const authorDistribution = finalizeAuthorDistribution(stats.authors);\n const topAuthorShare = authorDistribution[0]?.share ?? 0;\n return {\n filePath,\n commitCount: stats.commitCount,\n frequencyPer100Commits:\n commits.length === 0 ? 0 : round4((stats.commitCount / commits.length) * 100),\n churnAdded: stats.churnAdded,\n churnDeleted: stats.churnDeleted,\n churnTotal: stats.churnAdded + stats.churnDeleted,\n recentCommitCount: stats.recentCommitCount,\n recentVolatility:\n stats.commitCount === 0 ? 0 : round4(stats.recentCommitCount / stats.commitCount),\n topAuthorShare,\n busFactor: computeBusFactor(authorDistribution, config.busFactorCoverageThreshold),\n authorDistribution,\n };\n })\n .sort((a, b) => a.filePath.localeCompare(b.filePath));\n\n const fileCommitCount = new Map(files.map((file) => [file.filePath, file.commitCount]));\n const coupling = buildCouplingMatrix(\n coChangeByPair,\n fileCommitCount,\n consideredCommits,\n skippedLargeCommits,\n config.maxCouplingPairs,\n );\n\n const { hotspots, threshold } = selectHotspots(files, config);\n\n return {\n targetPath,\n available: true,\n files,\n hotspots,\n coupling,\n metrics: {\n totalCommits: commits.length,\n totalFiles: files.length,\n headCommitTimestamp,\n recentWindowDays: config.recentWindowDays,\n hotspotTopPercent: config.hotspotTopPercent,\n hotspotThresholdCommitCount: threshold,\n },\n };\n};\n","export type GitFileChange = {\n filePath: string;\n additions: number;\n deletions: number;\n};\n\nexport type GitCommitRecord = {\n hash: string;\n authorId: string;\n authorName: string;\n authoredAtUnix: number;\n fileChanges: readonly GitFileChange[];\n};\n\nexport type EvolutionComputationConfig = {\n authorIdentityMode: \"likely_merge\" | \"strict_email\";\n recentWindowDays: number;\n hotspotTopPercent: number;\n hotspotMinFiles: number;\n maxFilesPerCommitForCoupling: number;\n maxCouplingPairs: number;\n busFactorCoverageThreshold: number;\n};\n\nexport const DEFAULT_EVOLUTION_CONFIG: EvolutionComputationConfig = {\n authorIdentityMode: \"likely_merge\",\n recentWindowDays: 30,\n hotspotTopPercent: 0.1,\n hotspotMinFiles: 1,\n maxFilesPerCommitForCoupling: 200,\n maxCouplingPairs: 500,\n busFactorCoverageThreshold: 0.6,\n};\n","import type { RepositoryEvolutionSummary } from \"@codesentinel/core\";\nimport { computeRepositoryEvolutionSummary } from \"../domain/evolution-metrics.js\";\nimport {\n DEFAULT_EVOLUTION_CONFIG,\n type EvolutionComputationConfig,\n} from \"../domain/evolution-types.js\";\nimport type { GitHistoryProvider, GitHistoryProgressEvent } from \"./git-history-provider.js\";\n\nexport type AnalyzeRepositoryEvolutionInput = {\n repositoryPath: string;\n config?: Partial<EvolutionComputationConfig>;\n};\n\nexport type EvolutionAnalysisProgressEvent =\n | { stage: \"checking_git_repository\" }\n | { stage: \"not_git_repository\" }\n | { stage: \"loading_commit_history\" }\n | { stage: \"computing_metrics\" }\n | { stage: \"analysis_completed\"; available: boolean }\n | { stage: \"history\"; event: GitHistoryProgressEvent };\n\nconst createEffectiveConfig = (\n overrides: Partial<EvolutionComputationConfig> | undefined,\n): EvolutionComputationConfig => ({\n ...DEFAULT_EVOLUTION_CONFIG,\n ...overrides,\n});\n\nexport const analyzeRepositoryEvolution = (\n input: AnalyzeRepositoryEvolutionInput,\n historyProvider: GitHistoryProvider,\n onProgress?: (event: EvolutionAnalysisProgressEvent) => void,\n): RepositoryEvolutionSummary => {\n onProgress?.({ stage: \"checking_git_repository\" });\n if (!historyProvider.isGitRepository(input.repositoryPath)) {\n onProgress?.({ stage: \"not_git_repository\" });\n return {\n targetPath: input.repositoryPath,\n available: false,\n reason: \"not_git_repository\",\n };\n }\n\n onProgress?.({ stage: \"loading_commit_history\" });\n const commits = historyProvider.getCommitHistory(input.repositoryPath, (event) =>\n onProgress?.({ stage: \"history\", event }),\n );\n const config = createEffectiveConfig(input.config);\n onProgress?.({ stage: \"computing_metrics\" });\n\n const summary = computeRepositoryEvolutionSummary(input.repositoryPath, commits, config);\n onProgress?.({ stage: \"analysis_completed\", available: summary.available });\n return summary;\n};\n","import { execFileSync } from \"node:child_process\";\n\nexport class GitCommandError extends Error {\n readonly args: readonly string[];\n\n constructor(message: string, args: readonly string[]) {\n super(message);\n this.name = \"GitCommandError\";\n this.args = args;\n }\n}\n\nexport interface GitCommandClient {\n run(repositoryPath: string, args: readonly string[]): string;\n}\n\nexport class ExecGitCommandClient implements GitCommandClient {\n run(repositoryPath: string, args: readonly string[]): string {\n try {\n return execFileSync(\"git\", [\"-C\", repositoryPath, ...args], {\n encoding: \"utf8\",\n maxBuffer: 1024 * 1024 * 64,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown git execution error\";\n throw new GitCommandError(message, args);\n }\n }\n}\n","export const COMMIT_RECORD_SEPARATOR = \"\\u001e\";\nexport const COMMIT_FIELD_SEPARATOR = \"\\u001f\";\n\nexport const GIT_LOG_FORMAT = `%x1e%H%x1f%at%x1f%an%x1f%ae`;\n","import type { GitCommitRecord } from \"../domain/evolution-types.js\";\nimport type { ParseGitLogProgressEvent } from \"../parsing/git-log-parser.js\";\n\nexport type GitHistoryProgressEvent =\n | { stage: \"git_log_received\"; bytes: number }\n | { stage: \"git_log_parsed\"; commits: number }\n | { stage: \"git_log_parse_progress\"; parsedRecords: number; totalRecords: number };\n\nexport interface GitHistoryProvider {\n isGitRepository(repositoryPath: string): boolean;\n getCommitHistory(\n repositoryPath: string,\n onProgress?: (event: GitHistoryProgressEvent) => void,\n ): readonly GitCommitRecord[];\n}\n\nexport const mapParseProgressToHistoryProgress = (\n event: ParseGitLogProgressEvent,\n): GitHistoryProgressEvent => ({\n stage: \"git_log_parse_progress\",\n parsedRecords: event.parsedRecords,\n totalRecords: event.totalRecords,\n});\n","import { COMMIT_FIELD_SEPARATOR, COMMIT_RECORD_SEPARATOR } from \"../domain/git-log-format.js\";\nimport type { GitCommitRecord, GitFileChange } from \"../domain/evolution-types.js\";\n\nexport type ParseGitLogProgressEvent = {\n parsedRecords: number;\n totalRecords: number;\n};\n\nconst parseInteger = (value: string): number | null => {\n if (value.length === 0) {\n return null;\n }\n\n const parsed = Number.parseInt(value, 10);\n if (Number.isNaN(parsed)) {\n return null;\n }\n\n return parsed;\n};\n\nconst normalizeAuthorIdentity = (authorName: string, authorEmail: string): string => {\n const normalizedName = authorName.trim().replace(/\\s+/g, \" \").toLowerCase();\n const normalizedEmail = authorEmail.trim().toLowerCase();\n\n if (/\\[bot\\]/i.test(normalizedName) || /\\[bot\\]/i.test(normalizedEmail)) {\n return normalizedEmail.length > 0 ? normalizedEmail : normalizedName;\n }\n\n const githubNoReplyMatch = normalizedEmail.match(/^\\d+\\+([^@]+)@users\\.noreply\\.github\\.com$/);\n const githubHandle = githubNoReplyMatch?.[1]?.trim().toLowerCase();\n if (githubHandle !== undefined && githubHandle.length > 0) {\n return `${githubHandle}@users.noreply.github.com`;\n }\n\n if (normalizedEmail.length > 0) {\n return normalizedEmail;\n }\n\n return normalizedName;\n};\n\nconst parseRenamedPath = (pathSpec: string): string => {\n if (!pathSpec.includes(\" => \")) {\n return pathSpec;\n }\n\n const braceRenameMatch = pathSpec.match(/^(.*)\\{(.+) => (.+)\\}(.*)$/);\n if (braceRenameMatch !== null) {\n const [, prefix, , renamedTo, suffix] = braceRenameMatch;\n return `${prefix}${renamedTo}${suffix}`;\n }\n\n const parts = pathSpec.split(\" => \");\n const finalPart = parts[parts.length - 1];\n return finalPart ?? pathSpec;\n};\n\nconst parseNumstatLine = (line: string): GitFileChange | null => {\n const parts = line.split(\"\\t\");\n if (parts.length < 3) {\n return null;\n }\n\n const additionsRaw = parts[0];\n const deletionsRaw = parts[1];\n const pathRaw = parts.slice(2).join(\"\\t\");\n\n if (additionsRaw === undefined || deletionsRaw === undefined) {\n return null;\n }\n\n const additions = additionsRaw === \"-\" ? 0 : parseInteger(additionsRaw);\n const deletions = deletionsRaw === \"-\" ? 0 : parseInteger(deletionsRaw);\n\n if (additions === null || deletions === null) {\n return null;\n }\n\n const filePath = parseRenamedPath(pathRaw);\n return {\n filePath,\n additions,\n deletions,\n };\n};\n\nexport const parseGitLog = (\n rawLog: string,\n onProgress?: (event: ParseGitLogProgressEvent) => void,\n): readonly GitCommitRecord[] => {\n const records = rawLog\n .split(COMMIT_RECORD_SEPARATOR)\n .map((record) => record.trim())\n .filter((record) => record.length > 0);\n\n const commits: GitCommitRecord[] = [];\n\n for (const [index, record] of records.entries()) {\n const lines = record\n .split(\"\\n\")\n .map((line) => line.trimEnd())\n .filter((line) => line.length > 0);\n\n if (lines.length === 0) {\n continue;\n }\n\n const headerParts = lines[0]?.split(COMMIT_FIELD_SEPARATOR) ?? [];\n if (headerParts.length !== 4) {\n continue;\n }\n\n const [hash, authoredAtRaw, authorName, authorEmail] = headerParts;\n if (\n hash === undefined ||\n authoredAtRaw === undefined ||\n authorName === undefined ||\n authorEmail === undefined\n ) {\n continue;\n }\n\n const authoredAtUnix = parseInteger(authoredAtRaw);\n if (authoredAtUnix === null) {\n continue;\n }\n\n const fileChanges: GitFileChange[] = [];\n for (const line of lines.slice(1)) {\n const parsedLine = parseNumstatLine(line);\n if (parsedLine !== null) {\n fileChanges.push(parsedLine);\n }\n }\n\n commits.push({\n hash,\n authorId: normalizeAuthorIdentity(authorName, authorEmail),\n authorName,\n authoredAtUnix,\n fileChanges,\n });\n\n const parsedRecords = index + 1;\n if (parsedRecords === 1 || parsedRecords === records.length || parsedRecords % 500 === 0) {\n onProgress?.({ parsedRecords, totalRecords: records.length });\n }\n }\n\n commits.sort((a, b) => a.authoredAtUnix - b.authoredAtUnix || a.hash.localeCompare(b.hash));\n return commits;\n};\n","import { GIT_LOG_FORMAT } from \"../domain/git-log-format.js\";\nimport type { GitCommitRecord } from \"../domain/evolution-types.js\";\nimport {\n mapParseProgressToHistoryProgress,\n type GitHistoryProvider,\n type GitHistoryProgressEvent,\n} from \"../application/git-history-provider.js\";\nimport { GitCommandError, type GitCommandClient } from \"./git-command-client.js\";\nimport { parseGitLog } from \"../parsing/git-log-parser.js\";\n\nconst NON_GIT_CODES = [\"not a git repository\", \"not in a git directory\"];\n\nconst isNotGitError = (error: GitCommandError): boolean => {\n const lower = error.message.toLowerCase();\n return NON_GIT_CODES.some((code) => lower.includes(code));\n};\n\nexport class GitCliHistoryProvider implements GitHistoryProvider {\n constructor(private readonly gitClient: GitCommandClient) {}\n\n isGitRepository(repositoryPath: string): boolean {\n try {\n const output = this.gitClient.run(repositoryPath, [\"rev-parse\", \"--is-inside-work-tree\"]);\n return output.trim() === \"true\";\n } catch (error) {\n if (error instanceof GitCommandError && isNotGitError(error)) {\n return false;\n }\n\n throw error;\n }\n }\n\n getCommitHistory(\n repositoryPath: string,\n onProgress?: (event: GitHistoryProgressEvent) => void,\n ): readonly GitCommitRecord[] {\n const output = this.gitClient.run(repositoryPath, [\n \"-c\",\n \"core.quotepath=false\",\n \"log\",\n \"--use-mailmap\",\n \"--no-merges\",\n \"--date=unix\",\n `--pretty=format:${GIT_LOG_FORMAT}`,\n \"--numstat\",\n \"--find-renames\",\n ]);\n onProgress?.({ stage: \"git_log_received\", bytes: Buffer.byteLength(output, \"utf8\") });\n const commits = parseGitLog(output, (event) =>\n onProgress?.(mapParseProgressToHistoryProgress(event)),\n );\n onProgress?.({ stage: \"git_log_parsed\", commits: commits.length });\n return commits;\n }\n}\n","import type { RepositoryEvolutionSummary } from \"@codesentinel/core\";\nimport {\n analyzeRepositoryEvolution,\n type EvolutionAnalysisProgressEvent,\n type AnalyzeRepositoryEvolutionInput,\n} from \"./application/analyze-repository-evolution.js\";\nimport { ExecGitCommandClient } from \"./infrastructure/git-command-client.js\";\nimport { GitCliHistoryProvider } from \"./infrastructure/git-history-provider.js\";\n\nexport type { AnalyzeRepositoryEvolutionInput } from \"./application/analyze-repository-evolution.js\";\nexport type { EvolutionAnalysisProgressEvent } from \"./application/analyze-repository-evolution.js\";\n\nexport const analyzeRepositoryEvolutionFromGit = (\n input: AnalyzeRepositoryEvolutionInput,\n onProgress?: (event: EvolutionAnalysisProgressEvent) => void,\n): RepositoryEvolutionSummary => {\n const historyProvider = new GitCliHistoryProvider(new ExecGitCommandClient());\n return analyzeRepositoryEvolution(input, historyProvider, onProgress);\n};\n","export const clamp01 = (value: number): number => {\n if (!Number.isFinite(value)) {\n return 0;\n }\n if (value <= 0) {\n return 0;\n }\n if (value >= 1) {\n return 1;\n }\n return value;\n};\n\nexport const round4 = (value: number): number => Number(value.toFixed(4));\n\nexport const average = (values: readonly number[]): number => {\n if (values.length === 0) {\n return 0;\n }\n\n const total = values.reduce((sum, value) => sum + value, 0);\n return total / values.length;\n};\n\nexport const concentration = (rawValues: readonly number[]): number => {\n const values = rawValues.filter((value) => value > 0);\n const count = values.length;\n if (count <= 1) {\n return 0;\n }\n\n const total = values.reduce((sum, value) => sum + value, 0);\n if (total <= 0) {\n return 0;\n }\n\n const hhi = values.reduce((sum, value) => {\n const share = value / total;\n return sum + share * share;\n }, 0);\n\n const minHhi = 1 / count;\n const normalized = (hhi - minHhi) / (1 - minHhi);\n return clamp01(normalized);\n};\n","import type {\n GraphAnalysisSummary,\n HealthDimension,\n HealthDimensionTrace,\n HealthEvidenceRef,\n HealthFactorTrace,\n HealthIssue,\n RepositoryEvolutionSummary,\n RepositoryHealthSummary,\n} from \"@codesentinel/core\";\nimport { average, clamp01, concentration, round4 } from \"../domain/math.js\";\n\nexport type ComputeRepositoryHealthSummaryInput = {\n structural: GraphAnalysisSummary;\n evolution: RepositoryEvolutionSummary;\n config?: HealthEngineConfig;\n};\n\nexport type HealthEngineConfig = {\n ownershipPenaltyMultiplier?: number;\n};\n\ntype HealthIssueWithImpact = HealthIssue & {\n impact: number;\n};\n\ntype FactorSpec = {\n factorId: string;\n penalty: number;\n rawMetrics: Readonly<Record<string, number | null>>;\n normalizedMetrics: Readonly<Record<string, number | null>>;\n weight: number;\n evidence: readonly HealthEvidenceRef[];\n};\n\nconst DIMENSION_WEIGHTS: Readonly<Record<HealthDimension, number>> = {\n modularity: 0.35,\n changeHygiene: 0.3,\n testHealth: 0.2,\n ownershipDistribution: 0.15,\n};\n\nconst HEALTH_TRACE_VERSION = \"1\" as const;\n\nconst toPercentage = (normalizedHealth: number): number => round4(clamp01(normalizedHealth) * 100);\n\nconst dampenForSmallSamples = (\n penalty: number,\n sampleSize: number,\n warmupSize: number,\n minimumWeight = 0.35,\n): number => {\n const reliability = clamp01(sampleSize / Math.max(1, warmupSize));\n const dampeningWeight = minimumWeight + (1 - minimumWeight) * reliability;\n return clamp01(penalty) * dampeningWeight;\n};\n\nconst topPercentShare = (values: readonly number[], fraction: number): number => {\n const positive = values.filter((value) => value > 0).sort((a, b) => b - a);\n if (positive.length === 0) {\n return 0;\n }\n\n const topCount = Math.max(1, Math.ceil(positive.length * clamp01(fraction)));\n const total = positive.reduce((sum, value) => sum + value, 0);\n const topTotal = positive.slice(0, topCount).reduce((sum, value) => sum + value, 0);\n if (total <= 0) {\n return 0;\n }\n\n return clamp01(topTotal / total);\n};\n\nconst normalizedEntropy = (weights: readonly number[]): number => {\n const positive = weights.filter((value) => value > 0);\n if (positive.length <= 1) {\n return 0;\n }\n\n const total = positive.reduce((sum, value) => sum + value, 0);\n if (total <= 0) {\n return 0;\n }\n\n const entropy = positive.reduce((sum, value) => {\n const p = value / total;\n return sum - p * Math.log(p);\n }, 0);\n return clamp01(entropy / Math.log(positive.length));\n};\n\nconst toFactorTrace = (spec: FactorSpec): HealthFactorTrace => ({\n factorId: spec.factorId,\n contribution: round4(spec.penalty * spec.weight * 100),\n penalty: round4(spec.penalty),\n rawMetrics: spec.rawMetrics,\n normalizedMetrics: spec.normalizedMetrics,\n weight: round4(spec.weight),\n evidence: spec.evidence,\n});\n\nconst createDimensionTrace = (\n dimension: HealthDimension,\n health: number,\n factors: readonly FactorSpec[],\n): HealthDimensionTrace => ({\n dimension,\n normalizedScore: round4(clamp01(health)),\n score: toPercentage(health),\n factors: factors.map((factor) => toFactorTrace(factor)),\n});\n\nconst filePaths = (structural: GraphAnalysisSummary): readonly string[] =>\n structural.files.map((file) => file.relativePath);\n\nconst normalizePath = (value: string): string => value.replaceAll(\"\\\\\", \"/\").toLowerCase();\n\nconst isTestPath = (path: string): boolean => {\n const normalized = normalizePath(path);\n return (\n normalized.includes(\"/__tests__/\") ||\n normalized.includes(\"/tests/\") ||\n normalized.includes(\"/test/\") ||\n normalized.includes(\".test.\") ||\n normalized.includes(\".spec.\")\n );\n};\n\nconst isSourcePath = (path: string): boolean => {\n if (path.endsWith(\".d.ts\")) {\n return false;\n }\n return !isTestPath(path);\n};\n\nconst hasTestDirectory = (paths: readonly string[]): boolean =>\n paths.some((path) => {\n const normalized = normalizePath(path);\n return (\n normalized.includes(\"/__tests__/\") ||\n normalized.includes(\"/tests/\") ||\n normalized.includes(\"/test/\")\n );\n });\n\nconst moduleNameFromPath = (path: string): string => {\n const normalized = path.replaceAll(\"\\\\\", \"/\");\n const firstSegment = normalized.split(\"/\")[0] ?? normalized;\n return firstSegment.length === 0 ? normalized : firstSegment;\n};\n\nconst pushIssue = (\n issues: HealthIssueWithImpact[],\n issue: Omit<HealthIssueWithImpact, \"severity\"> & { severity?: HealthIssue[\"severity\"] },\n): void => {\n issues.push({\n ...issue,\n severity: issue.severity ?? \"warn\",\n });\n};\n\nconst weightedPenalty = (factors: readonly FactorSpec[]): number =>\n clamp01(factors.reduce((sum, factor) => sum + factor.penalty * factor.weight, 0));\n\nexport const computeRepositoryHealthSummary = (\n input: ComputeRepositoryHealthSummaryInput,\n): RepositoryHealthSummary => {\n const ownershipPenaltyMultiplier = clamp01(input.config?.ownershipPenaltyMultiplier ?? 1);\n const issues: HealthIssueWithImpact[] = [];\n const sourceFileSet = new Set(input.structural.files.map((file) => file.relativePath));\n\n const sourceFileCount = Math.max(1, input.structural.files.length);\n const structuralEdges = input.structural.edges;\n\n const cycleSets = input.structural.cycles\n .map((cycle) => new Set(cycle.nodes))\n .filter((set) => set.size >= 2);\n\n const cycleNodeSet = new Set<string>();\n for (const cycleSet of cycleSets) {\n for (const node of cycleSet) {\n cycleNodeSet.add(node);\n }\n }\n\n const edgesInsideCycles = structuralEdges.filter((edge) =>\n cycleSets.some((cycleSet) => cycleSet.has(edge.from) && cycleSet.has(edge.to)),\n ).length;\n\n const cycleEdgeRatio =\n structuralEdges.length === 0 ? 0 : clamp01(edgesInsideCycles / structuralEdges.length);\n const cycleNodeRatio = clamp01(cycleNodeSet.size / sourceFileCount);\n const cycleDensityPenalty = clamp01(\n clamp01(cycleEdgeRatio / 0.2) * 0.75 + clamp01(cycleNodeRatio / 0.35) * 0.25,\n );\n\n const fanInConcentration = concentration(input.structural.files.map((file) => file.fanIn));\n const fanOutConcentration = concentration(input.structural.files.map((file) => file.fanOut));\n const fanConcentration = average([fanInConcentration, fanOutConcentration]);\n\n const centralityPressure = input.structural.files.map((file) => file.fanIn + file.fanOut);\n const centralityConcentration = concentration(centralityPressure);\n\n let structuralHotspotOverlap = 0;\n if (input.evolution.available) {\n const evolutionSourceFiles = input.evolution.files.filter((file) =>\n sourceFileSet.has(file.filePath),\n );\n const topStructuralCount = Math.max(1, Math.ceil(sourceFileCount * 0.1));\n const topChangeCount = Math.max(1, Math.ceil(Math.max(1, evolutionSourceFiles.length) * 0.1));\n\n const topStructural = new Set(\n [...input.structural.files]\n .map((file) => ({\n filePath: file.relativePath,\n pressure: file.fanIn + file.fanOut,\n }))\n .sort((a, b) => b.pressure - a.pressure || a.filePath.localeCompare(b.filePath))\n .slice(0, topStructuralCount)\n .map((item) => item.filePath),\n );\n\n const topChange = new Set(\n [...evolutionSourceFiles]\n .sort((a, b) => b.churnTotal - a.churnTotal || a.filePath.localeCompare(b.filePath))\n .slice(0, topChangeCount)\n .map((item) => item.filePath),\n );\n\n const overlapCount = [...topStructural].filter((filePath) => topChange.has(filePath)).length;\n structuralHotspotOverlap =\n topStructural.size === 0 || topChange.size === 0\n ? 0\n : clamp01(overlapCount / Math.min(topStructural.size, topChange.size));\n }\n\n const modularityFactors: readonly FactorSpec[] = [\n {\n factorId: \"health.modularity.cycle_density\",\n penalty: cycleDensityPenalty,\n rawMetrics: {\n cycleCount: input.structural.metrics.cycleCount,\n cycleEdgeRatio: round4(cycleEdgeRatio),\n cycleNodeRatio: round4(cycleNodeRatio),\n },\n normalizedMetrics: {\n cycleDensityPenalty: round4(cycleDensityPenalty),\n },\n weight: 0.4,\n evidence: [{ kind: \"repository_metric\", metric: \"structural.cycleEdgeRatio\" }],\n },\n {\n factorId: \"health.modularity.fan_concentration\",\n penalty: fanConcentration,\n rawMetrics: {\n fanInConcentration: round4(fanInConcentration),\n fanOutConcentration: round4(fanOutConcentration),\n },\n normalizedMetrics: {\n fanConcentration: round4(fanConcentration),\n },\n weight: 0.25,\n evidence: [{ kind: \"repository_metric\", metric: \"structural.files.fanIn/fanOut\" }],\n },\n {\n factorId: \"health.modularity.centrality_concentration\",\n penalty: centralityConcentration,\n rawMetrics: {\n centralityConcentration: round4(centralityConcentration),\n },\n normalizedMetrics: {\n centralityConcentration: round4(centralityConcentration),\n },\n weight: 0.2,\n evidence: [{ kind: \"repository_metric\", metric: \"structural.centralityPressure\" }],\n },\n {\n factorId: \"health.modularity.hotspot_overlap\",\n penalty: structuralHotspotOverlap,\n rawMetrics: {\n structuralHotspotOverlap: round4(structuralHotspotOverlap),\n },\n normalizedMetrics: {\n structuralHotspotOverlap: round4(structuralHotspotOverlap),\n },\n weight: 0.15,\n evidence: [{ kind: \"repository_metric\", metric: \"structural.evolution.hotspotOverlap\" }],\n },\n ];\n\n const modularityPenalty = dampenForSmallSamples(\n weightedPenalty(modularityFactors),\n sourceFileCount,\n 8,\n 0.45,\n );\n\n if (cycleDensityPenalty >= 0.35) {\n const firstCycle = input.structural.cycles[0];\n pushIssue(issues, {\n id: \"health.modularity.cycle_density\",\n ruleId: \"graph.cycle_density\",\n signal: \"structural.cycleEdgeRatio\",\n dimension: \"modularity\",\n target:\n firstCycle?.nodes\n .slice()\n .sort((a, b) => a.localeCompare(b))\n .join(\" -> \") ?? input.structural.targetPath,\n message:\n \"Dependencies inside cycles consume a high share of graph edges, reducing refactor flexibility.\",\n severity: cycleDensityPenalty >= 0.7 ? \"error\" : \"warn\",\n evidenceMetrics: {\n cycleCount: input.structural.metrics.cycleCount,\n cycleEdgeRatio: round4(cycleEdgeRatio),\n cycleNodeRatio: round4(cycleNodeRatio),\n },\n impact: round4(modularityPenalty * 0.35),\n });\n }\n\n if (centralityConcentration >= 0.5) {\n const hottest = [...input.structural.files]\n .map((file) => ({\n path: file.relativePath,\n pressure: file.fanIn + file.fanOut,\n }))\n .sort((a, b) => b.pressure - a.pressure || a.path.localeCompare(b.path))[0];\n\n pushIssue(issues, {\n id: \"health.modularity.centrality_concentration\",\n ruleId: \"graph.centrality_concentration\",\n signal: \"structural.centralityPressure\",\n dimension: \"modularity\",\n target: hottest?.path ?? input.structural.targetPath,\n message:\n \"Dependency flow is concentrated in a narrow set of files, creating architectural bottlenecks.\",\n evidenceMetrics: {\n fanConcentration: round4(fanConcentration),\n centralityConcentration: round4(centralityConcentration),\n },\n impact: round4(modularityPenalty * 0.25),\n });\n }\n\n if (structuralHotspotOverlap >= 0.5) {\n pushIssue(issues, {\n id: \"health.modularity.hotspot_overlap\",\n ruleId: \"graph.hotspot_overlap\",\n signal: \"structural.evolution.hotspotOverlap\",\n dimension: \"modularity\",\n target: input.structural.targetPath,\n message:\n \"Structural hubs overlap with top churn hotspots, making change pressure harder to isolate.\",\n evidenceMetrics: {\n structuralHotspotOverlap: round4(structuralHotspotOverlap),\n },\n impact: round4(modularityPenalty * 0.2),\n });\n }\n\n let churnConcentrationPenalty = 0;\n let volatilityConcentrationPenalty = 0;\n let coChangeClusterPenalty = 0;\n let top10PercentFilesChurnShare = 0;\n let top10PercentFilesVolatilityShare = 0;\n let denseCoChangePairRatio = 0;\n\n if (input.evolution.available) {\n const evolutionSourceFiles = input.evolution.files.filter((file) =>\n sourceFileSet.has(file.filePath),\n );\n const evolutionFileCount = evolutionSourceFiles.length;\n\n top10PercentFilesChurnShare = topPercentShare(\n evolutionSourceFiles.map((file) => file.churnTotal),\n 0.1,\n );\n top10PercentFilesVolatilityShare = topPercentShare(\n evolutionSourceFiles.map((file) => file.recentVolatility),\n 0.1,\n );\n\n const sourcePairs = input.evolution.coupling.pairs.filter(\n (pair) => sourceFileSet.has(pair.fileA) && sourceFileSet.has(pair.fileB),\n );\n const maxPairs = (evolutionFileCount * (evolutionFileCount - 1)) / 2;\n const densePairs = sourcePairs.filter((pair) => pair.couplingScore >= 0.55);\n denseCoChangePairRatio = maxPairs <= 0 ? 0 : clamp01(densePairs.length / maxPairs);\n const couplingScoreConcentration = concentration(sourcePairs.map((pair) => pair.couplingScore));\n\n churnConcentrationPenalty = dampenForSmallSamples(\n clamp01((top10PercentFilesChurnShare - 0.35) / 0.55),\n evolutionFileCount,\n 12,\n 0.3,\n );\n volatilityConcentrationPenalty = dampenForSmallSamples(\n clamp01((top10PercentFilesVolatilityShare - 0.35) / 0.55),\n evolutionFileCount,\n 12,\n 0.3,\n );\n\n const coChangeRaw = average([\n clamp01(denseCoChangePairRatio / 0.2),\n couplingScoreConcentration,\n ]);\n coChangeClusterPenalty = dampenForSmallSamples(coChangeRaw, sourcePairs.length, 20, 0.35);\n\n if (churnConcentrationPenalty >= 0.35) {\n const mostChurn = [...evolutionSourceFiles].sort(\n (a, b) => b.churnTotal - a.churnTotal || a.filePath.localeCompare(b.filePath),\n )[0];\n pushIssue(issues, {\n id: \"health.change_hygiene.churn_concentration\",\n ruleId: \"git.churn_distribution\",\n signal: \"evolution.top10PercentFilesChurnShare\",\n dimension: \"changeHygiene\",\n target: mostChurn?.filePath ?? input.structural.targetPath,\n message: \"A small slice of files carries most churn, reducing change predictability.\",\n evidenceMetrics: {\n top10PercentFilesChurnShare: round4(top10PercentFilesChurnShare),\n },\n impact: round4(churnConcentrationPenalty * 0.4),\n });\n }\n\n if (volatilityConcentrationPenalty >= 0.35) {\n const volatileFile = [...evolutionSourceFiles].sort(\n (a, b) => b.recentVolatility - a.recentVolatility || a.filePath.localeCompare(b.filePath),\n )[0];\n pushIssue(issues, {\n id: \"health.change_hygiene.volatility_concentration\",\n ruleId: \"git.volatility_distribution\",\n signal: \"evolution.top10PercentFilesVolatilityShare\",\n dimension: \"changeHygiene\",\n target: volatileFile?.filePath ?? input.structural.targetPath,\n message: \"Recent volatility is concentrated, increasing review and release uncertainty.\",\n evidenceMetrics: {\n top10PercentFilesVolatilityShare: round4(top10PercentFilesVolatilityShare),\n },\n impact: round4(volatilityConcentrationPenalty * 0.3),\n });\n }\n\n if (coChangeClusterPenalty >= 0.35) {\n const strongestPair = [...sourcePairs].sort(\n (a, b) =>\n b.couplingScore - a.couplingScore ||\n `${a.fileA}|${a.fileB}`.localeCompare(`${b.fileA}|${b.fileB}`),\n )[0];\n\n pushIssue(issues, {\n id: \"health.change_hygiene.dense_co_change_clusters\",\n ruleId: \"git.co_change_clusters\",\n signal: \"evolution.denseCoChangePairRatio\",\n dimension: \"changeHygiene\",\n target:\n strongestPair === undefined\n ? input.structural.targetPath\n : `${strongestPair.fileA}<->${strongestPair.fileB}`,\n message: \"Dense co-change clusters suggest wider coordination scope per change.\",\n evidenceMetrics: {\n denseCoChangePairRatio: round4(denseCoChangePairRatio),\n },\n impact: round4(coChangeClusterPenalty * 0.3),\n });\n }\n }\n\n const changeHygieneFactors: readonly FactorSpec[] = [\n {\n factorId: \"health.change_hygiene.churn_concentration\",\n penalty: churnConcentrationPenalty,\n rawMetrics: {\n top10PercentFilesChurnShare: round4(top10PercentFilesChurnShare),\n },\n normalizedMetrics: {\n churnConcentrationPenalty: round4(churnConcentrationPenalty),\n },\n weight: 0.4,\n evidence: [{ kind: \"repository_metric\", metric: \"evolution.top10PercentFilesChurnShare\" }],\n },\n {\n factorId: \"health.change_hygiene.volatility_concentration\",\n penalty: volatilityConcentrationPenalty,\n rawMetrics: {\n top10PercentFilesVolatilityShare: round4(top10PercentFilesVolatilityShare),\n },\n normalizedMetrics: {\n volatilityConcentrationPenalty: round4(volatilityConcentrationPenalty),\n },\n weight: 0.3,\n evidence: [\n {\n kind: \"repository_metric\",\n metric: \"evolution.top10PercentFilesVolatilityShare\",\n },\n ],\n },\n {\n factorId: \"health.change_hygiene.dense_co_change_clusters\",\n penalty: coChangeClusterPenalty,\n rawMetrics: {\n denseCoChangePairRatio: round4(denseCoChangePairRatio),\n },\n normalizedMetrics: {\n coChangeClusterPenalty: round4(coChangeClusterPenalty),\n },\n weight: 0.3,\n evidence: [{ kind: \"repository_metric\", metric: \"evolution.denseCoChangePairRatio\" }],\n },\n ];\n\n const changeHygienePenalty = input.evolution.available\n ? weightedPenalty(changeHygieneFactors)\n : 0.12;\n\n const paths = filePaths(input.structural);\n const testFiles = paths.filter((path) => isTestPath(path)).length;\n const sourceFiles = paths.filter((path) => isSourcePath(path)).length;\n const testRatio = sourceFiles <= 0 ? 1 : testFiles / sourceFiles;\n const testingDirectoryPresent = hasTestDirectory(paths);\n\n const testPresencePenalty = sourceFiles <= 0 ? 0 : testFiles === 0 ? 1 : 0;\n const testRatioPenalty = sourceFiles <= 0 ? 0 : 1 - clamp01(testRatio / 0.25);\n const testingDirectoryPenalty = sourceFiles <= 0 ? 0 : testingDirectoryPresent ? 0 : 0.35;\n\n const testHealthFactors: readonly FactorSpec[] = [\n {\n factorId: \"health.test_health.test_file_presence\",\n penalty: testPresencePenalty,\n rawMetrics: {\n sourceFiles,\n testFiles,\n },\n normalizedMetrics: {\n testPresencePenalty: round4(testPresencePenalty),\n },\n weight: 0.4,\n evidence: [{ kind: \"repository_metric\", metric: \"tests.filePresence\" }],\n },\n {\n factorId: \"health.test_health.test_to_source_ratio\",\n penalty: testRatioPenalty,\n rawMetrics: {\n testToSourceRatio: round4(testRatio),\n },\n normalizedMetrics: {\n testRatioPenalty: round4(testRatioPenalty),\n },\n weight: 0.45,\n evidence: [{ kind: \"repository_metric\", metric: \"tests.testToSourceRatio\" }],\n },\n {\n factorId: \"health.test_health.testing_directory_presence\",\n penalty: testingDirectoryPenalty,\n rawMetrics: {\n testingDirectoryPresent: testingDirectoryPresent ? 1 : 0,\n },\n normalizedMetrics: {\n testingDirectoryPenalty: round4(testingDirectoryPenalty),\n },\n weight: 0.15,\n evidence: [{ kind: \"repository_metric\", metric: \"tests.directoryPresence\" }],\n },\n ];\n\n const testHealthPenalty = dampenForSmallSamples(\n weightedPenalty(testHealthFactors),\n sourceFiles,\n 10,\n 0.3,\n );\n\n if (sourceFiles > 0 && testFiles === 0) {\n pushIssue(issues, {\n id: \"health.test_health.low_test_presence\",\n ruleId: \"tests.file_presence\",\n signal: \"tests.filePresence\",\n dimension: \"testHealth\",\n target: input.structural.targetPath,\n message: `No test files detected for ${sourceFiles} source file(s).`,\n severity: sourceFiles >= 12 ? \"error\" : \"warn\",\n evidenceMetrics: {\n sourceFiles,\n testFiles,\n testToSourceRatio: round4(testRatio),\n },\n impact: round4(testHealthPenalty * 0.45),\n });\n }\n\n if (sourceFiles > 0 && testRatio < 0.12) {\n pushIssue(issues, {\n id: \"health.test_health.low_test_ratio\",\n ruleId: \"tests.ratio\",\n signal: \"tests.testToSourceRatio\",\n dimension: \"testHealth\",\n target: input.structural.targetPath,\n message: \"Test-to-source ratio is low; long-term change confidence may degrade.\",\n evidenceMetrics: {\n sourceFiles,\n testFiles,\n testToSourceRatio: round4(testRatio),\n },\n impact: round4(testHealthPenalty * 0.35),\n });\n }\n\n if (input.evolution.available) {\n const evolutionSourceFiles = input.evolution.files.filter((file) =>\n sourceFileSet.has(file.filePath),\n );\n const authorTotals = new Map<string, number>();\n const moduleTotals = new Map<string, number>();\n const moduleAuthors = new Map<string, Map<string, number>>();\n\n let singleContributorFiles = 0;\n let trackedFiles = 0;\n\n for (const file of evolutionSourceFiles) {\n if (file.commitCount <= 0 || file.authorDistribution.length === 0) {\n continue;\n }\n\n trackedFiles += 1;\n const dominantShare = clamp01(file.authorDistribution[0]?.share ?? 0);\n if (file.authorDistribution.length === 1 || dominantShare >= 0.9) {\n singleContributorFiles += 1;\n }\n\n for (const author of file.authorDistribution) {\n const commits = Math.max(0, author.commits);\n if (commits <= 0) {\n continue;\n }\n\n const moduleName = moduleNameFromPath(file.filePath);\n const moduleAuthorTotals = moduleAuthors.get(moduleName) ?? new Map<string, number>();\n if (moduleAuthors.has(moduleName) === false) {\n moduleAuthors.set(moduleName, moduleAuthorTotals);\n }\n\n authorTotals.set(author.authorId, (authorTotals.get(author.authorId) ?? 0) + commits);\n moduleTotals.set(moduleName, (moduleTotals.get(moduleName) ?? 0) + commits);\n moduleAuthorTotals.set(\n author.authorId,\n (moduleAuthorTotals.get(author.authorId) ?? 0) + commits,\n );\n }\n }\n\n const totalAuthorCommits = [...authorTotals.values()].reduce((sum, value) => sum + value, 0);\n const highestAuthorCommits = [...authorTotals.values()].sort((a, b) => b - a)[0] ?? 0;\n const topAuthorCommitShare =\n totalAuthorCommits <= 0 ? 0 : clamp01(highestAuthorCommits / totalAuthorCommits);\n\n const filesWithSingleContributorRatio =\n trackedFiles === 0 ? 0 : clamp01(singleContributorFiles / trackedFiles);\n\n const authorEntropy = normalizedEntropy([...authorTotals.values()]);\n\n let dominatedModules = 0;\n let trackedModules = 0;\n for (const [moduleName, moduleCommitTotal] of moduleTotals.entries()) {\n if (moduleCommitTotal < 5) {\n continue;\n }\n\n const perModuleAuthors = moduleAuthors.get(moduleName);\n if (perModuleAuthors === undefined) {\n continue;\n }\n\n trackedModules += 1;\n const topAuthorModuleCommits = [...perModuleAuthors.values()].sort((a, b) => b - a)[0] ?? 0;\n const moduleTopShare =\n moduleCommitTotal <= 0 ? 0 : topAuthorModuleCommits / moduleCommitTotal;\n if (moduleTopShare >= 0.8) {\n dominatedModules += 1;\n }\n }\n\n const modulesDominatedBySingleContributorRatio =\n trackedModules === 0 ? 0 : clamp01(dominatedModules / trackedModules);\n\n const ownershipSampleSize = trackedFiles;\n const ownershipCommitVolume = totalAuthorCommits;\n\n const ownershipReliability = average([\n clamp01(ownershipSampleSize / 12),\n clamp01(ownershipCommitVolume / 180),\n ]);\n\n const topAuthorPenalty = clamp01((topAuthorCommitShare - 0.55) / 0.4);\n const singleContributorPenalty = clamp01((filesWithSingleContributorRatio - 0.35) / 0.6);\n const entropyPenalty = clamp01((0.75 - authorEntropy) / 0.75);\n const moduleDominancePenalty = clamp01((modulesDominatedBySingleContributorRatio - 0.4) / 0.6);\n\n const ownershipBasePenalty = weightedPenalty([\n {\n factorId: \"health.ownership.top_author_commit_share\",\n penalty: topAuthorPenalty,\n rawMetrics: {\n topAuthorCommitShare: round4(topAuthorCommitShare),\n },\n normalizedMetrics: {\n topAuthorPenalty: round4(topAuthorPenalty),\n },\n weight: 0.35,\n evidence: [{ kind: \"repository_metric\", metric: \"ownership.topAuthorCommitShare\" }],\n },\n {\n factorId: \"health.ownership.files_with_single_contributor_ratio\",\n penalty: singleContributorPenalty,\n rawMetrics: {\n filesWithSingleContributorRatio: round4(filesWithSingleContributorRatio),\n },\n normalizedMetrics: {\n singleContributorPenalty: round4(singleContributorPenalty),\n },\n weight: 0.25,\n evidence: [\n {\n kind: \"repository_metric\",\n metric: \"ownership.filesWithSingleContributorRatio\",\n },\n ],\n },\n {\n factorId: \"health.ownership.author_entropy\",\n penalty: entropyPenalty,\n rawMetrics: {\n authorEntropy: round4(authorEntropy),\n },\n normalizedMetrics: {\n authorEntropyPenalty: round4(entropyPenalty),\n },\n weight: 0.25,\n evidence: [{ kind: \"repository_metric\", metric: \"ownership.authorEntropy\" }],\n },\n {\n factorId: \"health.ownership.module_single_author_dominance\",\n penalty: moduleDominancePenalty,\n rawMetrics: {\n modulesDominatedBySingleContributorRatio: round4(\n modulesDominatedBySingleContributorRatio,\n ),\n },\n normalizedMetrics: {\n moduleDominancePenalty: round4(moduleDominancePenalty),\n },\n weight: 0.15,\n evidence: [{ kind: \"repository_metric\", metric: \"ownership.moduleDominance\" }],\n },\n ]);\n\n const ownershipDistributionPenalty = clamp01(\n ownershipBasePenalty * (0.3 + 0.7 * ownershipReliability) * ownershipPenaltyMultiplier,\n );\n\n const ownershipDistributionFactors: readonly FactorSpec[] = [\n {\n factorId: \"health.ownership.top_author_commit_share\",\n penalty: topAuthorPenalty,\n rawMetrics: {\n topAuthorCommitShare: round4(topAuthorCommitShare),\n },\n normalizedMetrics: {\n topAuthorPenalty: round4(topAuthorPenalty),\n ownershipPenaltyMultiplier: round4(ownershipPenaltyMultiplier),\n ownershipReliability: round4(ownershipReliability),\n },\n weight: 0.35,\n evidence: [{ kind: \"repository_metric\", metric: \"ownership.topAuthorCommitShare\" }],\n },\n {\n factorId: \"health.ownership.files_with_single_contributor_ratio\",\n penalty: singleContributorPenalty,\n rawMetrics: {\n filesWithSingleContributorRatio: round4(filesWithSingleContributorRatio),\n },\n normalizedMetrics: {\n singleContributorPenalty: round4(singleContributorPenalty),\n },\n weight: 0.25,\n evidence: [\n {\n kind: \"repository_metric\",\n metric: \"ownership.filesWithSingleContributorRatio\",\n },\n ],\n },\n {\n factorId: \"health.ownership.author_entropy\",\n penalty: entropyPenalty,\n rawMetrics: {\n authorEntropy: round4(authorEntropy),\n },\n normalizedMetrics: {\n authorEntropyPenalty: round4(entropyPenalty),\n },\n weight: 0.25,\n evidence: [{ kind: \"repository_metric\", metric: \"ownership.authorEntropy\" }],\n },\n {\n factorId: \"health.ownership.module_single_author_dominance\",\n penalty: moduleDominancePenalty,\n rawMetrics: {\n modulesDominatedBySingleContributorRatio: round4(\n modulesDominatedBySingleContributorRatio,\n ),\n },\n normalizedMetrics: {\n moduleDominancePenalty: round4(moduleDominancePenalty),\n },\n weight: 0.15,\n evidence: [{ kind: \"repository_metric\", metric: \"ownership.moduleDominance\" }],\n },\n ];\n\n if (topAuthorPenalty >= 0.35) {\n pushIssue(issues, {\n id: \"health.ownership.top_author_commit_share\",\n ruleId: \"ownership.top_author_share\",\n signal: \"ownership.topAuthorCommitShare\",\n dimension: \"ownershipDistribution\",\n target: input.structural.targetPath,\n message: \"A single contributor owns most commits, concentrating repository knowledge.\",\n severity: topAuthorPenalty >= 0.75 ? \"error\" : \"warn\",\n evidenceMetrics: {\n topAuthorCommitShare: round4(topAuthorCommitShare),\n authorEntropy: round4(authorEntropy),\n },\n impact: round4(ownershipDistributionPenalty * 0.4),\n });\n }\n\n if (singleContributorPenalty >= 0.35) {\n pushIssue(issues, {\n id: \"health.ownership.single_author_dominance\",\n ruleId: \"ownership.file_dominance\",\n signal: \"ownership.filesWithSingleContributorRatio\",\n dimension: \"ownershipDistribution\",\n target: input.structural.targetPath,\n message: \"Many files are dominated by a single contributor, reducing change resilience.\",\n evidenceMetrics: {\n filesWithSingleContributorRatio: round4(filesWithSingleContributorRatio),\n modulesDominatedBySingleContributorRatio: round4(\n modulesDominatedBySingleContributorRatio,\n ),\n },\n impact: round4(ownershipDistributionPenalty * 0.35),\n });\n }\n\n if (entropyPenalty >= 0.35) {\n pushIssue(issues, {\n id: \"health.ownership.low_author_entropy\",\n ruleId: \"ownership.author_entropy\",\n signal: \"ownership.authorEntropy\",\n dimension: \"ownershipDistribution\",\n target: input.structural.targetPath,\n message: \"Contributor distribution is narrow across the repository.\",\n evidenceMetrics: {\n authorEntropy: round4(authorEntropy),\n topAuthorCommitShare: round4(topAuthorCommitShare),\n },\n impact: round4(ownershipDistributionPenalty * 0.25),\n });\n }\n\n const modularityHealth = clamp01(1 - modularityPenalty);\n const changeHygieneHealth = clamp01(1 - changeHygienePenalty);\n const testHealthScore = clamp01(1 - testHealthPenalty);\n const ownershipDistributionHealth = clamp01(1 - ownershipDistributionPenalty);\n\n const normalizedScore = clamp01(\n modularityHealth * DIMENSION_WEIGHTS.modularity +\n changeHygieneHealth * DIMENSION_WEIGHTS.changeHygiene +\n testHealthScore * DIMENSION_WEIGHTS.testHealth +\n ownershipDistributionHealth * DIMENSION_WEIGHTS.ownershipDistribution,\n );\n\n const topIssues = [...issues]\n .sort(\n (a, b) =>\n b.impact - a.impact || a.id.localeCompare(b.id) || a.target.localeCompare(b.target),\n )\n .slice(0, 12)\n .map(({ impact: _impact, ...issue }) => issue);\n\n return {\n healthScore: toPercentage(normalizedScore),\n normalizedScore: round4(normalizedScore),\n dimensions: {\n modularity: toPercentage(modularityHealth),\n changeHygiene: toPercentage(changeHygieneHealth),\n testHealth: toPercentage(testHealthScore),\n ownershipDistribution: toPercentage(ownershipDistributionHealth),\n },\n topIssues,\n trace: {\n schemaVersion: HEALTH_TRACE_VERSION,\n dimensions: [\n createDimensionTrace(\"modularity\", modularityHealth, modularityFactors),\n createDimensionTrace(\"changeHygiene\", changeHygieneHealth, changeHygieneFactors),\n createDimensionTrace(\"testHealth\", testHealthScore, testHealthFactors),\n createDimensionTrace(\n \"ownershipDistribution\",\n ownershipDistributionHealth,\n ownershipDistributionFactors,\n ),\n ],\n },\n };\n }\n\n const ownershipDistributionPenalty = clamp01(0.12 * ownershipPenaltyMultiplier);\n const ownershipDistributionFactors: readonly FactorSpec[] = [\n {\n factorId: \"health.ownership.missing_git_history\",\n penalty: ownershipDistributionPenalty,\n rawMetrics: {\n gitHistoryAvailable: 0,\n },\n normalizedMetrics: {\n ownershipDistributionPenalty: round4(ownershipDistributionPenalty),\n },\n weight: 1,\n evidence: [{ kind: \"repository_metric\", metric: \"evolution.available\" }],\n },\n ];\n\n const modularityHealth = clamp01(1 - modularityPenalty);\n const changeHygieneHealth = clamp01(1 - changeHygienePenalty);\n const testHealthScore = clamp01(1 - testHealthPenalty);\n const ownershipDistributionHealth = clamp01(1 - ownershipDistributionPenalty);\n\n const normalizedScore = clamp01(\n modularityHealth * DIMENSION_WEIGHTS.modularity +\n changeHygieneHealth * DIMENSION_WEIGHTS.changeHygiene +\n testHealthScore * DIMENSION_WEIGHTS.testHealth +\n ownershipDistributionHealth * DIMENSION_WEIGHTS.ownershipDistribution,\n );\n\n const topIssues = [...issues]\n .sort(\n (a, b) => b.impact - a.impact || a.id.localeCompare(b.id) || a.target.localeCompare(b.target),\n )\n .slice(0, 12)\n .map(({ impact: _impact, ...issue }) => issue);\n\n return {\n healthScore: toPercentage(normalizedScore),\n normalizedScore: round4(normalizedScore),\n dimensions: {\n modularity: toPercentage(modularityHealth),\n changeHygiene: toPercentage(changeHygieneHealth),\n testHealth: toPercentage(testHealthScore),\n ownershipDistribution: toPercentage(ownershipDistributionHealth),\n },\n topIssues,\n trace: {\n schemaVersion: HEALTH_TRACE_VERSION,\n dimensions: [\n createDimensionTrace(\"modularity\", modularityHealth, modularityFactors),\n createDimensionTrace(\"changeHygiene\", changeHygieneHealth, changeHygieneFactors),\n createDimensionTrace(\"testHealth\", testHealthScore, testHealthFactors),\n createDimensionTrace(\n \"ownershipDistribution\",\n ownershipDistributionHealth,\n ownershipDistributionFactors,\n ),\n ],\n },\n };\n};\n","export type DimensionWeights = {\n structural: number;\n evolution: number;\n external: number;\n};\n\nexport type InteractionWeights = {\n structuralEvolution: number;\n centralInstability: number;\n dependencyAmplification: number;\n};\n\nexport type StructuralFactorWeights = {\n fanIn: number;\n fanOut: number;\n depth: number;\n cycleParticipation: number;\n};\n\nexport type EvolutionFactorWeights = {\n frequency: number;\n churn: number;\n recentVolatility: number;\n ownershipConcentration: number;\n busFactorRisk: number;\n};\n\nexport type DependencyFactorWeights = {\n signals: number;\n staleness: number;\n maintainerConcentration: number;\n transitiveBurden: number;\n centrality: number;\n chainDepth: number;\n busFactorRisk: number;\n};\n\nexport type RiskEngineConfig = {\n dimensionWeights: DimensionWeights;\n interactionWeights: InteractionWeights;\n structuralFactorWeights: StructuralFactorWeights;\n evolutionFactorWeights: EvolutionFactorWeights;\n dependencyFactorWeights: DependencyFactorWeights;\n quantileClamp: {\n lower: number;\n upper: number;\n };\n hotspotTopPercent: number;\n hotspotMinFiles: number;\n hotspotMaxFiles: number;\n couplingCluster: {\n minCoChangeCommits: number;\n percentileThreshold: number;\n floorScore: number;\n };\n amplificationZone: {\n pressureFloor: number;\n percentileThreshold: number;\n maxZones: number;\n };\n module: {\n maxPrefixSegments: number;\n rootLabel: string;\n commonSourceRoots: readonly string[];\n };\n dependencySignals: {\n inheritedSignalMultiplier: number;\n abandonedHalfLifeDays: number;\n missingMetadataPenalty: number;\n popularityHalfLifeDownloads: number;\n popularityMaxDampening: number;\n };\n externalDimension: {\n topDependencyPercentile: number;\n dependencyDepthHalfLife: number;\n };\n aggregatorAttenuation: {\n enabled: boolean;\n minFanIn: number;\n minFanOut: number;\n minCommitCount: number;\n maxChurnPerCommit: number;\n maxChurnPerDependency: number;\n maxStructuralReduction: number;\n };\n};\n\nexport const DEFAULT_RISK_ENGINE_CONFIG: RiskEngineConfig = {\n // Base dimensional influence. Risk is never dominated by a single dimension by default.\n dimensionWeights: {\n structural: 0.44,\n evolution: 0.36,\n external: 0.2,\n },\n // Interaction terms activate only when both related dimensions are high.\n interactionWeights: {\n structuralEvolution: 0.35,\n centralInstability: 0.25,\n dependencyAmplification: 0.2,\n },\n structuralFactorWeights: {\n fanIn: 0.3,\n fanOut: 0.25,\n depth: 0.2,\n cycleParticipation: 0.25,\n },\n evolutionFactorWeights: {\n frequency: 0.26,\n churn: 0.24,\n recentVolatility: 0.2,\n ownershipConcentration: 0.18,\n busFactorRisk: 0.12,\n },\n dependencyFactorWeights: {\n signals: 0.38,\n staleness: 0.16,\n maintainerConcentration: 0.16,\n transitiveBurden: 0.1,\n centrality: 0.08,\n chainDepth: 0.06,\n busFactorRisk: 0.06,\n },\n quantileClamp: {\n lower: 0.05,\n upper: 0.95,\n },\n hotspotTopPercent: 0.12,\n hotspotMinFiles: 3,\n hotspotMaxFiles: 30,\n couplingCluster: {\n minCoChangeCommits: 2,\n percentileThreshold: 0.9,\n floorScore: 0.35,\n },\n amplificationZone: {\n pressureFloor: 0.2,\n percentileThreshold: 0.85,\n maxZones: 20,\n },\n module: {\n maxPrefixSegments: 2,\n rootLabel: \"(root)\",\n commonSourceRoots: [\"src\", \"lib\", \"app\", \"packages\"],\n },\n dependencySignals: {\n inheritedSignalMultiplier: 0.45,\n // At this age, staleness reaches 50% risk.\n abandonedHalfLifeDays: 540,\n missingMetadataPenalty: 0.5,\n // At this download volume, popularity reaches 50% of its dampening effect.\n popularityHalfLifeDownloads: 100000,\n // Popularity can only reduce dependency risk by this fraction.\n popularityMaxDampening: 0.12,\n },\n externalDimension: {\n topDependencyPercentile: 0.85,\n dependencyDepthHalfLife: 6,\n },\n // Reduce false positives for thin aggregation hubs (for example, barrel/index re-export files)\n // that are structurally central but have low churn density and no cycle participation.\n aggregatorAttenuation: {\n enabled: true,\n minFanIn: 6,\n minFanOut: 4,\n minCommitCount: 4,\n maxChurnPerCommit: 24,\n maxChurnPerDependency: 10,\n maxStructuralReduction: 0.3,\n },\n};\n","export const toUnitInterval = (value: number): number =>\n Number.isFinite(value) ? Math.min(1, Math.max(0, value)) : 0;\n\nexport const round4 = (value: number): number => Number(value.toFixed(4));\n\nexport const average = (values: readonly number[]): number => {\n if (values.length === 0) {\n return 0;\n }\n\n const total = values.reduce((sum, current) => sum + current, 0);\n return total / values.length;\n};\n\nexport const percentile = (values: readonly number[], p: number): number => {\n if (values.length === 0) {\n return 0;\n }\n\n if (values.length === 1) {\n return values[0] ?? 0;\n }\n\n const sorted = [...values].sort((a, b) => a - b);\n const position = toUnitInterval(p) * (sorted.length - 1);\n const lowerIndex = Math.floor(position);\n const upperIndex = Math.ceil(position);\n\n const lower = sorted[lowerIndex] ?? 0;\n const upper = sorted[upperIndex] ?? lower;\n\n if (lowerIndex === upperIndex) {\n return lower;\n }\n\n const ratio = position - lowerIndex;\n return lower + (upper - lower) * ratio;\n};\n\nexport const saturatingComposite = (\n baseline: number,\n amplifications: readonly number[],\n): number => {\n let value = toUnitInterval(baseline);\n\n for (const amplification of amplifications) {\n const boundedAmplification = toUnitInterval(amplification);\n value += (1 - value) * boundedAmplification;\n }\n\n return toUnitInterval(value);\n};\n\nexport const halfLifeRisk = (value: number, halfLife: number): number => {\n if (value <= 0 || halfLife <= 0) {\n return 0;\n }\n\n return toUnitInterval(value / (value + halfLife));\n};\n\nexport const normalizeWeights = <T extends string>(\n weights: Readonly<Record<T, number>>,\n enabled: Readonly<Record<T, boolean>>,\n): Readonly<Record<T, number>> => {\n let total = 0;\n const result: Record<T, number> = { ...weights };\n\n for (const key of Object.keys(result) as T[]) {\n const enabledValue = enabled[key];\n if (!enabledValue) {\n result[key] = 0;\n continue;\n }\n\n const value = Math.max(0, result[key]);\n result[key] = value;\n total += value;\n }\n\n if (total === 0) {\n const activeKeys = (Object.keys(result) as T[]).filter((key) => enabled[key]);\n if (activeKeys.length === 0) {\n return result;\n }\n\n const uniform = 1 / activeKeys.length;\n for (const key of activeKeys) {\n result[key] = uniform;\n }\n\n return result;\n }\n\n for (const key of Object.keys(result) as T[]) {\n if (enabled[key]) {\n result[key] = result[key] / total;\n }\n }\n\n return result;\n};\n","import { toUnitInterval, percentile } from \"./math.js\";\n\nexport type QuantileScale = {\n lower: number;\n upper: number;\n};\n\nexport const logScale = (value: number): number => Math.log1p(Math.max(0, value));\n\nexport const buildQuantileScale = (\n values: readonly number[],\n lowerPercentile: number,\n upperPercentile: number,\n): QuantileScale => {\n if (values.length === 0) {\n return { lower: 0, upper: 0 };\n }\n\n return {\n lower: percentile(values, lowerPercentile),\n upper: percentile(values, upperPercentile),\n };\n};\n\nexport const normalizeWithScale = (value: number, scale: QuantileScale): number => {\n if (scale.upper <= scale.lower) {\n return value > 0 ? 1 : 0;\n }\n\n return toUnitInterval((value - scale.lower) / (scale.upper - scale.lower));\n};\n","import type {\n DependencyRiskScore,\n DependencyRiskSignal,\n EvidenceRef,\n ExternalAnalysisSummary,\n FileEvolutionMetrics,\n FileRiskScore,\n FragileCluster,\n GraphAnalysisSummary,\n ModuleRiskScore,\n RepositoryEvolutionSummary,\n RepositoryRiskSummary,\n RiskFactors,\n RiskFactorFamily,\n RiskFactorTrace,\n TargetTrace,\n} from \"@codesentinel/core\";\nimport type { RiskEngineConfig } from \"../config.js\";\nimport {\n average,\n toUnitInterval,\n halfLifeRisk,\n normalizeWeights,\n percentile,\n round4,\n saturatingComposite,\n} from \"./math.js\";\nimport { buildQuantileScale, logScale, normalizeWithScale } from \"./normalization.js\";\nimport type { TraceCollector } from \"./trace-collector.js\";\n\ntype DependencyScoreComputation = {\n dependencyScores: readonly DependencyRiskScore[];\n repositoryExternalPressure: number;\n dependencyContexts: ReadonlyMap<\n string,\n {\n signalScore: number;\n stalenessRisk: number;\n maintainerConcentrationRisk: number;\n transitiveBurdenRisk: number;\n centralityRisk: number;\n chainDepthRisk: number;\n busFactorRisk: number;\n popularityDampener: number;\n rawMetrics: {\n daysSinceLastRelease: number | null;\n maintainerCount: number | null;\n transitiveCount: number;\n dependents: number;\n dependencyDepth: number;\n busFactor: number | null;\n weeklyDownloads: number | null;\n };\n confidence: number;\n }\n >;\n};\n\ntype FileRiskContext = {\n file: string;\n score: number;\n normalizedScore: number;\n factors: RiskFactors;\n structuralCentrality: number;\n traceTerms: {\n structuralBase: number;\n evolutionBase: number;\n externalBase: number;\n interactionStructuralEvolution: number;\n interactionCentralInstability: number;\n interactionDependencyAmplification: number;\n };\n rawMetrics: {\n fanIn: number;\n fanOut: number;\n depth: number;\n cycleParticipation: number;\n commitCount: number | null;\n churnTotal: number | null;\n recentVolatility: number | null;\n topAuthorShare: number | null;\n busFactor: number | null;\n dependencyAffinity: number;\n repositoryExternalPressure: number;\n structuralAttenuation: number;\n };\n normalizedMetrics: {\n fanInRisk: number;\n fanOutRisk: number;\n depthRisk: number;\n frequencyRisk: number;\n churnRisk: number;\n volatilityRisk: number;\n ownershipConcentrationRisk: number;\n busFactorRisk: number;\n };\n};\n\ntype MetricScales = {\n commitCount: ReturnType<typeof buildQuantileScale>;\n churnTotal: ReturnType<typeof buildQuantileScale>;\n busFactor: ReturnType<typeof buildQuantileScale>;\n};\n\ntype FactorTraceInput = {\n factorId: string;\n family: RiskFactorFamily;\n strength: number;\n rawMetrics: Readonly<Record<string, number | null>>;\n normalizedMetrics: Readonly<Record<string, number | null>>;\n weight: number | null;\n amplification: number | null;\n evidence: readonly EvidenceRef[];\n confidence: number;\n};\n\nconst normalizePath = (path: string): string => path.replaceAll(\"\\\\\", \"/\");\n\nconst computeAggregatorAttenuation = (input: {\n fanIn: number;\n fanOut: number;\n inCycle: number;\n evolutionMetrics: FileEvolutionMetrics | undefined;\n config: RiskEngineConfig[\"aggregatorAttenuation\"];\n}): number => {\n const { fanIn, fanOut, inCycle, evolutionMetrics, config } = input;\n if (!config.enabled || inCycle > 0) {\n return 1;\n }\n\n if (fanIn < config.minFanIn || fanOut < config.minFanOut) {\n return 1;\n }\n\n if (evolutionMetrics === undefined || evolutionMetrics.commitCount < config.minCommitCount) {\n return 1;\n }\n\n const churnPerCommit = evolutionMetrics.churnTotal / Math.max(1, evolutionMetrics.commitCount);\n const churnPerDependency = evolutionMetrics.churnTotal / Math.max(1, fanOut);\n\n if (\n churnPerCommit > config.maxChurnPerCommit ||\n churnPerDependency > config.maxChurnPerDependency\n ) {\n return 1;\n }\n\n const fanInSignal = toUnitInterval((fanIn - config.minFanIn) / Math.max(1, config.minFanIn));\n const fanOutSignal = toUnitInterval((fanOut - config.minFanOut) / Math.max(1, config.minFanOut));\n const lowChurnPerCommitSignal = 1 - toUnitInterval(churnPerCommit / config.maxChurnPerCommit);\n const lowChurnPerDependencySignal =\n 1 - toUnitInterval(churnPerDependency / config.maxChurnPerDependency);\n const attenuationConfidence = average([\n fanInSignal,\n fanOutSignal,\n lowChurnPerCommitSignal,\n lowChurnPerDependencySignal,\n ]);\n\n const reduction = toUnitInterval(config.maxStructuralReduction) * attenuationConfidence;\n return round4(toUnitInterval(1 - reduction));\n};\n\nconst dependencySignalWeights: Readonly<Record<DependencyRiskSignal, number>> = {\n single_maintainer: 0.3,\n abandoned: 0.3,\n high_centrality: 0.16,\n deep_chain: 0.14,\n high_fanout: 0.06,\n metadata_unavailable: 0.04,\n};\n\nconst dependencySignalWeightBudget = Object.values(dependencySignalWeights).reduce(\n (sum, value) => sum + value,\n 0,\n);\n\nconst computeDependencySignalScore = (\n ownSignals: readonly DependencyRiskSignal[],\n inheritedSignals: readonly DependencyRiskSignal[],\n inheritedSignalMultiplier: number,\n): number => {\n const ownWeight = ownSignals.reduce(\n (sum, signal) => sum + (dependencySignalWeights[signal] ?? 0),\n 0,\n );\n const inheritedWeight = inheritedSignals.reduce(\n (sum, signal) => sum + (dependencySignalWeights[signal] ?? 0),\n 0,\n );\n\n const weightedTotal = ownWeight + inheritedWeight * inheritedSignalMultiplier;\n const maxWeightedTotal = dependencySignalWeightBudget * (1 + inheritedSignalMultiplier);\n\n if (maxWeightedTotal <= 0) {\n return 0;\n }\n\n return toUnitInterval(weightedTotal / maxWeightedTotal);\n};\n\nconst clampConfidence = (value: number): number => round4(toUnitInterval(value));\n\nconst computeExternalMetadataConfidence = (external: ExternalAnalysisSummary): number => {\n if (!external.available) {\n return 0;\n }\n\n // Topology signals still exist without registry metadata, so keep a non-zero floor.\n return round4(toUnitInterval(0.35 + external.metrics.metadataCoverage * 0.65));\n};\n\nconst computeEvolutionHistoryConfidence = (\n structural: GraphAnalysisSummary,\n evolution: RepositoryEvolutionSummary,\n evolutionByFile: ReadonlyMap<string, FileEvolutionMetrics>,\n): number => {\n if (!evolution.available) {\n return 0;\n }\n\n const totalFiles = structural.files.length;\n if (totalFiles === 0) {\n return 1;\n }\n\n let coveredFiles = 0;\n for (const file of structural.files) {\n if (evolutionByFile.has(normalizePath(file.id))) {\n coveredFiles += 1;\n }\n }\n\n const coverage = coveredFiles / totalFiles;\n // Partial commit history still carries value, but confidence scales with coverage.\n return round4(toUnitInterval(0.3 + coverage * 0.7));\n};\n\nconst buildFactorTraces = (\n totalScore: number,\n inputs: readonly FactorTraceInput[],\n): readonly RiskFactorTrace[] => {\n const positiveInputs = inputs.filter((input) => input.strength > 0);\n const strengthTotal = positiveInputs.reduce((sum, input) => sum + input.strength, 0);\n\n const traces = inputs.map<RiskFactorTrace>((input) => ({\n factorId: input.factorId,\n family: input.family,\n contribution: 0,\n rawMetrics: input.rawMetrics,\n normalizedMetrics: input.normalizedMetrics,\n weight: input.weight,\n amplification: input.amplification,\n evidence: input.evidence,\n confidence: clampConfidence(input.confidence),\n }));\n\n if (strengthTotal <= 0 || totalScore <= 0) {\n return traces;\n }\n\n const scored = positiveInputs.map((input) => ({\n factorId: input.factorId,\n contribution: (totalScore * input.strength) / strengthTotal,\n }));\n\n let distributed = 0;\n for (let index = 0; index < scored.length; index += 1) {\n const current = scored[index];\n if (current === undefined) {\n continue;\n }\n\n const traceIndex = traces.findIndex((trace) => trace.factorId === current.factorId);\n if (traceIndex < 0) {\n continue;\n }\n const existing = traces[traceIndex];\n if (existing === undefined) {\n continue;\n }\n\n if (index === scored.length - 1) {\n const remaining = round4(totalScore - distributed);\n traces[traceIndex] = {\n ...existing,\n contribution: Math.max(0, remaining),\n };\n distributed += Math.max(0, remaining);\n continue;\n }\n\n const rounded = round4(current.contribution);\n traces[traceIndex] = {\n ...existing,\n contribution: rounded,\n };\n distributed += rounded;\n }\n\n return traces;\n};\n\nconst buildReductionLevers = (\n factors: readonly RiskFactorTrace[],\n): readonly { factorId: string; estimatedImpact: number }[] =>\n factors\n .filter((factor) => factor.contribution > 0)\n .sort((a, b) => b.contribution - a.contribution || a.factorId.localeCompare(b.factorId))\n .slice(0, 3)\n .map((factor) => ({\n factorId: factor.factorId,\n estimatedImpact: round4(factor.contribution),\n }));\n\nconst buildTargetTrace = (\n targetType: TargetTrace[\"targetType\"],\n targetId: string,\n totalScore: number,\n normalizedScore: number,\n factors: readonly RiskFactorTrace[],\n): TargetTrace => {\n const dominantFactors = [...factors]\n .filter((factor) => factor.contribution > 0)\n .sort((a, b) => b.contribution - a.contribution || a.factorId.localeCompare(b.factorId))\n .slice(0, 3)\n .map((factor) => factor.factorId);\n\n return {\n targetType,\n targetId,\n totalScore: round4(totalScore),\n normalizedScore: round4(normalizedScore),\n factors,\n dominantFactors,\n reductionLevers: buildReductionLevers(factors),\n };\n};\n\nconst computeDependencyScores = (\n external: ExternalAnalysisSummary,\n config: RiskEngineConfig,\n): DependencyScoreComputation => {\n if (!external.available) {\n return {\n dependencyScores: [],\n repositoryExternalPressure: 0,\n dependencyContexts: new Map(),\n };\n }\n\n const transitiveCounts = external.dependencies.map((dependency) =>\n logScale(dependency.transitiveDependencies.length),\n );\n const dependentCounts = external.dependencies.map((dependency) =>\n logScale(dependency.dependents),\n );\n const chainDepths = external.dependencies.map((dependency) => dependency.dependencyDepth);\n\n const transitiveScale = buildQuantileScale(\n transitiveCounts,\n config.quantileClamp.lower,\n config.quantileClamp.upper,\n );\n const dependentScale = buildQuantileScale(\n dependentCounts,\n config.quantileClamp.lower,\n config.quantileClamp.upper,\n );\n const chainDepthScale = buildQuantileScale(\n chainDepths,\n config.quantileClamp.lower,\n config.quantileClamp.upper,\n );\n\n const dependencyContexts = new Map<\n string,\n {\n signalScore: number;\n stalenessRisk: number;\n maintainerConcentrationRisk: number;\n transitiveBurdenRisk: number;\n centralityRisk: number;\n chainDepthRisk: number;\n busFactorRisk: number;\n popularityDampener: number;\n rawMetrics: {\n daysSinceLastRelease: number | null;\n maintainerCount: number | null;\n transitiveCount: number;\n dependents: number;\n dependencyDepth: number;\n busFactor: number | null;\n weeklyDownloads: number | null;\n };\n confidence: number;\n }\n >();\n\n const metadataConfidence = computeExternalMetadataConfidence(external);\n const dependencyScores = external.dependencies\n .map<DependencyRiskScore>((dependency) => {\n const signalScore = computeDependencySignalScore(\n dependency.ownRiskSignals,\n dependency.inheritedRiskSignals,\n config.dependencySignals.inheritedSignalMultiplier,\n );\n\n const maintainerConcentrationRisk =\n dependency.maintainerCount === null\n ? config.dependencySignals.missingMetadataPenalty\n : toUnitInterval(1 / Math.max(1, dependency.maintainerCount));\n\n const stalenessRisk =\n dependency.daysSinceLastRelease === null\n ? config.dependencySignals.missingMetadataPenalty\n : halfLifeRisk(\n dependency.daysSinceLastRelease,\n config.dependencySignals.abandonedHalfLifeDays,\n );\n\n const transitiveBurdenRisk = normalizeWithScale(\n logScale(dependency.transitiveDependencies.length),\n transitiveScale,\n );\n\n const centralityRisk = normalizeWithScale(logScale(dependency.dependents), dependentScale);\n const chainDepthRisk = normalizeWithScale(dependency.dependencyDepth, chainDepthScale);\n\n const busFactorRisk =\n dependency.busFactor === null\n ? config.dependencySignals.missingMetadataPenalty\n : toUnitInterval(1 / Math.max(1, dependency.busFactor));\n\n const weights = config.dependencyFactorWeights;\n const baseScore = toUnitInterval(\n signalScore * weights.signals +\n stalenessRisk * weights.staleness +\n maintainerConcentrationRisk * weights.maintainerConcentration +\n transitiveBurdenRisk * weights.transitiveBurden +\n centralityRisk * weights.centrality +\n chainDepthRisk * weights.chainDepth +\n busFactorRisk * weights.busFactorRisk,\n );\n\n const hasHardRiskSignal =\n dependency.ownRiskSignals.includes(\"abandoned\") ||\n dependency.ownRiskSignals.includes(\"metadata_unavailable\") ||\n dependency.ownRiskSignals.includes(\"single_maintainer\");\n\n const popularityDampener =\n dependency.weeklyDownloads === null || hasHardRiskSignal\n ? 1\n : 1 -\n halfLifeRisk(\n dependency.weeklyDownloads,\n config.dependencySignals.popularityHalfLifeDownloads,\n ) *\n config.dependencySignals.popularityMaxDampening;\n const normalizedScore = toUnitInterval(baseScore * popularityDampener);\n\n const availableMetricCount = [\n dependency.daysSinceLastRelease,\n dependency.maintainerCount,\n dependency.busFactor,\n dependency.weeklyDownloads,\n ].filter((value) => value !== null).length;\n const confidence = toUnitInterval((0.5 + availableMetricCount * 0.125) * metadataConfidence);\n\n dependencyContexts.set(dependency.name, {\n signalScore: round4(signalScore),\n stalenessRisk: round4(stalenessRisk),\n maintainerConcentrationRisk: round4(maintainerConcentrationRisk),\n transitiveBurdenRisk: round4(transitiveBurdenRisk),\n centralityRisk: round4(centralityRisk),\n chainDepthRisk: round4(chainDepthRisk),\n busFactorRisk: round4(busFactorRisk),\n popularityDampener: round4(popularityDampener),\n rawMetrics: {\n daysSinceLastRelease: dependency.daysSinceLastRelease,\n maintainerCount: dependency.maintainerCount,\n transitiveCount: dependency.transitiveDependencies.length,\n dependents: dependency.dependents,\n dependencyDepth: dependency.dependencyDepth,\n busFactor: dependency.busFactor,\n weeklyDownloads: dependency.weeklyDownloads,\n },\n confidence: round4(confidence),\n });\n\n return {\n dependency: dependency.name,\n score: round4(normalizedScore * 100),\n normalizedScore: round4(normalizedScore),\n ownRiskSignals: dependency.ownRiskSignals,\n inheritedRiskSignals: dependency.inheritedRiskSignals,\n };\n })\n .sort(\n (a, b) => b.normalizedScore - a.normalizedScore || a.dependency.localeCompare(b.dependency),\n );\n\n const normalizedValues = dependencyScores.map((score) => score.normalizedScore);\n const highDependencyRisk =\n dependencyScores.length === 0\n ? 0\n : percentile(normalizedValues, config.externalDimension.topDependencyPercentile);\n const averageDependencyRisk = average(normalizedValues);\n const depthRisk = halfLifeRisk(\n external.metrics.dependencyDepth,\n config.externalDimension.dependencyDepthHalfLife,\n );\n\n const repositoryExternalPressure = toUnitInterval(\n highDependencyRisk * 0.5 + averageDependencyRisk * 0.3 + depthRisk * 0.2,\n );\n\n return {\n dependencyScores,\n repositoryExternalPressure: round4(repositoryExternalPressure),\n dependencyContexts,\n };\n};\n\nconst mapEvolutionByFile = (\n evolution: RepositoryEvolutionSummary,\n): ReadonlyMap<string, FileEvolutionMetrics> => {\n if (!evolution.available) {\n return new Map<string, FileEvolutionMetrics>();\n }\n\n return new Map(\n evolution.files.map((fileMetrics) => [normalizePath(fileMetrics.filePath), fileMetrics]),\n );\n};\n\nconst computeEvolutionScales = (\n evolutionByFile: ReadonlyMap<string, FileEvolutionMetrics>,\n config: RiskEngineConfig,\n): MetricScales => {\n const evolutionFiles = [...evolutionByFile.values()];\n\n return {\n commitCount: buildQuantileScale(\n evolutionFiles.map((metrics) => logScale(metrics.commitCount)),\n config.quantileClamp.lower,\n config.quantileClamp.upper,\n ),\n churnTotal: buildQuantileScale(\n evolutionFiles.map((metrics) => logScale(metrics.churnTotal)),\n config.quantileClamp.lower,\n config.quantileClamp.upper,\n ),\n busFactor: buildQuantileScale(\n evolutionFiles.map((metrics) => metrics.busFactor),\n config.quantileClamp.lower,\n config.quantileClamp.upper,\n ),\n };\n};\n\nconst inferModuleName = (filePath: string, config: RiskEngineConfig): string => {\n const normalized = normalizePath(filePath);\n const parts = normalized.split(\"/\").filter((part) => part.length > 0);\n\n if (parts.length <= 1) {\n return config.module.rootLabel;\n }\n\n const first = parts[0];\n if (first === undefined) {\n return config.module.rootLabel;\n }\n\n if (!config.module.commonSourceRoots.includes(first)) {\n return first;\n }\n\n if (parts.length <= config.module.maxPrefixSegments) {\n return first;\n }\n\n return parts.slice(0, config.module.maxPrefixSegments).join(\"/\");\n};\n\nconst buildFragileClusters = (\n structural: GraphAnalysisSummary,\n evolution: RepositoryEvolutionSummary,\n fileScoresByFile: ReadonlyMap<string, FileRiskScore>,\n config: RiskEngineConfig,\n): readonly FragileCluster[] => {\n const clusters: FragileCluster[] = [];\n\n let cycleClusterCount = 0;\n for (const cycle of structural.cycles) {\n const files = [...new Set(cycle.nodes.map((node) => normalizePath(node)))].filter((filePath) =>\n fileScoresByFile.has(filePath),\n );\n\n if (files.length < 2) {\n continue;\n }\n\n files.sort((a, b) => a.localeCompare(b));\n\n const averageRisk = average(\n files.map((filePath) => fileScoresByFile.get(filePath)?.normalizedScore ?? 0),\n );\n\n const cycleSizeRisk = toUnitInterval((files.length - 1) / 5);\n const score = round4(toUnitInterval(averageRisk * 0.75 + cycleSizeRisk * 0.25) * 100);\n\n cycleClusterCount += 1;\n clusters.push({\n id: `cycle:${cycleClusterCount}`,\n kind: \"structural_cycle\",\n files,\n score,\n });\n }\n\n if (evolution.available && evolution.coupling.pairs.length > 0) {\n const candidates = evolution.coupling.pairs.filter(\n (pair) => pair.coChangeCommits >= config.couplingCluster.minCoChangeCommits,\n );\n\n const threshold = Math.max(\n config.couplingCluster.floorScore,\n percentile(\n candidates.map((pair) => pair.couplingScore),\n config.couplingCluster.percentileThreshold,\n ),\n );\n\n const selectedPairs = candidates\n .filter((pair) => pair.couplingScore >= threshold)\n .map((pair) => ({\n fileA: normalizePath(pair.fileA),\n fileB: normalizePath(pair.fileB),\n couplingScore: pair.couplingScore,\n }))\n .filter(\n (pair) =>\n pair.fileA !== pair.fileB &&\n fileScoresByFile.has(pair.fileA) &&\n fileScoresByFile.has(pair.fileB),\n );\n\n const adjacency = new Map<string, Set<string>>();\n for (const pair of selectedPairs) {\n const aNeighbors = adjacency.get(pair.fileA) ?? new Set<string>();\n aNeighbors.add(pair.fileB);\n adjacency.set(pair.fileA, aNeighbors);\n\n const bNeighbors = adjacency.get(pair.fileB) ?? new Set<string>();\n bNeighbors.add(pair.fileA);\n adjacency.set(pair.fileB, bNeighbors);\n }\n\n const visited = new Set<string>();\n let couplingClusterCount = 0;\n\n const orderedStarts = [...adjacency.keys()].sort((a, b) => a.localeCompare(b));\n for (const start of orderedStarts) {\n if (visited.has(start)) {\n continue;\n }\n\n const stack = [start];\n const files: string[] = [];\n\n while (stack.length > 0) {\n const current = stack.pop();\n if (current === undefined || visited.has(current)) {\n continue;\n }\n\n visited.add(current);\n files.push(current);\n\n const neighbors = adjacency.get(current);\n if (neighbors === undefined) {\n continue;\n }\n\n for (const neighbor of neighbors) {\n if (!visited.has(neighbor)) {\n stack.push(neighbor);\n }\n }\n }\n\n if (files.length < 2) {\n continue;\n }\n\n files.sort((a, b) => a.localeCompare(b));\n const fileSet = new Set(files);\n const componentPairs = selectedPairs.filter(\n (pair) => fileSet.has(pair.fileA) && fileSet.has(pair.fileB),\n );\n\n const meanFileRisk = average(\n files.map((filePath) => fileScoresByFile.get(filePath)?.normalizedScore ?? 0),\n );\n const meanCoupling = average(componentPairs.map((pair) => pair.couplingScore));\n\n const score = round4(toUnitInterval(meanFileRisk * 0.65 + meanCoupling * 0.35) * 100);\n\n couplingClusterCount += 1;\n clusters.push({\n id: `coupling:${couplingClusterCount}`,\n kind: \"change_coupling\",\n files,\n score,\n });\n }\n }\n\n return clusters.sort(\n (a, b) => b.score - a.score || a.kind.localeCompare(b.kind) || a.id.localeCompare(b.id),\n );\n};\n\nexport const computeRiskSummary = (\n structural: GraphAnalysisSummary,\n evolution: RepositoryEvolutionSummary,\n external: ExternalAnalysisSummary,\n config: RiskEngineConfig,\n traceCollector?: TraceCollector,\n): RepositoryRiskSummary => {\n const collector = traceCollector;\n const dependencyComputation = computeDependencyScores(external, config);\n const externalMetadataConfidence = computeExternalMetadataConfidence(external);\n const evolutionByFile = mapEvolutionByFile(evolution);\n const evolutionHistoryConfidence = computeEvolutionHistoryConfidence(\n structural,\n evolution,\n evolutionByFile,\n );\n const evolutionScales = computeEvolutionScales(evolutionByFile, config);\n\n const cycleFileSet = new Set(\n structural.cycles.flatMap((cycle) => cycle.nodes.map((node) => normalizePath(node))),\n );\n\n const fanInScale = buildQuantileScale(\n structural.files.map((file) => logScale(file.fanIn)),\n config.quantileClamp.lower,\n config.quantileClamp.upper,\n );\n const fanOutScale = buildQuantileScale(\n structural.files.map((file) => logScale(file.fanOut)),\n config.quantileClamp.lower,\n config.quantileClamp.upper,\n );\n const depthScale = buildQuantileScale(\n structural.files.map((file) => file.depth),\n config.quantileClamp.lower,\n config.quantileClamp.upper,\n );\n\n const dimensionWeights = normalizeWeights(config.dimensionWeights, {\n structural: true,\n evolution: evolution.available,\n external: external.available,\n });\n\n const fileRiskContexts = structural.files\n .map<FileRiskContext>((file) => {\n const filePath = normalizePath(file.id);\n const inCycle = cycleFileSet.has(filePath) ? 1 : 0;\n\n const fanInRisk = normalizeWithScale(logScale(file.fanIn), fanInScale);\n const fanOutRisk = normalizeWithScale(logScale(file.fanOut), fanOutScale);\n const depthRisk = normalizeWithScale(file.depth, depthScale);\n\n const structuralWeights = config.structuralFactorWeights;\n const structuralFactorRaw = toUnitInterval(\n fanInRisk * structuralWeights.fanIn +\n fanOutRisk * structuralWeights.fanOut +\n depthRisk * structuralWeights.depth +\n inCycle * structuralWeights.cycleParticipation,\n );\n\n const structuralCentralityRaw = toUnitInterval((fanInRisk + fanOutRisk) / 2);\n\n let evolutionFactor = 0;\n let frequencyRisk = 0;\n let churnRisk = 0;\n let volatilityRisk = 0;\n let ownershipConcentrationRisk = 0;\n let busFactorRisk = 0;\n const evolutionMetrics = evolutionByFile.get(filePath);\n if (evolution.available && evolutionMetrics !== undefined) {\n frequencyRisk = normalizeWithScale(\n logScale(evolutionMetrics.commitCount),\n evolutionScales.commitCount,\n );\n churnRisk = normalizeWithScale(\n logScale(evolutionMetrics.churnTotal),\n evolutionScales.churnTotal,\n );\n volatilityRisk = toUnitInterval(evolutionMetrics.recentVolatility);\n ownershipConcentrationRisk = toUnitInterval(evolutionMetrics.topAuthorShare);\n busFactorRisk = toUnitInterval(\n 1 - normalizeWithScale(evolutionMetrics.busFactor, evolutionScales.busFactor),\n );\n\n const evolutionWeights = config.evolutionFactorWeights;\n evolutionFactor = toUnitInterval(\n frequencyRisk * evolutionWeights.frequency +\n churnRisk * evolutionWeights.churn +\n volatilityRisk * evolutionWeights.recentVolatility +\n ownershipConcentrationRisk * evolutionWeights.ownershipConcentration +\n busFactorRisk * evolutionWeights.busFactorRisk,\n );\n }\n\n const structuralAttenuation = computeAggregatorAttenuation({\n fanIn: file.fanIn,\n fanOut: file.fanOut,\n inCycle,\n evolutionMetrics,\n config: config.aggregatorAttenuation,\n });\n const structuralFactor = toUnitInterval(structuralFactorRaw * structuralAttenuation);\n const structuralCentrality = toUnitInterval(structuralCentralityRaw * structuralAttenuation);\n\n const dependencyAffinity = toUnitInterval(structuralCentrality * 0.6 + evolutionFactor * 0.4);\n const externalFactor = external.available\n ? toUnitInterval(dependencyComputation.repositoryExternalPressure * dependencyAffinity)\n : 0;\n\n const structuralBase = structuralFactor * dimensionWeights.structural;\n const evolutionBase = evolutionFactor * dimensionWeights.evolution;\n const externalBase = externalFactor * dimensionWeights.external;\n const baseline = structuralBase + evolutionBase + externalBase;\n\n const interactionStructuralEvolution =\n structuralFactor * evolutionFactor * config.interactionWeights.structuralEvolution;\n const interactionCentralInstability =\n structuralCentrality * evolutionFactor * config.interactionWeights.centralInstability;\n const interactionDependencyAmplification =\n externalFactor *\n Math.max(structuralFactor, evolutionFactor) *\n config.interactionWeights.dependencyAmplification;\n\n const interactions = [\n interactionStructuralEvolution,\n interactionCentralInstability,\n interactionDependencyAmplification,\n ];\n\n const normalizedScore = saturatingComposite(baseline, interactions);\n\n return {\n file: filePath,\n score: round4(normalizedScore * 100),\n normalizedScore: round4(normalizedScore),\n factors: {\n structural: round4(structuralFactor),\n evolution: round4(evolutionFactor),\n external: round4(externalFactor),\n },\n structuralCentrality: round4(structuralCentrality),\n traceTerms: {\n structuralBase: round4(structuralBase),\n evolutionBase: round4(evolutionBase),\n externalBase: round4(externalBase),\n interactionStructuralEvolution: round4(interactionStructuralEvolution),\n interactionCentralInstability: round4(interactionCentralInstability),\n interactionDependencyAmplification: round4(interactionDependencyAmplification),\n },\n rawMetrics: {\n fanIn: file.fanIn,\n fanOut: file.fanOut,\n depth: file.depth,\n cycleParticipation: inCycle,\n commitCount: evolutionMetrics?.commitCount ?? null,\n churnTotal: evolutionMetrics?.churnTotal ?? null,\n recentVolatility: evolutionMetrics?.recentVolatility ?? null,\n topAuthorShare: evolutionMetrics?.topAuthorShare ?? null,\n busFactor: evolutionMetrics?.busFactor ?? null,\n dependencyAffinity: round4(dependencyAffinity),\n repositoryExternalPressure: round4(dependencyComputation.repositoryExternalPressure),\n structuralAttenuation: round4(structuralAttenuation),\n },\n normalizedMetrics: {\n fanInRisk: round4(fanInRisk),\n fanOutRisk: round4(fanOutRisk),\n depthRisk: round4(depthRisk),\n frequencyRisk: round4(frequencyRisk),\n churnRisk: round4(churnRisk),\n volatilityRisk: round4(volatilityRisk),\n ownershipConcentrationRisk: round4(ownershipConcentrationRisk),\n busFactorRisk: round4(busFactorRisk),\n },\n };\n })\n .sort((a, b) => b.score - a.score || a.file.localeCompare(b.file));\n\n const fileScores: FileRiskScore[] = fileRiskContexts.map((context) => ({\n file: context.file,\n score: context.score,\n normalizedScore: context.normalizedScore,\n factors: context.factors,\n }));\n\n if (collector !== undefined) {\n for (const context of fileRiskContexts) {\n const evidence: EvidenceRef[] = [\n { kind: \"file_metric\", target: context.file, metric: \"fanIn\" },\n { kind: \"file_metric\", target: context.file, metric: \"fanOut\" },\n { kind: \"file_metric\", target: context.file, metric: \"depth\" },\n ];\n\n if (context.rawMetrics.cycleParticipation > 0) {\n evidence.push({\n kind: \"graph_cycle\",\n cycleId: `file:${context.file}`,\n files: [context.file],\n });\n }\n\n const fileFactors = buildFactorTraces(context.score, [\n {\n factorId: \"file.structural\",\n family: \"structural\",\n strength: context.traceTerms.structuralBase,\n rawMetrics: {\n fanIn: context.rawMetrics.fanIn,\n fanOut: context.rawMetrics.fanOut,\n depth: context.rawMetrics.depth,\n cycleParticipation: context.rawMetrics.cycleParticipation,\n structuralAttenuation: context.rawMetrics.structuralAttenuation,\n },\n normalizedMetrics: {\n fanInRisk: context.normalizedMetrics.fanInRisk,\n fanOutRisk: context.normalizedMetrics.fanOutRisk,\n depthRisk: context.normalizedMetrics.depthRisk,\n structuralFactor: context.factors.structural,\n },\n weight: dimensionWeights.structural,\n amplification: null,\n evidence,\n confidence: 1,\n },\n {\n factorId: \"file.evolution\",\n family: \"evolution\",\n strength: context.traceTerms.evolutionBase,\n rawMetrics: {\n commitCount: context.rawMetrics.commitCount,\n churnTotal: context.rawMetrics.churnTotal,\n recentVolatility: context.rawMetrics.recentVolatility,\n topAuthorShare: context.rawMetrics.topAuthorShare,\n busFactor: context.rawMetrics.busFactor,\n },\n normalizedMetrics: {\n frequencyRisk: context.normalizedMetrics.frequencyRisk,\n churnRisk: context.normalizedMetrics.churnRisk,\n volatilityRisk: context.normalizedMetrics.volatilityRisk,\n ownershipConcentrationRisk: context.normalizedMetrics.ownershipConcentrationRisk,\n busFactorRisk: context.normalizedMetrics.busFactorRisk,\n evolutionFactor: context.factors.evolution,\n },\n weight: dimensionWeights.evolution,\n amplification: null,\n evidence: [{ kind: \"file_metric\", target: context.file, metric: \"commitCount\" }],\n confidence: evolution.available\n ? evolutionHistoryConfidence * (context.rawMetrics.commitCount === null ? 0.5 : 1)\n : 0,\n },\n {\n factorId: \"file.external\",\n family: \"external\",\n strength: context.traceTerms.externalBase,\n rawMetrics: {\n repositoryExternalPressure: context.rawMetrics.repositoryExternalPressure,\n dependencyAffinity: context.rawMetrics.dependencyAffinity,\n },\n normalizedMetrics: {\n externalFactor: context.factors.external,\n },\n weight: dimensionWeights.external,\n amplification: null,\n evidence: [{ kind: \"repository_metric\", metric: \"repositoryExternalPressure\" }],\n confidence: external.available ? 0.7 * externalMetadataConfidence : 0,\n },\n {\n factorId: \"file.composite.interactions\",\n family: \"composite\",\n strength:\n context.traceTerms.interactionStructuralEvolution +\n context.traceTerms.interactionCentralInstability +\n context.traceTerms.interactionDependencyAmplification,\n rawMetrics: {\n structuralEvolutionInteraction: context.traceTerms.interactionStructuralEvolution,\n centralInstabilityInteraction: context.traceTerms.interactionCentralInstability,\n dependencyAmplificationInteraction:\n context.traceTerms.interactionDependencyAmplification,\n },\n normalizedMetrics: {},\n weight: null,\n amplification:\n config.interactionWeights.structuralEvolution +\n config.interactionWeights.centralInstability +\n config.interactionWeights.dependencyAmplification,\n evidence: [{ kind: \"repository_metric\", metric: \"interactionWeights\" }],\n confidence: 0.9,\n },\n ]);\n\n collector.record(\n buildTargetTrace(\"file\", context.file, context.score, context.normalizedScore, fileFactors),\n );\n }\n }\n\n const fileScoresByFile = new Map(fileScores.map((fileScore) => [fileScore.file, fileScore]));\n\n const hotspotsCount = Math.min(\n config.hotspotMaxFiles,\n Math.max(config.hotspotMinFiles, Math.ceil(fileScores.length * config.hotspotTopPercent)),\n );\n\n const hotspots = fileScores.slice(0, hotspotsCount).map((fileScore) => ({\n file: fileScore.file,\n score: fileScore.score,\n factors: fileScore.factors,\n }));\n\n const moduleFiles = new Map<string, number[]>();\n for (const fileScore of fileScores) {\n const moduleName = inferModuleName(fileScore.file, config);\n const values = moduleFiles.get(moduleName) ?? [];\n values.push(fileScore.normalizedScore);\n moduleFiles.set(moduleName, values);\n }\n\n const moduleScores: ModuleRiskScore[] = [...moduleFiles.entries()]\n .map(([module, values]) => {\n const averageScore = average(values);\n const peakScore = values.reduce((max, value) => Math.max(max, value), 0);\n const normalizedScore = toUnitInterval(averageScore * 0.65 + peakScore * 0.35);\n\n return {\n module,\n score: round4(normalizedScore * 100),\n normalizedScore: round4(normalizedScore),\n fileCount: values.length,\n };\n })\n .sort((a, b) => b.score - a.score || a.module.localeCompare(b.module));\n\n if (collector !== undefined) {\n for (const [module, values] of moduleFiles.entries()) {\n const averageScore = average(values);\n const peakScore = values.reduce((max, value) => Math.max(max, value), 0);\n const normalizedScore = toUnitInterval(averageScore * 0.65 + peakScore * 0.35);\n const totalScore = round4(normalizedScore * 100);\n const factors = buildFactorTraces(totalScore, [\n {\n factorId: \"module.average_file_risk\",\n family: \"composite\",\n strength: averageScore * 0.65,\n rawMetrics: { averageFileRisk: round4(averageScore), fileCount: values.length },\n normalizedMetrics: { normalizedModuleRisk: round4(normalizedScore) },\n weight: 0.65,\n amplification: null,\n evidence: [{ kind: \"repository_metric\", metric: \"moduleAggregation.average\" }],\n confidence: 1,\n },\n {\n factorId: \"module.peak_file_risk\",\n family: \"composite\",\n strength: peakScore * 0.35,\n rawMetrics: { peakFileRisk: round4(peakScore), fileCount: values.length },\n normalizedMetrics: { normalizedModuleRisk: round4(normalizedScore) },\n weight: 0.35,\n amplification: null,\n evidence: [{ kind: \"repository_metric\", metric: \"moduleAggregation.peak\" }],\n confidence: 1,\n },\n ]);\n\n collector.record(buildTargetTrace(\"module\", module, totalScore, normalizedScore, factors));\n }\n }\n\n const fragileClusters = buildFragileClusters(structural, evolution, fileScoresByFile, config);\n\n const externalPressures = fileScores.map((fileScore) => fileScore.factors.external);\n const pressureThreshold = Math.max(\n config.amplificationZone.pressureFloor,\n percentile(externalPressures, config.amplificationZone.percentileThreshold),\n );\n\n const dependencyAmplificationZones = fileScores\n .map((fileScore) => {\n const intensity = toUnitInterval(\n fileScore.factors.external *\n Math.max(fileScore.factors.structural, fileScore.factors.evolution),\n );\n const normalizedZoneScore = toUnitInterval(intensity * 0.7 + fileScore.normalizedScore * 0.3);\n\n return {\n file: fileScore.file,\n score: round4(normalizedZoneScore * 100),\n externalPressure: fileScore.factors.external,\n };\n })\n .filter((zone) => external.available && zone.externalPressure >= pressureThreshold)\n .sort((a, b) => b.score - a.score || a.file.localeCompare(b.file))\n .slice(0, config.amplificationZone.maxZones)\n .map((zone) => ({\n ...zone,\n externalPressure: round4(zone.externalPressure),\n }));\n\n if (collector !== undefined && external.available) {\n const dependencyByName = new Map(\n external.dependencies.map((dependency) => [dependency.name, dependency]),\n );\n for (const dependencyScore of dependencyComputation.dependencyScores) {\n const dependency = dependencyByName.get(dependencyScore.dependency);\n const context = dependencyComputation.dependencyContexts.get(dependencyScore.dependency);\n if (dependency === undefined || context === undefined) {\n continue;\n }\n\n const hasMetadata =\n context.rawMetrics.daysSinceLastRelease !== null &&\n context.rawMetrics.maintainerCount !== null;\n const factors = buildFactorTraces(dependencyScore.score, [\n {\n factorId: \"dependency.signals\",\n family: \"external\",\n strength: context.signalScore * config.dependencyFactorWeights.signals,\n rawMetrics: {\n ownSignals: dependency.ownRiskSignals.length,\n inheritedSignals: dependency.inheritedRiskSignals.length,\n },\n normalizedMetrics: { signalScore: context.signalScore },\n weight: config.dependencyFactorWeights.signals,\n amplification: config.dependencySignals.inheritedSignalMultiplier,\n evidence: [{ kind: \"dependency_metric\", target: dependency.name, metric: \"riskSignals\" }],\n confidence: 0.95 * externalMetadataConfidence,\n },\n {\n factorId: \"dependency.staleness\",\n family: \"external\",\n strength: context.stalenessRisk * config.dependencyFactorWeights.staleness,\n rawMetrics: { daysSinceLastRelease: context.rawMetrics.daysSinceLastRelease },\n normalizedMetrics: { stalenessRisk: context.stalenessRisk },\n weight: config.dependencyFactorWeights.staleness,\n amplification: null,\n evidence: [\n { kind: \"dependency_metric\", target: dependency.name, metric: \"daysSinceLastRelease\" },\n ],\n confidence: (hasMetadata ? 0.9 : 0.5) * externalMetadataConfidence,\n },\n {\n factorId: \"dependency.maintainer_concentration\",\n family: \"external\",\n strength:\n context.maintainerConcentrationRisk *\n config.dependencyFactorWeights.maintainerConcentration,\n rawMetrics: { maintainerCount: context.rawMetrics.maintainerCount },\n normalizedMetrics: {\n maintainerConcentrationRisk: context.maintainerConcentrationRisk,\n },\n weight: config.dependencyFactorWeights.maintainerConcentration,\n amplification: null,\n evidence: [\n { kind: \"dependency_metric\", target: dependency.name, metric: \"maintainerCount\" },\n ],\n confidence: (hasMetadata ? 0.9 : 0.5) * externalMetadataConfidence,\n },\n {\n factorId: \"dependency.topology\",\n family: \"external\",\n strength:\n context.transitiveBurdenRisk * config.dependencyFactorWeights.transitiveBurden +\n context.centralityRisk * config.dependencyFactorWeights.centrality +\n context.chainDepthRisk * config.dependencyFactorWeights.chainDepth,\n rawMetrics: {\n transitiveCount: context.rawMetrics.transitiveCount,\n dependents: context.rawMetrics.dependents,\n dependencyDepth: context.rawMetrics.dependencyDepth,\n },\n normalizedMetrics: {\n transitiveBurdenRisk: context.transitiveBurdenRisk,\n centralityRisk: context.centralityRisk,\n chainDepthRisk: context.chainDepthRisk,\n },\n weight:\n config.dependencyFactorWeights.transitiveBurden +\n config.dependencyFactorWeights.centrality +\n config.dependencyFactorWeights.chainDepth,\n amplification: null,\n evidence: [\n { kind: \"dependency_metric\", target: dependency.name, metric: \"dependencyDepth\" },\n ],\n confidence: 1 * externalMetadataConfidence,\n },\n {\n factorId: \"dependency.bus_factor\",\n family: \"external\",\n strength: context.busFactorRisk * config.dependencyFactorWeights.busFactorRisk,\n rawMetrics: { busFactor: context.rawMetrics.busFactor },\n normalizedMetrics: { busFactorRisk: context.busFactorRisk },\n weight: config.dependencyFactorWeights.busFactorRisk,\n amplification: null,\n evidence: [{ kind: \"dependency_metric\", target: dependency.name, metric: \"busFactor\" }],\n confidence:\n (context.rawMetrics.busFactor === null ? 0.5 : 0.85) * externalMetadataConfidence,\n },\n {\n factorId: \"dependency.popularity_dampening\",\n family: \"composite\",\n strength: 1 - context.popularityDampener,\n rawMetrics: { weeklyDownloads: context.rawMetrics.weeklyDownloads },\n normalizedMetrics: { popularityDampener: context.popularityDampener },\n weight: config.dependencySignals.popularityMaxDampening,\n amplification: null,\n evidence: [\n { kind: \"dependency_metric\", target: dependency.name, metric: \"weeklyDownloads\" },\n ],\n confidence:\n (context.rawMetrics.weeklyDownloads === null ? 0.4 : 0.9) * externalMetadataConfidence,\n },\n ]);\n\n collector.record(\n buildTargetTrace(\n \"dependency\",\n dependencyScore.dependency,\n dependencyScore.score,\n dependencyScore.normalizedScore,\n factors,\n ),\n );\n }\n }\n\n const structuralDimension = average(fileScores.map((fileScore) => fileScore.factors.structural));\n const evolutionDimension = average(fileScores.map((fileScore) => fileScore.factors.evolution));\n const externalDimension = dependencyComputation.repositoryExternalPressure;\n\n const topCentralSlice = Math.max(1, Math.ceil(fileRiskContexts.length * 0.1));\n const criticalInstability = average(\n [...fileRiskContexts]\n .sort(\n (a, b) =>\n b.structuralCentrality * b.factors.evolution -\n a.structuralCentrality * a.factors.evolution || a.file.localeCompare(b.file),\n )\n .slice(0, topCentralSlice)\n .map((context) => context.structuralCentrality * context.factors.evolution),\n );\n\n const dependencyAmplification = average(\n dependencyAmplificationZones.map((zone) =>\n toUnitInterval((zone.externalPressure * zone.score) / 100),\n ),\n );\n\n const repositoryBaseline =\n structuralDimension * dimensionWeights.structural +\n evolutionDimension * dimensionWeights.evolution +\n externalDimension * dimensionWeights.external;\n\n const repositoryNormalizedScore = saturatingComposite(repositoryBaseline, [\n structuralDimension * evolutionDimension * config.interactionWeights.structuralEvolution,\n criticalInstability * config.interactionWeights.centralInstability,\n dependencyAmplification * config.interactionWeights.dependencyAmplification,\n ]);\n\n const riskScore = round4(repositoryNormalizedScore * 100);\n\n if (collector !== undefined) {\n const repositoryFactors = buildFactorTraces(riskScore, [\n {\n factorId: \"repository.structural\",\n family: \"structural\",\n strength: structuralDimension * dimensionWeights.structural,\n rawMetrics: { structuralDimension: round4(structuralDimension) },\n normalizedMetrics: { dimensionWeight: round4(dimensionWeights.structural) },\n weight: dimensionWeights.structural,\n amplification: null,\n evidence: [{ kind: \"repository_metric\", metric: \"structuralDimension\" }],\n confidence: 1,\n },\n {\n factorId: \"repository.evolution\",\n family: \"evolution\",\n strength: evolutionDimension * dimensionWeights.evolution,\n rawMetrics: { evolutionDimension: round4(evolutionDimension) },\n normalizedMetrics: { dimensionWeight: round4(dimensionWeights.evolution) },\n weight: dimensionWeights.evolution,\n amplification: null,\n evidence: [{ kind: \"repository_metric\", metric: \"evolutionDimension\" }],\n confidence: evolution.available ? evolutionHistoryConfidence : 0,\n },\n {\n factorId: \"repository.external\",\n family: \"external\",\n strength: externalDimension * dimensionWeights.external,\n rawMetrics: { externalDimension: round4(externalDimension) },\n normalizedMetrics: { dimensionWeight: round4(dimensionWeights.external) },\n weight: dimensionWeights.external,\n amplification: null,\n evidence: [{ kind: \"repository_metric\", metric: \"externalDimension\" }],\n confidence: external.available ? 0.8 * externalMetadataConfidence : 0,\n },\n {\n factorId: \"repository.composite.interactions\",\n family: \"composite\",\n strength:\n structuralDimension * evolutionDimension * config.interactionWeights.structuralEvolution +\n criticalInstability * config.interactionWeights.centralInstability +\n dependencyAmplification * config.interactionWeights.dependencyAmplification,\n rawMetrics: {\n structuralEvolution: round4(\n structuralDimension *\n evolutionDimension *\n config.interactionWeights.structuralEvolution,\n ),\n centralInstability: round4(\n criticalInstability * config.interactionWeights.centralInstability,\n ),\n dependencyAmplification: round4(\n dependencyAmplification * config.interactionWeights.dependencyAmplification,\n ),\n },\n normalizedMetrics: {\n criticalInstability: round4(criticalInstability),\n dependencyAmplification: round4(dependencyAmplification),\n },\n weight: null,\n amplification:\n config.interactionWeights.structuralEvolution +\n config.interactionWeights.centralInstability +\n config.interactionWeights.dependencyAmplification,\n evidence: [{ kind: \"repository_metric\", metric: \"interactionTerms\" }],\n confidence: 0.9,\n },\n ]);\n\n collector.record(\n buildTargetTrace(\n \"repository\",\n structural.targetPath,\n riskScore,\n repositoryNormalizedScore,\n repositoryFactors,\n ),\n );\n }\n\n return {\n riskScore,\n normalizedScore: round4(repositoryNormalizedScore),\n hotspots,\n fragileClusters,\n dependencyAmplificationZones,\n fileScores,\n moduleScores,\n dependencyScores: dependencyComputation.dependencyScores,\n };\n};\n","import type { RiskTrace, TargetTrace } from \"@codesentinel/core\";\n\nexport interface TraceCollector {\n record(target: TargetTrace): void;\n build(): RiskTrace | undefined;\n}\n\nclass NoopTraceCollector implements TraceCollector {\n record(_target: TargetTrace): void {}\n\n build(): undefined {\n return undefined;\n }\n}\n\nclass RecordingTraceCollector implements TraceCollector {\n private readonly targets: TargetTrace[] = [];\n\n record(target: TargetTrace): void {\n this.targets.push(target);\n }\n\n build(): RiskTrace {\n const orderedTargets = [...this.targets].sort((a, b) => {\n if (a.targetType !== b.targetType) {\n return a.targetType.localeCompare(b.targetType);\n }\n\n if (b.totalScore !== a.totalScore) {\n return b.totalScore - a.totalScore;\n }\n\n return a.targetId.localeCompare(b.targetId);\n });\n\n return {\n schemaVersion: \"1\",\n contributionTolerance: 0.0001,\n targets: orderedTargets,\n };\n }\n}\n\nconst noopCollectorSingleton = new NoopTraceCollector();\n\nexport const createTraceCollector = (enabled: boolean): TraceCollector =>\n enabled ? new RecordingTraceCollector() : noopCollectorSingleton;\n","import type {\n ExternalAnalysisSummary,\n GraphAnalysisSummary,\n RepositoryRiskEvaluation,\n RepositoryEvolutionSummary,\n RepositoryRiskSummary,\n} from \"@codesentinel/core\";\nimport { DEFAULT_RISK_ENGINE_CONFIG, type RiskEngineConfig } from \"../config.js\";\nimport { computeRiskSummary } from \"../domain/risk-model.js\";\nimport { createTraceCollector } from \"../domain/trace-collector.js\";\n\ntype DeepPartial<T> = {\n [K in keyof T]?: T[K] extends readonly unknown[]\n ? T[K]\n : T[K] extends object\n ? DeepPartial<T[K]>\n : T[K];\n};\n\nexport type ComputeRepositoryRiskSummaryInput = {\n structural: GraphAnalysisSummary;\n evolution: RepositoryEvolutionSummary;\n external: ExternalAnalysisSummary;\n config?: DeepPartial<RiskEngineConfig>;\n};\n\nexport type EvaluateRepositoryRiskOptions = {\n explain?: boolean;\n};\n\nconst mergeConfig = (overrides: DeepPartial<RiskEngineConfig> | undefined): RiskEngineConfig => {\n if (overrides === undefined) {\n return DEFAULT_RISK_ENGINE_CONFIG;\n }\n\n return {\n ...DEFAULT_RISK_ENGINE_CONFIG,\n ...overrides,\n dimensionWeights: {\n ...DEFAULT_RISK_ENGINE_CONFIG.dimensionWeights,\n ...overrides.dimensionWeights,\n },\n interactionWeights: {\n ...DEFAULT_RISK_ENGINE_CONFIG.interactionWeights,\n ...overrides.interactionWeights,\n },\n structuralFactorWeights: {\n ...DEFAULT_RISK_ENGINE_CONFIG.structuralFactorWeights,\n ...overrides.structuralFactorWeights,\n },\n evolutionFactorWeights: {\n ...DEFAULT_RISK_ENGINE_CONFIG.evolutionFactorWeights,\n ...overrides.evolutionFactorWeights,\n },\n dependencyFactorWeights: {\n ...DEFAULT_RISK_ENGINE_CONFIG.dependencyFactorWeights,\n ...overrides.dependencyFactorWeights,\n },\n quantileClamp: {\n ...DEFAULT_RISK_ENGINE_CONFIG.quantileClamp,\n ...overrides.quantileClamp,\n },\n couplingCluster: {\n ...DEFAULT_RISK_ENGINE_CONFIG.couplingCluster,\n ...overrides.couplingCluster,\n },\n amplificationZone: {\n ...DEFAULT_RISK_ENGINE_CONFIG.amplificationZone,\n ...overrides.amplificationZone,\n },\n module: {\n ...DEFAULT_RISK_ENGINE_CONFIG.module,\n ...overrides.module,\n },\n dependencySignals: {\n ...DEFAULT_RISK_ENGINE_CONFIG.dependencySignals,\n ...overrides.dependencySignals,\n },\n externalDimension: {\n ...DEFAULT_RISK_ENGINE_CONFIG.externalDimension,\n ...overrides.externalDimension,\n },\n aggregatorAttenuation: {\n ...DEFAULT_RISK_ENGINE_CONFIG.aggregatorAttenuation,\n ...overrides.aggregatorAttenuation,\n },\n };\n};\n\nexport const computeRepositoryRiskSummary = (\n input: ComputeRepositoryRiskSummaryInput,\n): RepositoryRiskSummary => {\n return evaluateRepositoryRisk(input, { explain: false }).summary;\n};\n\nexport const evaluateRepositoryRisk = (\n input: ComputeRepositoryRiskSummaryInput,\n options: EvaluateRepositoryRiskOptions = {},\n): RepositoryRiskEvaluation => {\n const config = mergeConfig(input.config);\n const collector = createTraceCollector(options.explain === true);\n const summary = computeRiskSummary(\n input.structural,\n input.evolution,\n input.external,\n config,\n collector,\n );\n\n const trace = collector.build();\n if (options.explain !== true) {\n return { summary };\n }\n\n if (trace === undefined) {\n return { summary };\n }\n\n return {\n summary,\n trace,\n };\n};\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport {\n GovernanceConfigurationError,\n evaluateGates,\n renderCheckMarkdown,\n renderCheckText,\n type GateConfig,\n type GateEvaluationResult,\n} from \"@codesentinel/governance\";\nimport { compareSnapshots, parseSnapshot, type CodeSentinelSnapshot } from \"@codesentinel/reporter\";\nimport { buildAnalysisSnapshot } from \"./build-analysis-snapshot.js\";\nimport { createSilentLogger, type Logger } from \"./logger.js\";\nimport type { AuthorIdentityCliMode, ScoringProfileCliMode } from \"./run-analyze-command.js\";\n\nexport type CheckOutputFormat = \"json\" | \"text\" | \"md\";\n\nexport type RunCheckCommandOptions = {\n baselinePath?: string;\n includeTrace: boolean;\n recentWindowDays?: number;\n scoringProfile?: ScoringProfileCliMode;\n gateConfig: GateConfig;\n outputFormat: CheckOutputFormat;\n outputPath?: string;\n};\n\nexport type CheckCommandResult = {\n current: CodeSentinelSnapshot;\n baseline?: CodeSentinelSnapshot;\n diff?: ReturnType<typeof compareSnapshots>;\n gateResult: GateEvaluationResult;\n rendered: string;\n};\n\nconst formatCheckResult = (result: CheckCommandResult, format: CheckOutputFormat): string => {\n if (format === \"json\") {\n return JSON.stringify(\n {\n current: result.current,\n ...(result.baseline === undefined ? {} : { baseline: result.baseline }),\n ...(result.diff === undefined ? {} : { diff: result.diff }),\n violations: result.gateResult.violations,\n evaluatedGates: result.gateResult.evaluatedGates,\n highestSeverity: result.gateResult.highestSeverity,\n exitCode: result.gateResult.exitCode,\n },\n null,\n 2,\n );\n }\n\n if (format === \"md\") {\n return renderCheckMarkdown(result.current, result.gateResult);\n }\n\n return renderCheckText(result.current, result.gateResult);\n};\n\nexport const runCheckCommand = async (\n inputPath: string | undefined,\n authorIdentityMode: AuthorIdentityCliMode,\n options: RunCheckCommandOptions,\n logger: Logger = createSilentLogger(),\n): Promise<CheckCommandResult> => {\n logger.info(\"building current snapshot for check\");\n const current = await buildAnalysisSnapshot(\n inputPath,\n authorIdentityMode,\n {\n includeTrace: options.includeTrace,\n ...(options.scoringProfile === undefined ? {} : { scoringProfile: options.scoringProfile }),\n ...(options.recentWindowDays === undefined\n ? {}\n : { recentWindowDays: options.recentWindowDays }),\n },\n logger,\n );\n\n let baseline: CodeSentinelSnapshot | undefined;\n let diff: ReturnType<typeof compareSnapshots> | undefined;\n\n if (options.baselinePath !== undefined) {\n logger.info(`loading baseline snapshot: ${options.baselinePath}`);\n const baselineRaw = await readFile(options.baselinePath, \"utf8\");\n try {\n baseline = parseSnapshot(baselineRaw);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"invalid baseline snapshot\";\n throw new GovernanceConfigurationError(`invalid baseline snapshot: ${message}`);\n }\n diff = compareSnapshots(current, baseline);\n }\n\n const gateResult = evaluateGates({\n current,\n ...(baseline === undefined ? {} : { baseline }),\n ...(diff === undefined ? {} : { diff }),\n gateConfig: options.gateConfig,\n });\n\n const rendered = formatCheckResult(\n {\n current,\n ...(baseline === undefined ? {} : { baseline }),\n ...(diff === undefined ? {} : { diff }),\n gateResult,\n rendered: \"\",\n },\n options.outputFormat,\n );\n\n if (options.outputPath !== undefined) {\n await writeFile(options.outputPath, rendered, \"utf8\");\n logger.info(`check output written: ${options.outputPath}`);\n }\n\n return {\n current,\n ...(baseline === undefined ? {} : { baseline }),\n ...(diff === undefined ? {} : { diff }),\n gateResult,\n rendered,\n };\n};\n\nexport { GovernanceConfigurationError };\n","import type { AnalyzeSummary } from \"@codesentinel/core\";\nimport { computeRepositoryHealthSummary } from \"@codesentinel/health-engine\";\nimport { evaluateRepositoryRisk } from \"@codesentinel/risk-engine\";\nimport { createSnapshot, type CodeSentinelSnapshot } from \"@codesentinel/reporter\";\nimport {\n collectAnalysisInputs,\n resolveHealthConfigForProfile,\n resolveRiskConfigForProfile,\n type AuthorIdentityCliMode,\n type ScoringProfileCliMode,\n} from \"./run-analyze-command.js\";\nimport type { Logger } from \"./logger.js\";\n\nexport type BuildAnalysisSnapshotOptions = {\n includeTrace: boolean;\n recentWindowDays?: number;\n scoringProfile?: ScoringProfileCliMode;\n};\n\nexport const buildAnalysisSnapshot = async (\n inputPath: string | undefined,\n authorIdentityMode: AuthorIdentityCliMode,\n options: BuildAnalysisSnapshotOptions,\n logger: Logger,\n): Promise<CodeSentinelSnapshot> => {\n const analysisInputs = await collectAnalysisInputs(\n inputPath,\n authorIdentityMode,\n {\n ...(options.recentWindowDays === undefined\n ? {}\n : { recentWindowDays: options.recentWindowDays }),\n },\n logger,\n );\n const riskConfig = resolveRiskConfigForProfile(options.scoringProfile);\n const healthConfig = resolveHealthConfigForProfile(options.scoringProfile);\n const evaluation = evaluateRepositoryRisk(\n {\n structural: analysisInputs.structural,\n evolution: analysisInputs.evolution,\n external: analysisInputs.external,\n ...(riskConfig === undefined ? {} : { config: riskConfig }),\n },\n { explain: options.includeTrace },\n );\n\n const summary: AnalyzeSummary = {\n structural: analysisInputs.structural,\n evolution: analysisInputs.evolution,\n external: analysisInputs.external,\n risk: evaluation.summary,\n health: computeRepositoryHealthSummary({\n structural: analysisInputs.structural,\n evolution: analysisInputs.evolution,\n ...(healthConfig === undefined ? {} : { config: healthConfig }),\n }),\n };\n\n return createSnapshot({\n analysis: summary,\n ...(evaluation.trace === undefined ? {} : { trace: evaluation.trace }),\n analysisConfig: {\n authorIdentityMode,\n includeTrace: options.includeTrace,\n scoringProfile: options.scoringProfile ?? \"default\",\n recentWindowDays: analysisInputs.evolution.available\n ? analysisInputs.evolution.metrics.recentWindowDays\n : (options.recentWindowDays ?? null),\n },\n });\n};\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport {\n BaselineRefResolutionError,\n GovernanceConfigurationError,\n evaluateGates,\n renderCheckMarkdown,\n resolveAutoBaselineRef,\n resolveBaselineSnapshotFromRef,\n type GateConfig,\n type GateEvaluationResult,\n} from \"@codesentinel/governance\";\nimport { relative, resolve } from \"node:path\";\nimport {\n compareSnapshots,\n createReport,\n formatReport,\n parseSnapshot,\n type CodeSentinelSnapshot,\n} from \"@codesentinel/reporter\";\nimport { buildAnalysisSnapshot } from \"./build-analysis-snapshot.js\";\nimport { createSilentLogger, type Logger } from \"./logger.js\";\nimport type { AuthorIdentityCliMode, ScoringProfileCliMode } from \"./run-analyze-command.js\";\n\nexport type RunCiCommandOptions = {\n baselinePath?: string;\n baselineRef?: string;\n baselineSha?: string;\n mainBranchCandidates?: readonly string[];\n snapshotPath?: string;\n reportPath?: string;\n jsonOutputPath?: string;\n includeTrace: boolean;\n recentWindowDays?: number;\n scoringProfile?: ScoringProfileCliMode;\n gateConfig: GateConfig;\n};\n\nexport type CiCommandResult = {\n current: CodeSentinelSnapshot;\n baseline?: CodeSentinelSnapshot;\n diff?: ReturnType<typeof compareSnapshots>;\n gateResult: GateEvaluationResult;\n markdownSummary: string;\n machineReadable: {\n current: CodeSentinelSnapshot;\n baseline?: CodeSentinelSnapshot;\n diff?: ReturnType<typeof compareSnapshots>;\n violations: GateEvaluationResult[\"violations\"];\n highestSeverity: GateEvaluationResult[\"highestSeverity\"];\n exitCode: GateEvaluationResult[\"exitCode\"];\n };\n};\n\nconst isPathOutsideBase = (value: string): boolean => {\n return value === \"..\" || value.startsWith(\"../\") || value.startsWith(\"..\\\\\");\n};\n\nexport const runCiCommand = async (\n inputPath: string | undefined,\n authorIdentityMode: AuthorIdentityCliMode,\n options: RunCiCommandOptions,\n logger: Logger = createSilentLogger(),\n): Promise<CiCommandResult> => {\n if (options.baselinePath !== undefined && options.baselineRef !== undefined) {\n throw new GovernanceConfigurationError(\n \"baseline configuration is ambiguous: use either --baseline or --baseline-ref\",\n );\n }\n if (options.baselineSha !== undefined && options.baselineRef !== \"auto\") {\n throw new GovernanceConfigurationError(\"baseline-sha requires --baseline-ref auto\");\n }\n\n const resolvedTargetPath = resolve(inputPath ?? process.cwd());\n\n logger.info(\"building current snapshot\");\n const current = await buildAnalysisSnapshot(\n inputPath,\n authorIdentityMode,\n {\n includeTrace: options.includeTrace,\n ...(options.scoringProfile === undefined ? {} : { scoringProfile: options.scoringProfile }),\n ...(options.recentWindowDays === undefined\n ? {}\n : { recentWindowDays: options.recentWindowDays }),\n },\n logger,\n );\n\n if (options.snapshotPath !== undefined) {\n await writeFile(options.snapshotPath, JSON.stringify(current, null, 2), \"utf8\");\n logger.info(`snapshot written: ${options.snapshotPath}`);\n }\n\n let baseline: CodeSentinelSnapshot | undefined;\n let diff: ReturnType<typeof compareSnapshots> | undefined;\n\n if (options.baselineRef !== undefined) {\n let baselineRef = options.baselineRef;\n if (options.baselineRef === \"auto\") {\n logger.info(\"resolving baseline ref using auto strategy\");\n try {\n const autoResolved = await resolveAutoBaselineRef({\n repositoryPath: resolvedTargetPath,\n ...(options.baselineSha === undefined ? {} : { baselineSha: options.baselineSha }),\n ...(options.mainBranchCandidates === undefined\n ? {}\n : { mainBranchCandidates: options.mainBranchCandidates }),\n environment: process.env,\n });\n logger.info(\n `baseline auto strategy selected: ${autoResolved.strategy} (${autoResolved.resolvedRef} -> ${autoResolved.resolvedSha})`,\n );\n for (const attempt of autoResolved.attempts) {\n const detail = attempt.detail === undefined ? \"\" : ` (${attempt.detail})`;\n logger.debug(\n `baseline auto attempt: ${attempt.step} ${attempt.candidate} => ${attempt.outcome}${detail}`,\n );\n }\n baselineRef = autoResolved.resolvedRef;\n } catch (error) {\n if (error instanceof BaselineRefResolutionError) {\n throw new GovernanceConfigurationError(\n `unable to resolve baseline ref 'auto': ${error.message}`,\n );\n }\n throw error;\n }\n }\n\n logger.info(`resolving baseline from git ref: ${baselineRef}`);\n try {\n const resolved = await resolveBaselineSnapshotFromRef({\n repositoryPath: resolvedTargetPath,\n baselineRef,\n analyzeWorktree: async (worktreePath, repositoryRoot) => {\n const relativeTargetPath = relative(repositoryRoot, resolvedTargetPath);\n if (isPathOutsideBase(relativeTargetPath)) {\n throw new GovernanceConfigurationError(\n `target path is outside git repository root: ${resolvedTargetPath}`,\n );\n }\n\n const baselineTargetPath =\n relativeTargetPath.length === 0 || relativeTargetPath === \".\"\n ? worktreePath\n : resolve(worktreePath, relativeTargetPath);\n\n return buildAnalysisSnapshot(\n baselineTargetPath,\n authorIdentityMode,\n {\n includeTrace: options.includeTrace,\n ...(options.scoringProfile === undefined\n ? {}\n : { scoringProfile: options.scoringProfile }),\n ...(options.recentWindowDays === undefined\n ? {}\n : { recentWindowDays: options.recentWindowDays }),\n },\n logger,\n );\n },\n });\n baseline = resolved.baselineSnapshot;\n logger.info(`baseline ref resolved to ${resolved.resolvedSha}`);\n } catch (error) {\n if (error instanceof BaselineRefResolutionError) {\n throw new GovernanceConfigurationError(\n `unable to resolve baseline ref '${baselineRef}': ${error.message}`,\n );\n }\n throw error;\n }\n diff = compareSnapshots(current, baseline);\n } else if (options.baselinePath !== undefined) {\n logger.info(`loading baseline snapshot: ${options.baselinePath}`);\n const baselineRaw = await readFile(options.baselinePath, \"utf8\");\n try {\n baseline = parseSnapshot(baselineRaw);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"invalid baseline snapshot\";\n throw new GovernanceConfigurationError(`invalid baseline snapshot: ${message}`);\n }\n diff = compareSnapshots(current, baseline);\n }\n\n const gateResult = evaluateGates({\n current,\n ...(baseline === undefined ? {} : { baseline }),\n ...(diff === undefined ? {} : { diff }),\n gateConfig: options.gateConfig,\n });\n\n const report = createReport(current, diff);\n const reportMarkdown = formatReport(report, \"md\");\n const ciMarkdown = renderCheckMarkdown(current, gateResult);\n const markdownSummary = `${reportMarkdown}\\n\\n${ciMarkdown}`;\n\n if (options.reportPath !== undefined) {\n await writeFile(options.reportPath, markdownSummary, \"utf8\");\n logger.info(`report written: ${options.reportPath}`);\n }\n\n const machineReadable = {\n current,\n ...(baseline === undefined ? {} : { baseline }),\n ...(diff === undefined ? {} : { diff }),\n violations: gateResult.violations,\n highestSeverity: gateResult.highestSeverity,\n exitCode: gateResult.exitCode,\n };\n\n if (options.jsonOutputPath !== undefined) {\n await writeFile(options.jsonOutputPath, JSON.stringify(machineReadable, null, 2), \"utf8\");\n logger.info(`ci machine output written: ${options.jsonOutputPath}`);\n }\n\n return {\n current,\n ...(baseline === undefined ? {} : { baseline }),\n ...(diff === undefined ? {} : { diff }),\n gateResult,\n markdownSummary,\n machineReadable,\n };\n};\n\nexport { GovernanceConfigurationError };\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport {\n compareSnapshots,\n createReport,\n formatReport,\n parseSnapshot,\n type CodeSentinelReport,\n type ReportFormat,\n} from \"@codesentinel/reporter\";\nimport { type AuthorIdentityCliMode, type ScoringProfileCliMode } from \"./run-analyze-command.js\";\nimport { createSilentLogger, type Logger } from \"./logger.js\";\nimport { buildAnalysisSnapshot } from \"./build-analysis-snapshot.js\";\n\nexport type ReportCommandOptions = {\n format: ReportFormat;\n comparePath?: string;\n outputPath?: string;\n snapshotPath?: string;\n includeTrace: boolean;\n recentWindowDays?: number;\n scoringProfile?: ScoringProfileCliMode;\n};\n\nexport const runReportCommand = async (\n inputPath: string | undefined,\n authorIdentityMode: AuthorIdentityCliMode,\n options: ReportCommandOptions,\n logger: Logger = createSilentLogger(),\n): Promise<{ report: CodeSentinelReport; rendered: string }> => {\n logger.info(\"building analysis snapshot\");\n const current = await buildAnalysisSnapshot(\n inputPath,\n authorIdentityMode,\n {\n includeTrace: options.includeTrace,\n ...(options.scoringProfile === undefined ? {} : { scoringProfile: options.scoringProfile }),\n ...(options.recentWindowDays === undefined\n ? {}\n : { recentWindowDays: options.recentWindowDays }),\n },\n logger,\n );\n\n if (options.snapshotPath !== undefined) {\n await writeFile(options.snapshotPath, JSON.stringify(current, null, 2), \"utf8\");\n logger.info(`snapshot written: ${options.snapshotPath}`);\n }\n\n let report: CodeSentinelReport;\n if (options.comparePath === undefined) {\n report = createReport(current);\n } else {\n logger.info(`loading baseline snapshot: ${options.comparePath}`);\n const baselineRaw = await readFile(options.comparePath, \"utf8\");\n const baseline = parseSnapshot(baselineRaw);\n const diff = compareSnapshots(current, baseline);\n report = createReport(current, diff);\n }\n\n const rendered = formatReport(report, options.format);\n\n if (options.outputPath !== undefined) {\n await writeFile(options.outputPath, rendered, \"utf8\");\n logger.info(`report written: ${options.outputPath}`);\n }\n\n return { report, rendered };\n};\n","import type { AnalyzeSummary, RiskTrace, TargetTrace } from \"@codesentinel/core\";\nimport { computeRepositoryHealthSummary } from \"@codesentinel/health-engine\";\nimport { evaluateRepositoryRisk } from \"@codesentinel/risk-engine\";\nimport {\n collectAnalysisInputs,\n resolveHealthConfigForProfile,\n resolveRiskConfigForProfile,\n type AuthorIdentityCliMode,\n type ScoringProfileCliMode,\n} from \"./run-analyze-command.js\";\nimport { createSilentLogger, type Logger } from \"./logger.js\";\n\nexport type ExplainFormat = \"text\" | \"json\" | \"md\";\n\nexport type ExplainCommandOptions = {\n file?: string;\n module?: string;\n top: number;\n format: ExplainFormat;\n recentWindowDays?: number;\n scoringProfile?: ScoringProfileCliMode;\n};\n\nexport type ExplainResult = {\n summary: AnalyzeSummary;\n trace: RiskTrace;\n selectedTargets: readonly TargetTrace[];\n};\n\nconst selectTargets = (\n trace: RiskTrace,\n summary: AnalyzeSummary,\n options: ExplainCommandOptions,\n): readonly TargetTrace[] => {\n if (options.file !== undefined) {\n const normalized = options.file.replaceAll(\"\\\\\", \"/\");\n return trace.targets.filter(\n (target) => target.targetType === \"file\" && target.targetId === normalized,\n );\n }\n\n if (options.module !== undefined) {\n return trace.targets.filter(\n (target) => target.targetType === \"module\" && target.targetId === options.module,\n );\n }\n\n const top = Math.max(1, options.top);\n const topFiles = summary.risk.hotspots.slice(0, top).map((entry) => entry.file);\n const fileSet = new Set(topFiles);\n return trace.targets.filter(\n (target) =>\n target.targetType === \"repository\" ||\n (target.targetType === \"file\" && fileSet.has(target.targetId)),\n );\n};\n\nexport const runExplainCommand = async (\n inputPath: string | undefined,\n authorIdentityMode: AuthorIdentityCliMode,\n options: ExplainCommandOptions,\n logger: Logger = createSilentLogger(),\n): Promise<ExplainResult> => {\n const analysisInputs = await collectAnalysisInputs(\n inputPath,\n authorIdentityMode,\n {\n ...(options.recentWindowDays === undefined\n ? {}\n : { recentWindowDays: options.recentWindowDays }),\n },\n logger,\n );\n logger.info(\"computing explainable risk summary\");\n\n const riskConfig = resolveRiskConfigForProfile(options.scoringProfile);\n const healthConfig = resolveHealthConfigForProfile(options.scoringProfile);\n const evaluation = evaluateRepositoryRisk(\n {\n structural: analysisInputs.structural,\n evolution: analysisInputs.evolution,\n external: analysisInputs.external,\n ...(riskConfig === undefined ? {} : { config: riskConfig }),\n },\n { explain: true },\n );\n if (evaluation.trace === undefined) {\n throw new Error(\"risk trace unavailable\");\n }\n\n const summary: AnalyzeSummary = {\n structural: analysisInputs.structural,\n evolution: analysisInputs.evolution,\n external: analysisInputs.external,\n risk: evaluation.summary,\n health: computeRepositoryHealthSummary({\n structural: analysisInputs.structural,\n evolution: analysisInputs.evolution,\n ...(healthConfig === undefined ? {} : { config: healthConfig }),\n }),\n };\n logger.info(\n `explanation completed (riskScore=${summary.risk.riskScore}, healthScore=${summary.health.healthScore})`,\n );\n\n return {\n summary,\n trace: evaluation.trace,\n selectedTargets: selectTargets(evaluation.trace, summary, options),\n };\n};\n"],"mappings":"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","names":["join","packageJsonPath","version","deletedAny","withDefaults","splitIndex","name","requested","mapWithConcurrency","ONE_DAY_MS","MAX_RETRIES","RETRY_BASE_DELAY_MS","round4","round4","join","stdout","readFileSync","readFile","writeFile","dirname","resolve","toHealthTier","factorLabelById","repositoryDimensionScores","createSummaryShape","mkdir","readFile","writeFile","homedir","join","parseSemver","resolve","spawn","stderr","stdin","clearScreenDown","cursorTo","emitKeypressEvents","ANSI","ANSI","stderr","cursorTo","clearScreenDown","hideCursor","showCursor","stdin","resolve","emitKeypressEvents","scriptPath","spawn","resolve","resolve","nodeLowLink","program","round4","round4","normalizePath","ownershipDistributionPenalty","ownershipDistributionFactors","modularityHealth","changeHygieneHealth","testHealthScore","ownershipDistributionHealth","normalizedScore","topIssues","round4","average","normalizePath","resolve","readFile","writeFile","readFile","writeFile","readFile","writeFile","relative","resolve","resolve","writeFile","relative","readFile","readFile","writeFile","writeFile","readFile","resolve","dirname","readFileSync","writeFile","readFile"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../../dependency-firewall/src/domain/external-analysis.ts","../../dependency-firewall/src/domain/types.ts","../../dependency-firewall/src/application/map-with-concurrency.ts","../../dependency-firewall/src/application/collect-dependency-metadata.ts","../../dependency-firewall/src/infrastructure/fs-loader.ts","../../dependency-firewall/src/parsing/package-json-loader.ts","../../dependency-firewall/src/parsing/package-lock-parser.ts","../../dependency-firewall/src/parsing/pnpm-lock-parser.ts","../../dependency-firewall/src/parsing/yarn-lock-parser.ts","../../dependency-firewall/src/parsing/bun-lock-parser.ts","../../dependency-firewall/src/application/parse-lockfile-extraction.ts","../../dependency-firewall/src/infrastructure/cached-fetch.ts","../../dependency-firewall/src/infrastructure/fetch-json-with-retry.ts","../../dependency-firewall/src/infrastructure/npm-metadata-cache.ts","../../dependency-firewall/src/infrastructure/codesentinel-cache-dir.ts","../../dependency-firewall/src/infrastructure/file-cache-store.ts","../../dependency-firewall/src/application/resolve-registry-graph.ts","../../dependency-firewall/src/application/prepare-dependency-extraction.ts","../../dependency-firewall/src/application/analyze-dependency-exposure.ts","../../dependency-firewall/src/application/analyze-dependency-candidate.ts","../../dependency-firewall/src/infrastructure/npm-registry-metadata-provider.ts","../../dependency-firewall/src/infrastructure/noop-metadata-provider.ts","../../dependency-firewall/src/index.ts","../../reporter/src/domain.ts","../../reporter/src/diff.ts","../../reporter/src/report.ts","../../reporter/src/renderers.ts","../../reporter/src/snapshot.ts","../../reporter/src/index.ts","../../governance/src/domain.ts","../../governance/src/evaluate-gates.ts","../../governance/src/render.ts","../../governance/src/baseline-ref.ts","../../governance/src/baseline-auto-resolver.ts","../src/application/format-analyze-output.ts","../src/application/format-explain-output.ts","../src/application/format-dependency-risk-output.ts","../src/application/logger.ts","../src/application/check-for-updates.ts","../src/application/interactive-menu.ts","../src/application/run-analyze-command.ts","../../code-graph/src/domain/graph-model.ts","../../code-graph/src/domain/tarjan.ts","../../code-graph/src/domain/graph-metrics.ts","../../code-graph/src/infrastructure/typescript-project.ts","../../code-graph/src/application/build-project-graph-summary.ts","../../git-analyzer/src/domain/evolution-metrics.ts","../../git-analyzer/src/domain/evolution-types.ts","../../git-analyzer/src/application/analyze-repository-evolution.ts","../../git-analyzer/src/infrastructure/git-command-client.ts","../../git-analyzer/src/domain/git-log-format.ts","../../git-analyzer/src/application/git-history-provider.ts","../../git-analyzer/src/parsing/git-log-parser.ts","../../git-analyzer/src/infrastructure/git-history-provider.ts","../../git-analyzer/src/index.ts","../../health-engine/src/domain/math.ts","../../health-engine/src/application/compute-repository-health-summary.ts","../../risk-engine/src/config.ts","../../risk-engine/src/domain/math.ts","../../risk-engine/src/domain/normalization.ts","../../risk-engine/src/domain/risk-model.ts","../../risk-engine/src/domain/trace-collector.ts","../../risk-engine/src/application/compute-repository-risk-summary.ts","../src/application/run-check-command.ts","../src/application/build-analysis-snapshot.ts","../src/application/run-ci-command.ts","../src/application/run-report-command.ts","../src/application/run-explain-command.ts"],"sourcesContent":["import { Command, Option } from \"commander\";\nimport { analyzeDependencyCandidateFromRegistry } from \"@codesentinel/dependency-firewall\";\nimport { EXIT_CODES, type GateConfig } from \"@codesentinel/governance\";\nimport {\n compareSnapshots,\n createReport,\n createSnapshot,\n formatReport,\n parseSnapshot,\n type ReportFormat,\n} from \"@codesentinel/reporter\";\nimport { readFileSync } from \"node:fs\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n formatAnalyzeOutput,\n type AnalyzeOutputMode,\n} from \"./application/format-analyze-output.js\";\nimport { formatExplainOutput } from \"./application/format-explain-output.js\";\nimport {\n formatDependencyRiskOutput,\n type DependencyRiskOutputMode,\n} from \"./application/format-dependency-risk-output.js\";\nimport { createStderrLogger, parseLogLevel, type LogLevel } from \"./application/logger.js\";\nimport { checkForCliUpdates, runManualCliUpdate } from \"./application/check-for-updates.js\";\nimport { runInteractiveCliMenu } from \"./application/interactive-menu.js\";\nimport {\n runAnalyzeCommand,\n type AuthorIdentityCliMode,\n type ScoringProfileCliMode,\n} from \"./application/run-analyze-command.js\";\nimport {\n GovernanceConfigurationError as CheckConfigurationError,\n runCheckCommand,\n type CheckOutputFormat,\n} from \"./application/run-check-command.js\";\nimport {\n GovernanceConfigurationError as CiConfigurationError,\n runCiCommand,\n} from \"./application/run-ci-command.js\";\nimport { runReportCommand } from \"./application/run-report-command.js\";\nimport { runExplainCommand, type ExplainFormat } from \"./application/run-explain-command.js\";\n\nconst program = new Command();\nconst packageJsonPath = resolve(dirname(fileURLToPath(import.meta.url)), \"../package.json\");\nconst { version } = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as { version: string };\n\nconst parseRecentWindowDays = (value: string): number => {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(\"--recent-window-days must be a positive integer\");\n }\n return parsed;\n};\n\ntype RunDetail = \"compact\" | \"standard\" | \"full\";\n\nconst stripLeadingMarkdownHeading = (value: string, heading: string): string => {\n const prefix = `${heading}\\n`;\n if (value.startsWith(prefix)) {\n return value.slice(prefix.length).trimStart();\n }\n\n return value;\n};\n\nconst extractExplainTextSummary = (text: string): string => {\n const splitIndex = text.search(/\\n\\n(?:file|module|dependency|repository): /);\n if (splitIndex < 0) {\n return text.trim();\n }\n\n return text.slice(0, splitIndex).trim();\n};\n\nconst extractExplainMarkdownSummary = (markdown: string): string => {\n const splitIndex = markdown.search(/\\n\\n## (?:file|module|dependency|repository): /);\n if (splitIndex < 0) {\n return markdown.trim();\n }\n\n return markdown.slice(0, splitIndex).trim();\n};\n\nconst extractSummaryValue = (summary: string, key: string): string | undefined => {\n const prefix = `${key}: `;\n for (const rawLine of summary.split(\"\\n\")) {\n const line = rawLine.trimStart();\n if (line.startsWith(prefix)) {\n return line.slice(prefix.length).trim();\n }\n }\n\n return undefined;\n};\n\nconst renderReportHighlightsText = (\n report: Awaited<ReturnType<typeof runReportCommand>>[\"report\"],\n) => {\n const lines: string[] = [];\n lines.push(\"Repository Summary\");\n lines.push(` target: ${report.repository.targetPath}`);\n lines.push(` riskScore: ${report.repository.riskScore}`);\n lines.push(` healthScore: ${report.health.healthScore}`);\n lines.push(` normalizedScore: ${report.repository.normalizedScore}`);\n lines.push(` riskTier: ${report.repository.riskTier}`);\n lines.push(` healthTier: ${report.repository.healthTier}`);\n lines.push(\"\");\n lines.push(\"Top Hotspots\");\n for (const hotspot of report.hotspots.slice(0, 5)) {\n lines.push(` - ${hotspot.target} | score=${hotspot.score}`);\n lines.push(` priority actions: ${hotspot.suggestedActions.join(\" | \") || \"none\"}`);\n }\n\n return lines.join(\"\\n\");\n};\n\nconst renderReportHighlightsMarkdown = (\n report: Awaited<ReturnType<typeof runReportCommand>>[\"report\"],\n): string => {\n const lines: string[] = [];\n lines.push(\"## Repository Summary\");\n lines.push(`- target: \\`${report.repository.targetPath}\\``);\n lines.push(`- riskScore: \\`${report.repository.riskScore}\\``);\n lines.push(`- healthScore: \\`${report.health.healthScore}\\``);\n lines.push(`- normalizedScore: \\`${report.repository.normalizedScore}\\``);\n lines.push(`- riskTier: \\`${report.repository.riskTier}\\``);\n lines.push(`- healthTier: \\`${report.repository.healthTier}\\``);\n lines.push(\"\");\n lines.push(\"## Top Hotspots\");\n for (const hotspot of report.hotspots.slice(0, 5)) {\n lines.push(`- **${hotspot.target}** (score: \\`${hotspot.score}\\`)`);\n lines.push(` - priority actions: ${hotspot.suggestedActions.join(\" | \") || \"none\"}`);\n }\n\n return lines.join(\"\\n\");\n};\n\nconst renderCompactText = (\n report: Awaited<ReturnType<typeof runReportCommand>>[\"report\"],\n explainSummary: string,\n): string => {\n const lines: string[] = [];\n lines.push(\"CodeSentinel Run (compact)\");\n lines.push(\"\");\n lines.push(\"Repository\");\n lines.push(` target: ${report.repository.targetPath}`);\n lines.push(` riskScore: ${report.repository.riskScore}`);\n lines.push(` healthScore: ${report.health.healthScore}`);\n lines.push(` riskTier: ${report.repository.riskTier}`);\n lines.push(` healthTier: ${report.repository.healthTier}`);\n lines.push(\n ` dimensions: structural=${report.repository.dimensionScores.structural ?? \"n/a\"}, evolution=${report.repository.dimensionScores.evolution ?? \"n/a\"}, external=${report.repository.dimensionScores.external ?? \"n/a\"}, interactions=${report.repository.dimensionScores.interactions ?? \"n/a\"}`,\n );\n lines.push(\"\");\n lines.push(\n `Key Drivers: ${extractSummaryValue(explainSummary, \"key drivers\") ?? \"insufficient data\"}`,\n );\n lines.push(\n `Priority Actions: ${extractSummaryValue(explainSummary, \"priority actions\") ?? \"insufficient data\"}`,\n );\n lines.push(\"\");\n lines.push(\"Top Hotspots\");\n for (const hotspot of report.hotspots.slice(0, 3)) {\n lines.push(` - ${hotspot.target} | score=${hotspot.score}`);\n }\n\n return lines.join(\"\\n\");\n};\n\nconst renderCompactMarkdown = (\n report: Awaited<ReturnType<typeof runReportCommand>>[\"report\"],\n explainSummary: string,\n): string => {\n const lines: string[] = [];\n lines.push(\"# CodeSentinel Run (compact)\");\n lines.push(\"\");\n lines.push(\"## Repository\");\n lines.push(`- target: \\`${report.repository.targetPath}\\``);\n lines.push(`- riskScore: \\`${report.repository.riskScore}\\``);\n lines.push(`- healthScore: \\`${report.health.healthScore}\\``);\n lines.push(`- riskTier: \\`${report.repository.riskTier}\\``);\n lines.push(`- healthTier: \\`${report.repository.healthTier}\\``);\n lines.push(\n `- dimensions: structural=\\`${report.repository.dimensionScores.structural ?? \"n/a\"}\\`, evolution=\\`${report.repository.dimensionScores.evolution ?? \"n/a\"}\\`, external=\\`${report.repository.dimensionScores.external ?? \"n/a\"}\\`, interactions=\\`${report.repository.dimensionScores.interactions ?? \"n/a\"}\\``,\n );\n lines.push(\"\");\n lines.push(\n `- key drivers: ${extractSummaryValue(explainSummary, \"- key drivers\") ?? \"insufficient data\"}`,\n );\n lines.push(\n `- priority actions: ${extractSummaryValue(explainSummary, \"- priority actions\") ?? \"insufficient data\"}`,\n );\n lines.push(\"\");\n lines.push(\"## Top Hotspots\");\n for (const hotspot of report.hotspots.slice(0, 3)) {\n lines.push(`- \\`${hotspot.target}\\` (score: \\`${hotspot.score}\\`)`);\n }\n\n return lines.join(\"\\n\");\n};\n\nconst scoringProfileOption = (): Option =>\n new Option(\n \"--scoring-profile <profile>\",\n \"scoring profile: default (balanced) or personal (down-weights single-maintainer ownership penalties for risk and health ownership)\",\n )\n .choices([\"default\", \"personal\"])\n .default(\"default\");\n\nprogram\n .name(\"codesentinel\")\n .description(\"Structural and evolutionary risk analysis for TypeScript/JavaScript codebases\")\n .version(version);\n\nprogram\n .command(\"update\")\n .description(\"check for a newer CodeSentinel version and install it\")\n .action(async () => {\n process.exitCode = await runManualCliUpdate({\n packageName: \"@getcodesentinel/codesentinel\",\n currentVersion: version,\n });\n });\n\nprogram\n .command(\"analyze\")\n .argument(\"[path]\", \"path to the project to analyze\")\n .addOption(scoringProfileOption())\n .addOption(\n new Option(\n \"--author-identity <mode>\",\n \"author identity mode: likely_merge (heuristic) or strict_email (deterministic)\",\n )\n .choices([\"likely_merge\", \"strict_email\"])\n .default(\"likely_merge\"),\n )\n .addOption(\n new Option(\n \"--log-level <level>\",\n \"log verbosity: silent, error, warn, info, debug (logs are written to stderr)\",\n )\n .choices([\"silent\", \"error\", \"warn\", \"info\", \"debug\"])\n .default(parseLogLevel(process.env[\"CODESENTINEL_LOG_LEVEL\"])),\n )\n .addOption(\n new Option(\"--output <mode>\", \"output mode: summary (default) or json (full analysis object)\")\n .choices([\"summary\", \"json\"])\n .default(\"summary\"),\n )\n .option(\"--json\", \"shortcut for --output json\")\n .addOption(\n new Option(\n \"--recent-window-days <days>\",\n \"git recency window in days used for evolution volatility metrics\",\n )\n .argParser(parseRecentWindowDays)\n .default(30),\n )\n .action(\n async (\n path: string | undefined,\n options: {\n authorIdentity: AuthorIdentityCliMode;\n scoringProfile: ScoringProfileCliMode;\n logLevel: LogLevel;\n output: AnalyzeOutputMode;\n json?: boolean;\n recentWindowDays: number;\n },\n ) => {\n const logger = createStderrLogger(options.logLevel);\n const summary = await runAnalyzeCommand(\n path,\n options.authorIdentity,\n { recentWindowDays: options.recentWindowDays, scoringProfile: options.scoringProfile },\n logger,\n );\n const outputMode: AnalyzeOutputMode = options.json === true ? \"json\" : options.output;\n process.stdout.write(`${formatAnalyzeOutput(summary, outputMode)}\\n`);\n },\n );\n\nprogram\n .command(\"explain\")\n .argument(\"[path]\", \"path to the project to analyze\")\n .addOption(scoringProfileOption())\n .addOption(\n new Option(\n \"--author-identity <mode>\",\n \"author identity mode: likely_merge (heuristic) or strict_email (deterministic)\",\n )\n .choices([\"likely_merge\", \"strict_email\"])\n .default(\"likely_merge\"),\n )\n .addOption(\n new Option(\n \"--log-level <level>\",\n \"log verbosity: silent, error, warn, info, debug (logs are written to stderr)\",\n )\n .choices([\"silent\", \"error\", \"warn\", \"info\", \"debug\"])\n .default(parseLogLevel(process.env[\"CODESENTINEL_LOG_LEVEL\"])),\n )\n .option(\"--file <path>\", \"explain a specific file target\")\n .option(\"--module <name>\", \"explain a specific module target\")\n .option(\"--top <count>\", \"number of top hotspots to explain when no target is selected\", \"5\")\n .addOption(\n new Option(\n \"--recent-window-days <days>\",\n \"git recency window in days used for evolution volatility metrics\",\n )\n .argParser(parseRecentWindowDays)\n .default(30),\n )\n .addOption(\n new Option(\"--format <mode>\", \"output format: text, json, md\")\n .choices([\"text\", \"json\", \"md\"])\n .default(\"md\"),\n )\n .action(\n async (\n path: string | undefined,\n options: {\n authorIdentity: AuthorIdentityCliMode;\n scoringProfile: ScoringProfileCliMode;\n logLevel: LogLevel;\n file?: string;\n module?: string;\n top: string;\n recentWindowDays: number;\n format: ExplainFormat;\n },\n ) => {\n const logger = createStderrLogger(options.logLevel);\n const top = Number.parseInt(options.top, 10);\n const explainOptions = {\n ...(options.file === undefined ? {} : { file: options.file }),\n ...(options.module === undefined ? {} : { module: options.module }),\n top: Number.isFinite(top) ? top : 5,\n recentWindowDays: options.recentWindowDays,\n scoringProfile: options.scoringProfile,\n format: options.format,\n };\n const result = await runExplainCommand(path, options.authorIdentity, explainOptions, logger);\n process.stdout.write(`${formatExplainOutput(result, options.format)}\\n`);\n },\n );\n\nprogram\n .command(\"dependency-risk\")\n .argument(\"<dependency>\", \"dependency spec to evaluate (for example: react or react@19.0.0)\")\n .addOption(\n new Option(\n \"--log-level <level>\",\n \"log verbosity: silent, error, warn, info, debug (logs are written to stderr)\",\n )\n .choices([\"silent\", \"error\", \"warn\", \"info\", \"debug\"])\n .default(parseLogLevel(process.env[\"CODESENTINEL_LOG_LEVEL\"])),\n )\n .addOption(\n new Option(\"--output <mode>\", \"output mode: summary (default) or json (full analysis object)\")\n .choices([\"summary\", \"json\"])\n .default(\"summary\"),\n )\n .option(\"--json\", \"shortcut for --output json\")\n .option(\"--max-nodes <count>\", \"maximum dependency nodes to resolve\", \"250\")\n .option(\"--max-depth <count>\", \"maximum dependency depth to traverse\", \"6\")\n .action(\n async (\n dependency: string,\n options: {\n logLevel: LogLevel;\n output: DependencyRiskOutputMode;\n json?: boolean;\n maxNodes: string;\n maxDepth: string;\n },\n ) => {\n const logger = createStderrLogger(options.logLevel);\n const maxNodes = Number.parseInt(options.maxNodes, 10);\n const maxDepth = Number.parseInt(options.maxDepth, 10);\n\n logger.info(`analyzing dependency candidate: ${dependency}`);\n const result = await analyzeDependencyCandidateFromRegistry({\n dependency,\n maxNodes: Number.isFinite(maxNodes) ? maxNodes : 250,\n maxDepth: Number.isFinite(maxDepth) ? maxDepth : 6,\n });\n if (result.available) {\n logger.info(\n `dependency analysis completed (${result.dependency.name}@${result.dependency.resolvedVersion})`,\n );\n } else {\n logger.warn(`dependency analysis unavailable: ${result.reason}`);\n }\n\n const outputMode: DependencyRiskOutputMode = options.json === true ? \"json\" : options.output;\n process.stdout.write(`${formatDependencyRiskOutput(result, outputMode)}\\n`);\n },\n );\n\nprogram\n .command(\"report\")\n .argument(\"[path]\", \"path to the project to analyze\")\n .addOption(scoringProfileOption())\n .addOption(\n new Option(\n \"--author-identity <mode>\",\n \"author identity mode: likely_merge (heuristic) or strict_email (deterministic)\",\n )\n .choices([\"likely_merge\", \"strict_email\"])\n .default(\"likely_merge\"),\n )\n .addOption(\n new Option(\n \"--log-level <level>\",\n \"log verbosity: silent, error, warn, info, debug (logs are written to stderr)\",\n )\n .choices([\"silent\", \"error\", \"warn\", \"info\", \"debug\"])\n .default(parseLogLevel(process.env[\"CODESENTINEL_LOG_LEVEL\"])),\n )\n .addOption(\n new Option(\"--format <mode>\", \"output format: text, json, md\")\n .choices([\"text\", \"json\", \"md\"])\n .default(\"md\"),\n )\n .option(\"--output <path>\", \"write rendered report to a file path\")\n .option(\"--compare <baseline>\", \"compare against a baseline snapshot JSON file\")\n .option(\"--snapshot <path>\", \"write current snapshot JSON artifact\")\n .option(\"--no-trace\", \"disable trace embedding in generated snapshot\")\n .addOption(\n new Option(\n \"--recent-window-days <days>\",\n \"git recency window in days used for evolution volatility metrics\",\n )\n .argParser(parseRecentWindowDays)\n .default(30),\n )\n .action(\n async (\n path: string | undefined,\n options: {\n authorIdentity: AuthorIdentityCliMode;\n scoringProfile: ScoringProfileCliMode;\n logLevel: LogLevel;\n format: \"text\" | \"json\" | \"md\";\n output?: string;\n compare?: string;\n snapshot?: string;\n trace: boolean;\n recentWindowDays: number;\n },\n ) => {\n const logger = createStderrLogger(options.logLevel);\n const result = await runReportCommand(\n path,\n options.authorIdentity,\n {\n format: options.format,\n ...(options.output === undefined ? {} : { outputPath: options.output }),\n ...(options.compare === undefined ? {} : { comparePath: options.compare }),\n ...(options.snapshot === undefined ? {} : { snapshotPath: options.snapshot }),\n includeTrace: options.trace,\n scoringProfile: options.scoringProfile,\n recentWindowDays: options.recentWindowDays,\n },\n logger,\n );\n\n if (options.output === undefined) {\n process.stdout.write(`${result.rendered}\\n`);\n }\n },\n );\n\nprogram\n .command(\"run\")\n .argument(\"[path]\", \"path to the project to analyze\")\n .addOption(scoringProfileOption())\n .addOption(\n new Option(\n \"--author-identity <mode>\",\n \"author identity mode: likely_merge (heuristic) or strict_email (deterministic)\",\n )\n .choices([\"likely_merge\", \"strict_email\"])\n .default(\"likely_merge\"),\n )\n .addOption(\n new Option(\n \"--log-level <level>\",\n \"log verbosity: silent, error, warn, info, debug (logs are written to stderr)\",\n )\n .choices([\"silent\", \"error\", \"warn\", \"info\", \"debug\"])\n .default(parseLogLevel(process.env[\"CODESENTINEL_LOG_LEVEL\"])),\n )\n .addOption(\n new Option(\"--format <mode>\", \"combined output format: text, md, json\")\n .choices([\"text\", \"md\", \"json\"])\n .default(\"md\"),\n )\n .addOption(\n new Option(\"--detail <level>\", \"run detail level: compact (default), standard, full\")\n .choices([\"compact\", \"standard\", \"full\"])\n .default(\"compact\"),\n )\n .option(\"--file <path>\", \"explain a specific file target\")\n .option(\"--module <name>\", \"explain a specific module target\")\n .option(\"--top <count>\", \"number of top hotspots to explain when no target is selected\", \"5\")\n .option(\"--compare <baseline>\", \"compare against a baseline snapshot JSON file\")\n .option(\"--snapshot <path>\", \"write current snapshot JSON artifact\")\n .option(\"--no-trace\", \"disable trace embedding in generated snapshot\")\n .addOption(\n new Option(\n \"--recent-window-days <days>\",\n \"git recency window in days used for evolution volatility metrics\",\n )\n .argParser(parseRecentWindowDays)\n .default(30),\n )\n .action(\n async (\n path: string | undefined,\n options: {\n authorIdentity: AuthorIdentityCliMode;\n scoringProfile: ScoringProfileCliMode;\n logLevel: LogLevel;\n format: \"text\" | \"md\" | \"json\";\n detail: RunDetail;\n file?: string;\n module?: string;\n top: string;\n compare?: string;\n snapshot?: string;\n trace: boolean;\n recentWindowDays: number;\n },\n ) => {\n const logger = createStderrLogger(options.logLevel);\n const top = Number.parseInt(options.top, 10);\n\n const explain = await runExplainCommand(\n path,\n options.authorIdentity,\n {\n ...(options.file === undefined ? {} : { file: options.file }),\n ...(options.module === undefined ? {} : { module: options.module }),\n top: Number.isFinite(top) ? top : 5,\n format: options.format as ExplainFormat,\n recentWindowDays: options.recentWindowDays,\n scoringProfile: options.scoringProfile,\n },\n logger,\n );\n\n const snapshot = createSnapshot({\n analysis: explain.summary,\n ...(options.trace === true ? { trace: explain.trace } : {}),\n });\n\n if (options.snapshot !== undefined) {\n await writeFile(options.snapshot, JSON.stringify(snapshot, null, 2), \"utf8\");\n logger.info(`snapshot written: ${options.snapshot}`);\n }\n\n const report =\n options.compare === undefined\n ? createReport(snapshot)\n : createReport(\n snapshot,\n compareSnapshots(snapshot, parseSnapshot(await readFile(options.compare, \"utf8\"))),\n );\n\n if (options.format === \"json\") {\n const analyzeSummaryOutput = formatAnalyzeOutput(explain.summary, \"summary\");\n\n if (options.detail === \"compact\") {\n process.stdout.write(\n `${JSON.stringify(\n {\n schemaVersion: \"codesentinel.run.v1\",\n generatedAt: new Date().toISOString(),\n repository: report.repository,\n keyDrivers: extractSummaryValue(\n extractExplainTextSummary(formatExplainOutput(explain, \"text\")),\n \"key drivers\",\n ),\n priorityActions: extractSummaryValue(\n extractExplainTextSummary(formatExplainOutput(explain, \"text\")),\n \"priority actions\",\n ),\n topHotspots: report.hotspots.slice(0, 3).map((hotspot) => ({\n target: hotspot.target,\n score: hotspot.score,\n })),\n },\n null,\n 2,\n )}\\n`,\n );\n return;\n }\n\n if (options.detail === \"standard\") {\n const analyzeSummaryPayload: unknown = JSON.parse(analyzeSummaryOutput);\n\n process.stdout.write(\n `${JSON.stringify(\n {\n schemaVersion: \"codesentinel.run.v1\",\n generatedAt: new Date().toISOString(),\n analyze: analyzeSummaryPayload,\n explain: {\n summary: extractExplainTextSummary(formatExplainOutput(explain, \"text\")),\n },\n report: {\n repository: report.repository,\n health: report.health,\n hotspots: report.hotspots.slice(0, 5),\n structural: report.structural,\n external: report.external,\n },\n },\n null,\n 2,\n )}\\n`,\n );\n return;\n }\n\n process.stdout.write(\n `${JSON.stringify(\n {\n schemaVersion: \"codesentinel.run.v1\",\n generatedAt: new Date().toISOString(),\n analyze: explain.summary,\n explain,\n report,\n },\n null,\n 2,\n )}\\n`,\n );\n return;\n }\n\n const analyzeRendered = formatAnalyzeOutput(explain.summary, \"summary\");\n const explainRendered = formatExplainOutput(explain, options.format);\n\n if (options.detail === \"compact\") {\n if (options.format === \"md\") {\n process.stdout.write(\n `${renderCompactMarkdown(\n report,\n extractExplainMarkdownSummary(formatExplainOutput(explain, \"md\")),\n )}\\n`,\n );\n return;\n }\n\n process.stdout.write(\n `${renderCompactText(report, extractExplainTextSummary(formatExplainOutput(explain, \"text\")))}\\n`,\n );\n return;\n }\n\n if (options.detail === \"standard\") {\n if (options.format === \"md\") {\n process.stdout.write(\n `# CodeSentinel Run\\n\\n## Analyze\\n\\`\\`\\`json\\n${analyzeRendered}\\n\\`\\`\\`\\n\\n## Explain\\n${extractExplainMarkdownSummary(\n formatExplainOutput(explain, \"md\"),\n )}\\n\\n${renderReportHighlightsMarkdown(report)}\\n`,\n );\n return;\n }\n\n process.stdout.write(\n `CodeSentinel Run\\n\\nAnalyze\\n${analyzeRendered}\\n\\nExplain\\n${extractExplainTextSummary(\n formatExplainOutput(explain, \"text\"),\n )}\\n\\nReport\\n${renderReportHighlightsText(report)}\\n`,\n );\n return;\n }\n\n const reportRendered = formatReport(report, options.format as ReportFormat);\n\n if (options.format === \"md\") {\n const explainSection = stripLeadingMarkdownHeading(\n explainRendered,\n \"# CodeSentinel Explanation\",\n );\n const reportSection = stripLeadingMarkdownHeading(reportRendered, \"# CodeSentinel Report\");\n\n process.stdout.write(\n `# CodeSentinel Run\\n\\n## Analyze\\n\\`\\`\\`json\\n${analyzeRendered}\\n\\`\\`\\`\\n\\n## Explain\\n${explainSection}\\n\\n## Report\\n${reportSection}\\n`,\n );\n return;\n }\n\n process.stdout.write(\n `CodeSentinel Run\\n\\nAnalyze\\n${analyzeRendered}\\n\\nExplain\\n${explainRendered}\\n\\nReport\\n${reportRendered}\\n`,\n );\n },\n );\n\nconst parseGateNumber = (value: string | undefined, optionName: string): number | undefined => {\n if (value === undefined) {\n return undefined;\n }\n\n const parsed = Number.parseFloat(value);\n if (!Number.isFinite(parsed)) {\n throw new CheckConfigurationError(`${optionName} must be numeric`);\n }\n\n return parsed;\n};\n\nconst collectOptionValues = (value: string, previous: string[] = []): string[] => {\n return [...previous, value];\n};\n\nconst parseMainBranches = (options: {\n mainBranch?: string[];\n mainBranches?: string;\n}): readonly string[] | undefined => {\n const fromRepeated = options.mainBranch ?? [];\n const fromCsv =\n options.mainBranches === undefined\n ? []\n : options.mainBranches\n .split(\",\")\n .map((value) => value.trim())\n .filter((value) => value.length > 0);\n\n const merged = [...fromRepeated, ...fromCsv];\n if (merged.length === 0) {\n return undefined;\n }\n\n const unique = Array.from(new Set(merged));\n return unique.length > 0 ? unique : undefined;\n};\n\nconst buildGateConfigFromOptions = (options: {\n maxRiskDelta?: string;\n maxHealthDelta?: string;\n noNewCycles?: boolean;\n noNewHighRiskDeps?: boolean;\n maxNewHotspots?: string;\n maxRiskScore?: string;\n minHealthScore?: string;\n newHotspotScoreThreshold?: string;\n failOn: \"error\" | \"warn\";\n}): GateConfig => {\n const maxRiskDelta = parseGateNumber(options.maxRiskDelta, \"--max-risk-delta\");\n const maxHealthDelta = parseGateNumber(options.maxHealthDelta, \"--max-health-delta\");\n const maxNewHotspots = parseGateNumber(options.maxNewHotspots, \"--max-new-hotspots\");\n const maxRiskScore = parseGateNumber(options.maxRiskScore, \"--max-risk-score\");\n const minHealthScore = parseGateNumber(options.minHealthScore, \"--min-health-score\");\n const newHotspotScoreThreshold = parseGateNumber(\n options.newHotspotScoreThreshold,\n \"--new-hotspot-score-threshold\",\n );\n\n return {\n ...(maxRiskDelta === undefined ? {} : { maxRiskDelta }),\n ...(maxHealthDelta === undefined ? {} : { maxHealthDelta }),\n ...(options.noNewCycles === true ? { noNewCycles: true } : {}),\n ...(options.noNewHighRiskDeps === true ? { noNewHighRiskDeps: true } : {}),\n ...(maxNewHotspots === undefined ? {} : { maxNewHotspots }),\n ...(maxRiskScore === undefined ? {} : { maxRiskScore }),\n ...(minHealthScore === undefined ? {} : { minHealthScore }),\n ...(newHotspotScoreThreshold === undefined ? {} : { newHotspotScoreThreshold }),\n failOn: options.failOn,\n };\n};\n\nprogram\n .command(\"check\")\n .argument(\"[path]\", \"path to the project to analyze\")\n .addOption(scoringProfileOption())\n .addOption(\n new Option(\n \"--author-identity <mode>\",\n \"author identity mode: likely_merge (heuristic) or strict_email (deterministic)\",\n )\n .choices([\"likely_merge\", \"strict_email\"])\n .default(\"likely_merge\"),\n )\n .addOption(\n new Option(\n \"--log-level <level>\",\n \"log verbosity: silent, error, warn, info, debug (logs are written to stderr)\",\n )\n .choices([\"silent\", \"error\", \"warn\", \"info\", \"debug\"])\n .default(parseLogLevel(process.env[\"CODESENTINEL_LOG_LEVEL\"])),\n )\n .option(\"--compare <baseline>\", \"baseline snapshot path\")\n .option(\"--max-risk-delta <value>\", \"maximum allowed normalized risk score increase\")\n .option(\n \"--max-health-delta <value>\",\n \"maximum allowed normalized health score regression versus baseline (requires --compare)\",\n )\n .option(\"--no-new-cycles\", \"fail if new structural cycles are introduced\")\n .option(\"--no-new-high-risk-deps\", \"fail if new high-risk direct dependencies are introduced\")\n .option(\"--max-new-hotspots <count>\", \"maximum allowed number of new hotspots\")\n .option(\"--new-hotspot-score-threshold <score>\", \"minimum hotspot score to count as new hotspot\")\n .option(\"--max-risk-score <score>\", \"absolute risk score limit (0..100)\")\n .option(\"--min-health-score <score>\", \"minimum health score threshold (0..100)\")\n .addOption(\n new Option(\"--fail-on <level>\", \"failing severity threshold\")\n .choices([\"error\", \"warn\"])\n .default(\"error\"),\n )\n .addOption(\n new Option(\"--format <mode>\", \"output format: text, json, md\")\n .choices([\"text\", \"json\", \"md\"])\n .default(\"text\"),\n )\n .option(\"--output <path>\", \"write check output to a file path\")\n .option(\"--no-trace\", \"disable trace embedding in generated snapshot\")\n .addOption(\n new Option(\n \"--recent-window-days <days>\",\n \"git recency window in days used for evolution volatility metrics\",\n )\n .argParser(parseRecentWindowDays)\n .default(30),\n )\n .action(\n async (\n path: string | undefined,\n options: {\n authorIdentity: AuthorIdentityCliMode;\n scoringProfile: ScoringProfileCliMode;\n logLevel: LogLevel;\n compare?: string;\n maxRiskDelta?: string;\n maxHealthDelta?: string;\n noNewCycles?: boolean;\n noNewHighRiskDeps?: boolean;\n maxNewHotspots?: string;\n newHotspotScoreThreshold?: string;\n maxRiskScore?: string;\n minHealthScore?: string;\n failOn: \"error\" | \"warn\";\n format: CheckOutputFormat;\n output?: string;\n trace: boolean;\n recentWindowDays: number;\n },\n ) => {\n const logger = createStderrLogger(options.logLevel);\n\n try {\n const gateConfig = buildGateConfigFromOptions(options);\n const result = await runCheckCommand(\n path,\n options.authorIdentity,\n {\n ...(options.compare === undefined ? {} : { baselinePath: options.compare }),\n includeTrace: options.trace,\n scoringProfile: options.scoringProfile,\n recentWindowDays: options.recentWindowDays,\n gateConfig,\n outputFormat: options.format,\n ...(options.output === undefined ? {} : { outputPath: options.output }),\n },\n logger,\n );\n\n if (options.output === undefined) {\n process.stdout.write(`${result.rendered}\\n`);\n }\n\n process.exitCode = result.gateResult.exitCode;\n } catch (error) {\n if (error instanceof CheckConfigurationError) {\n logger.error(error.message);\n process.exitCode = EXIT_CODES.invalidConfiguration;\n return;\n }\n\n logger.error(error instanceof Error ? error.message : \"internal error\");\n process.exitCode = EXIT_CODES.internalError;\n }\n },\n );\n\nprogram\n .command(\"ci\")\n .argument(\"[path]\", \"path to the project to analyze\")\n .addOption(scoringProfileOption())\n .addOption(\n new Option(\n \"--author-identity <mode>\",\n \"author identity mode: likely_merge (heuristic) or strict_email (deterministic)\",\n )\n .choices([\"likely_merge\", \"strict_email\"])\n .default(\"likely_merge\"),\n )\n .addOption(\n new Option(\n \"--log-level <level>\",\n \"log verbosity: silent, error, warn, info, debug (logs are written to stderr)\",\n )\n .choices([\"silent\", \"error\", \"warn\", \"info\", \"debug\"])\n .default(parseLogLevel(process.env[\"CODESENTINEL_LOG_LEVEL\"])),\n )\n .option(\"--baseline <path>\", \"baseline snapshot path\")\n .option(\n \"--baseline-ref <gitRef>\",\n \"resolve baseline snapshot from a git reference (for example origin/main)\",\n )\n .option(\n \"--baseline-sha <sha>\",\n \"explicit baseline commit SHA (only valid with --baseline-ref auto)\",\n )\n .addOption(\n new Option(\n \"--main-branch <name>\",\n \"add a default branch candidate for auto baseline resolution (repeatable)\",\n ).argParser(collectOptionValues),\n )\n .option(\n \"--main-branches <names>\",\n \"comma-separated default branch candidates for auto baseline resolution (for example: main,master)\",\n )\n .option(\"--snapshot <path>\", \"write current snapshot JSON to path\")\n .option(\"--report <path>\", \"write markdown CI summary report\")\n .option(\"--json-output <path>\", \"write machine-readable CI JSON output\")\n .option(\"--max-risk-delta <value>\", \"maximum allowed normalized risk score increase\")\n .option(\n \"--max-health-delta <value>\",\n \"maximum allowed normalized health score regression versus baseline\",\n )\n .option(\"--no-new-cycles\", \"fail if new structural cycles are introduced\")\n .option(\"--no-new-high-risk-deps\", \"fail if new high-risk direct dependencies are introduced\")\n .option(\"--max-new-hotspots <count>\", \"maximum allowed number of new hotspots\")\n .option(\"--new-hotspot-score-threshold <score>\", \"minimum hotspot score to count as new hotspot\")\n .option(\"--max-risk-score <score>\", \"absolute risk score limit (0..100)\")\n .option(\"--min-health-score <score>\", \"minimum health score threshold (0..100)\")\n .addOption(\n new Option(\"--fail-on <level>\", \"failing severity threshold\")\n .choices([\"error\", \"warn\"])\n .default(\"error\"),\n )\n .option(\"--no-trace\", \"disable trace embedding in generated snapshot\")\n .addOption(\n new Option(\n \"--recent-window-days <days>\",\n \"git recency window in days used for evolution volatility metrics\",\n )\n .argParser(parseRecentWindowDays)\n .default(30),\n )\n .action(\n async (\n path: string | undefined,\n options: {\n authorIdentity: AuthorIdentityCliMode;\n scoringProfile: ScoringProfileCliMode;\n logLevel: LogLevel;\n baseline?: string;\n baselineRef?: string;\n baselineSha?: string;\n mainBranch?: string[];\n mainBranches?: string;\n snapshot?: string;\n report?: string;\n jsonOutput?: string;\n maxRiskDelta?: string;\n maxHealthDelta?: string;\n noNewCycles?: boolean;\n noNewHighRiskDeps?: boolean;\n maxNewHotspots?: string;\n newHotspotScoreThreshold?: string;\n maxRiskScore?: string;\n minHealthScore?: string;\n failOn: \"error\" | \"warn\";\n trace: boolean;\n recentWindowDays: number;\n },\n ) => {\n const logger = createStderrLogger(options.logLevel);\n\n try {\n const gateConfig = buildGateConfigFromOptions(options);\n const mainBranchCandidates = parseMainBranches(options);\n const result = await runCiCommand(\n path,\n options.authorIdentity,\n {\n ...(options.baseline === undefined ? {} : { baselinePath: options.baseline }),\n ...(options.baselineRef === undefined ? {} : { baselineRef: options.baselineRef }),\n ...(options.baselineSha === undefined ? {} : { baselineSha: options.baselineSha }),\n ...(mainBranchCandidates === undefined ? {} : { mainBranchCandidates }),\n ...(options.snapshot === undefined ? {} : { snapshotPath: options.snapshot }),\n ...(options.report === undefined ? {} : { reportPath: options.report }),\n ...(options.jsonOutput === undefined ? {} : { jsonOutputPath: options.jsonOutput }),\n includeTrace: options.trace,\n scoringProfile: options.scoringProfile,\n recentWindowDays: options.recentWindowDays,\n gateConfig,\n },\n logger,\n );\n\n if (options.report === undefined) {\n process.stdout.write(`${result.markdownSummary}\\n`);\n }\n\n process.exitCode = result.gateResult.exitCode;\n } catch (error) {\n if (error instanceof CiConfigurationError) {\n logger.error(error.message);\n process.exitCode = EXIT_CODES.invalidConfiguration;\n return;\n }\n\n logger.error(error instanceof Error ? error.message : \"internal error\");\n process.exitCode = EXIT_CODES.internalError;\n }\n },\n );\n\nconst executablePath = process.argv[0] ?? \"\";\nconst scriptPath = process.argv[1] ?? \"\";\n\nconst argv =\n process.argv[2] === \"--\" ? [executablePath, scriptPath, ...process.argv.slice(3)] : process.argv;\n\nif (argv.length <= 2) {\n if (process.stdin.isTTY && process.stdout.isTTY && process.stderr.isTTY) {\n process.exitCode = await runInteractiveCliMenu({\n currentVersion: version,\n scriptPath,\n });\n process.exit(process.exitCode ?? 0);\n }\n\n program.outputHelp();\n process.exit(0);\n}\n\nif (argv[2] !== \"update\") {\n await checkForCliUpdates({\n packageName: \"@getcodesentinel/codesentinel\",\n currentVersion: version,\n argv: process.argv,\n env: process.env,\n });\n}\n\nawait program.parseAsync(argv);\n","import type {\n CentralDependency,\n DependencyExposureRecord,\n DependencyRiskSignal,\n ExternalAnalysisSummary,\n} from \"@codesentinel/core\";\nimport type {\n DependencyMetadata,\n ExternalAnalysisConfig,\n LockfileExtraction,\n LockedDependencyNode,\n} from \"./types.js\";\n\nconst round4 = (value: number): number => Number(value.toFixed(4));\n\ntype NormalizedNode = {\n key: string;\n name: string;\n version: string;\n dependencies: readonly string[];\n};\n\nconst normalizeNodes = (nodes: readonly LockedDependencyNode[]): readonly NormalizedNode[] => {\n const byName = new Map<string, LockedDependencyNode[]>();\n\n for (const node of nodes) {\n const bucket = byName.get(node.name) ?? [];\n bucket.push(node);\n byName.set(node.name, bucket);\n }\n\n const normalized: NormalizedNode[] = [];\n\n for (const [name, candidates] of byName.entries()) {\n if (candidates.length === 0) {\n continue;\n }\n\n candidates.sort((a, b) => b.version.localeCompare(a.version));\n const selected = candidates[0];\n if (selected === undefined) {\n continue;\n }\n\n const deps = selected.dependencies\n .map((dep) => {\n const at = dep.lastIndexOf(\"@\");\n return at <= 0 ? dep : dep.slice(0, at);\n })\n .filter((depName) => depName.length > 0)\n .sort((a, b) => a.localeCompare(b));\n\n normalized.push({\n key: `${name}@${selected.version}`,\n name,\n version: selected.version,\n dependencies: deps,\n });\n }\n\n return normalized.sort((a, b) => a.name.localeCompare(b.name));\n};\n\nconst computeDepths = (\n nodeByName: ReadonlyMap<string, NormalizedNode>,\n directNames: ReadonlySet<string>,\n): { depthByName: ReadonlyMap<string, number>; maxDepth: number } => {\n const visiting = new Set<string>();\n const depthByName = new Map<string, number>();\n\n const compute = (name: string): number => {\n const known = depthByName.get(name);\n if (known !== undefined) {\n return known;\n }\n\n if (visiting.has(name)) {\n return 0;\n }\n\n visiting.add(name);\n\n const node = nodeByName.get(name);\n if (node === undefined) {\n visiting.delete(name);\n depthByName.set(name, 0);\n return 0;\n }\n\n let maxChildDepth = 0;\n for (const dependencyName of node.dependencies) {\n const childDepth = compute(dependencyName);\n if (childDepth > maxChildDepth) {\n maxChildDepth = childDepth;\n }\n }\n\n visiting.delete(name);\n const ownDepth = directNames.has(name) ? 0 : maxChildDepth + 1;\n depthByName.set(name, ownDepth);\n return ownDepth;\n };\n\n for (const name of nodeByName.keys()) {\n compute(name);\n }\n\n let maxDepth = 0;\n for (const depth of depthByName.values()) {\n if (depth > maxDepth) {\n maxDepth = depth;\n }\n }\n\n return { depthByName, maxDepth };\n};\n\nconst rankCentrality = (\n nodes: readonly NormalizedNode[],\n dependentsByName: ReadonlyMap<string, number>,\n directNames: ReadonlySet<string>,\n topN: number,\n): readonly CentralDependency[] =>\n [...nodes]\n .map((node) => ({\n name: node.name,\n dependents: dependentsByName.get(node.name) ?? 0,\n fanOut: node.dependencies.length,\n direct: directNames.has(node.name),\n }))\n .sort(\n (a, b) => b.dependents - a.dependents || b.fanOut - a.fanOut || a.name.localeCompare(b.name),\n )\n .slice(0, topN);\n\nconst canPropagateSignal = (signal: DependencyRiskSignal): boolean =>\n signal === \"abandoned\" ||\n signal === \"high_centrality\" ||\n signal === \"deep_chain\" ||\n signal === \"high_fanout\";\n\nconst collectTransitiveDependencies = (\n rootName: string,\n nodeByName: ReadonlyMap<string, NormalizedNode>,\n): readonly string[] => {\n const seen = new Set<string>();\n const stack = [...(nodeByName.get(rootName)?.dependencies ?? [])];\n\n while (stack.length > 0) {\n const current = stack.pop();\n if (current === undefined || seen.has(current) || current === rootName) {\n continue;\n }\n\n seen.add(current);\n const currentNode = nodeByName.get(current);\n if (currentNode === undefined) {\n continue;\n }\n\n for (const next of currentNode.dependencies) {\n if (!seen.has(next)) {\n stack.push(next);\n }\n }\n }\n\n return [...seen].sort((a, b) => a.localeCompare(b));\n};\n\nexport const buildExternalAnalysisSummary = (\n targetPath: string,\n extraction: LockfileExtraction,\n metadataByKey: ReadonlyMap<string, DependencyMetadata | null>,\n config: ExternalAnalysisConfig,\n): ExternalAnalysisSummary => {\n const nodes = normalizeNodes(extraction.nodes);\n const directNames = new Set(extraction.directDependencies.map((dep) => dep.name));\n const directSpecByName = new Map(extraction.directDependencies.map((dep) => [dep.name, dep]));\n\n const nodeByName = new Map(nodes.map((node) => [node.name, node]));\n const dependentsByName = new Map<string, number>();\n\n for (const node of nodes) {\n dependentsByName.set(node.name, dependentsByName.get(node.name) ?? 0);\n }\n\n for (const node of nodes) {\n for (const dependencyName of node.dependencies) {\n if (!nodeByName.has(dependencyName)) {\n continue;\n }\n\n dependentsByName.set(dependencyName, (dependentsByName.get(dependencyName) ?? 0) + 1);\n }\n }\n\n const { depthByName, maxDepth } = computeDepths(nodeByName, directNames);\n const centralityRanking = rankCentrality(\n nodes,\n dependentsByName,\n directNames,\n config.centralityTopN,\n );\n\n const topCentralNames = new Set(\n centralityRanking\n .slice(0, Math.max(1, Math.ceil(centralityRanking.length * 0.25)))\n .map((entry) => entry.name),\n );\n\n const allDependencies: DependencyExposureRecord[] = [];\n let metadataAvailableCount = 0;\n\n for (const node of nodes) {\n const metadata = metadataByKey.get(node.key) ?? null;\n if (metadata !== null) {\n metadataAvailableCount += 1;\n }\n\n const dependencyDepth = depthByName.get(node.name) ?? 0;\n const dependents = dependentsByName.get(node.name) ?? 0;\n\n const riskSignals: DependencyRiskSignal[] = [];\n\n if ((metadata?.maintainerCount ?? 0) === 1) {\n riskSignals.push(\"single_maintainer\");\n }\n\n if ((metadata?.daysSinceLastRelease ?? 0) >= config.abandonedDaysThreshold) {\n riskSignals.push(\"abandoned\");\n }\n\n if (topCentralNames.has(node.name) && dependents > 0) {\n riskSignals.push(\"high_centrality\");\n }\n\n if (dependencyDepth >= config.deepChainThreshold) {\n riskSignals.push(\"deep_chain\");\n }\n\n if (node.dependencies.length >= config.fanOutHighThreshold) {\n riskSignals.push(\"high_fanout\");\n }\n\n if (metadata === null) {\n riskSignals.push(\"metadata_unavailable\");\n }\n\n allDependencies.push({\n name: node.name,\n direct: directNames.has(node.name),\n dependencyScope: directSpecByName.get(node.name)?.scope ?? \"prod\",\n requestedRange: directSpecByName.get(node.name)?.requestedRange ?? null,\n resolvedVersion: node.version,\n transitiveDependencies: [],\n weeklyDownloads: metadata?.weeklyDownloads ?? null,\n dependencyDepth,\n fanOut: node.dependencies.length,\n dependents,\n maintainerCount: metadata?.maintainerCount ?? null,\n releaseFrequencyDays: metadata?.releaseFrequencyDays ?? null,\n daysSinceLastRelease: metadata?.daysSinceLastRelease ?? null,\n repositoryActivity30d: metadata?.repositoryActivity30d ?? null,\n busFactor: metadata?.busFactor ?? null,\n ownRiskSignals: [...riskSignals].sort((a, b) => a.localeCompare(b)),\n inheritedRiskSignals: [],\n riskSignals,\n });\n }\n\n allDependencies.sort((a, b) => a.name.localeCompare(b.name));\n\n const allByName = new Map(allDependencies.map((dep) => [dep.name, dep]));\n\n const dependencies: DependencyExposureRecord[] = allDependencies\n .filter((dep) => dep.direct)\n .map((dep) => {\n const transitiveDependencies = collectTransitiveDependencies(dep.name, nodeByName);\n const inheritedSignals = new Set<DependencyRiskSignal>();\n const allSignals = new Set(dep.ownRiskSignals);\n\n for (const transitiveName of transitiveDependencies) {\n const transitive = allByName.get(transitiveName);\n if (transitive === undefined) {\n continue;\n }\n\n for (const signal of transitive.riskSignals) {\n if (canPropagateSignal(signal)) {\n inheritedSignals.add(signal);\n allSignals.add(signal);\n }\n }\n }\n\n return {\n ...dep,\n transitiveDependencies,\n inheritedRiskSignals: [...inheritedSignals].sort((a, b) => a.localeCompare(b)),\n riskSignals: [...allSignals].sort((a, b) => a.localeCompare(b)),\n };\n })\n .sort((a, b) => a.name.localeCompare(b.name));\n\n const highRiskDependencies = dependencies\n .filter(\n (dep) =>\n dep.ownRiskSignals.includes(\"abandoned\") ||\n dep.ownRiskSignals.filter(\n (signal) =>\n signal === \"high_centrality\" || signal === \"deep_chain\" || signal === \"high_fanout\",\n ).length >= 2 ||\n (dep.ownRiskSignals.includes(\"single_maintainer\") &&\n ((dep.daysSinceLastRelease ?? 0) >= config.abandonedDaysThreshold / 2 ||\n (dep.repositoryActivity30d ?? 1) <= 0)),\n )\n .filter((dep) => dep.dependencyScope === \"prod\")\n .sort(\n (a, b) => b.ownRiskSignals.length - a.ownRiskSignals.length || a.name.localeCompare(b.name),\n )\n .slice(0, config.maxHighRiskDependencies)\n .map((dep) => dep.name);\n\n const highRiskDevelopmentDependencies = dependencies\n .filter(\n (dep) =>\n dep.dependencyScope === \"dev\" &&\n (dep.ownRiskSignals.includes(\"abandoned\") ||\n dep.ownRiskSignals.filter(\n (signal) =>\n signal === \"high_centrality\" || signal === \"deep_chain\" || signal === \"high_fanout\",\n ).length >= 2 ||\n (dep.ownRiskSignals.includes(\"single_maintainer\") &&\n ((dep.daysSinceLastRelease ?? 0) >= config.abandonedDaysThreshold / 2 ||\n (dep.repositoryActivity30d ?? 1) <= 0))),\n )\n .sort(\n (a, b) => b.ownRiskSignals.length - a.ownRiskSignals.length || a.name.localeCompare(b.name),\n )\n .slice(0, config.maxHighRiskDependencies)\n .map((dep) => dep.name);\n\n const transitiveExposureDependencies = dependencies\n .filter((dep) => dep.inheritedRiskSignals.length > 0)\n .sort(\n (a, b) =>\n b.inheritedRiskSignals.length - a.inheritedRiskSignals.length ||\n a.name.localeCompare(b.name),\n )\n .map((dep) => dep.name);\n\n const singleMaintainerDependencies = dependencies\n .filter((dep) => dep.ownRiskSignals.includes(\"single_maintainer\"))\n .map((dep) => dep.name)\n .sort((a, b) => a.localeCompare(b));\n\n const abandonedDependencies = dependencies\n .filter((dep) => dep.ownRiskSignals.includes(\"abandoned\"))\n .map((dep) => dep.name)\n .sort((a, b) => a.localeCompare(b));\n\n return {\n targetPath,\n available: true,\n metrics: {\n totalDependencies: allDependencies.length,\n directDependencies: dependencies.length,\n directProductionDependencies: dependencies.filter(\n (dependency) => dependency.dependencyScope === \"prod\",\n ).length,\n directDevelopmentDependencies: dependencies.filter(\n (dependency) => dependency.dependencyScope === \"dev\",\n ).length,\n transitiveDependencies: allDependencies.length - dependencies.length,\n dependencyDepth: maxDepth,\n lockfileKind: extraction.kind,\n metadataCoverage:\n allDependencies.length === 0 ? 0 : round4(metadataAvailableCount / allDependencies.length),\n },\n dependencies,\n highRiskDependencies,\n highRiskDevelopmentDependencies,\n transitiveExposureDependencies,\n singleMaintainerDependencies,\n abandonedDependencies,\n centralityRanking,\n };\n};\n","export type LockfileKind = \"pnpm\" | \"npm\" | \"npm-shrinkwrap\" | \"yarn\" | \"bun\";\n\nexport type DirectDependencySpec = {\n name: string;\n requestedRange: string;\n scope: \"prod\" | \"dev\";\n};\n\nexport type LockedDependencyNode = {\n name: string;\n version: string;\n dependencies: readonly string[];\n};\n\nexport type LockfileExtraction = {\n kind: LockfileKind;\n directDependencies: readonly DirectDependencySpec[];\n nodes: readonly LockedDependencyNode[];\n};\n\nexport type DependencyMetadata = {\n name: string;\n version: string;\n weeklyDownloads: number | null;\n maintainerCount: number | null;\n releaseFrequencyDays: number | null;\n daysSinceLastRelease: number | null;\n repositoryActivity30d: number | null;\n busFactor: number | null;\n};\n\nexport type DependencyMetadataRequestContext = {\n directDependency: boolean;\n};\n\nexport interface DependencyMetadataProvider {\n getMetadata(\n name: string,\n version: string,\n context: DependencyMetadataRequestContext,\n ): Promise<DependencyMetadata | null>;\n}\n\nexport type ExternalAnalysisConfig = {\n abandonedDaysThreshold: number;\n deepChainThreshold: number;\n fanOutHighThreshold: number;\n centralityTopN: number;\n maxHighRiskDependencies: number;\n metadataRequestConcurrency: number;\n};\n\nexport const DEFAULT_EXTERNAL_ANALYSIS_CONFIG: ExternalAnalysisConfig = {\n abandonedDaysThreshold: 540,\n deepChainThreshold: 6,\n fanOutHighThreshold: 25,\n centralityTopN: 20,\n maxHighRiskDependencies: 100,\n metadataRequestConcurrency: 8,\n};\n","export const mapWithConcurrency = async <T, R>(\n values: readonly T[],\n limit: number,\n handler: (value: T) => Promise<R>,\n): Promise<readonly R[]> => {\n const effectiveLimit = Math.max(1, limit);\n const workerCount = Math.min(effectiveLimit, values.length);\n const UNSET = Symbol(\"map_with_concurrency_unset\");\n const results = new Array<R | typeof UNSET>(values.length).fill(UNSET);\n let index = 0;\n\n const workers: Promise<void>[] = Array.from({ length: workerCount }, async () => {\n // This loop always terminates: each iteration advances `index`,\n // and workers return once `index >= values.length`.\n while (true) {\n const current = index;\n index += 1;\n if (current >= values.length) {\n return;\n }\n\n const value = values[current] as T;\n results[current] = await handler(value);\n }\n });\n\n await Promise.all(workers);\n if (results.some((value) => value === UNSET)) {\n throw new Error(\"map_with_concurrency_incomplete_results\");\n }\n return results as R[];\n};\n","import type { LockfileExtraction, DependencyMetadataProvider } from \"../domain/types.js\";\nimport { mapWithConcurrency } from \"./map-with-concurrency.js\";\n\ntype MetadataEntry = {\n key: string;\n metadata: Awaited<ReturnType<DependencyMetadataProvider[\"getMetadata\"]>>;\n};\n\ntype MetadataProgressEvent = {\n completed: number;\n total: number;\n packageName: string;\n};\n\nexport const collectDependencyMetadata = async (\n extraction: LockfileExtraction,\n metadataProvider: DependencyMetadataProvider,\n concurrency: number,\n onProgress?: (event: MetadataProgressEvent) => void,\n): Promise<readonly MetadataEntry[]> => {\n const directNames = new Set(extraction.directDependencies.map((dependency) => dependency.name));\n let completed = 0;\n\n return mapWithConcurrency(extraction.nodes, concurrency, async (node) => {\n const result = {\n key: `${node.name}@${node.version}`,\n metadata: await metadataProvider.getMetadata(node.name, node.version, {\n directDependency: directNames.has(node.name),\n }),\n };\n completed += 1;\n onProgress?.({\n completed,\n total: extraction.nodes.length,\n packageName: node.name,\n });\n return result;\n });\n};\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport type RepositoryFiles = {\n packageJsonPath: string;\n packageJsonRaw: string;\n lockfilePath: string;\n lockfileRaw: string;\n};\n\nconst LOCKFILE_CANDIDATES: readonly {\n fileName: string;\n kind: \"pnpm\" | \"npm\" | \"npm-shrinkwrap\" | \"yarn\" | \"bun\";\n}[] = [\n { fileName: \"pnpm-lock.yaml\", kind: \"pnpm\" },\n { fileName: \"package-lock.json\", kind: \"npm\" },\n { fileName: \"npm-shrinkwrap.json\", kind: \"npm-shrinkwrap\" },\n { fileName: \"yarn.lock\", kind: \"yarn\" },\n { fileName: \"bun.lock\", kind: \"bun\" },\n { fileName: \"bun.lockb\", kind: \"bun\" },\n];\n\nexport type LockfileSelection = {\n path: string;\n kind: \"pnpm\" | \"npm\" | \"npm-shrinkwrap\" | \"yarn\" | \"bun\";\n raw: string;\n};\n\nexport const loadPackageJson = (repositoryPath: string): { path: string; raw: string } | null => {\n const packageJsonPath = join(repositoryPath, \"package.json\");\n if (!existsSync(packageJsonPath)) {\n return null;\n }\n\n return {\n path: packageJsonPath,\n raw: readFileSync(packageJsonPath, \"utf8\"),\n };\n};\n\nexport const selectLockfile = (repositoryPath: string): LockfileSelection | null => {\n for (const candidate of LOCKFILE_CANDIDATES) {\n const absolutePath = join(repositoryPath, candidate.fileName);\n if (!existsSync(absolutePath)) {\n continue;\n }\n\n return {\n path: absolutePath,\n kind: candidate.kind,\n raw: readFileSync(absolutePath, \"utf8\"),\n };\n }\n\n return null;\n};\n","import type { DirectDependencySpec } from \"../domain/types.js\";\n\ntype ParsedPackageJson = {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n};\n\nexport const parsePackageJson = (raw: string): readonly DirectDependencySpec[] => {\n const parsed = JSON.parse(raw) as ParsedPackageJson;\n const merged = new Map<string, DirectDependencySpec>();\n\n const addBlock = (block: Record<string, string> | undefined, scope: \"prod\" | \"dev\"): void => {\n if (block === undefined) {\n return;\n }\n\n for (const [name, versionRange] of Object.entries(block)) {\n const existing = merged.get(name);\n // Production scope wins when the same package appears in both scopes.\n if (existing?.scope === \"prod\" && scope === \"dev\") {\n continue;\n }\n\n merged.set(name, { name, requestedRange: versionRange, scope });\n }\n };\n\n addBlock(parsed.dependencies, \"prod\");\n addBlock(parsed.optionalDependencies, \"prod\");\n addBlock(parsed.peerDependencies, \"prod\");\n addBlock(parsed.devDependencies, \"dev\");\n\n return [...merged.values()].sort((a, b) => a.name.localeCompare(b.name));\n};\n","import type {\n DirectDependencySpec,\n LockfileExtraction,\n LockedDependencyNode,\n} from \"../domain/types.js\";\n\ntype PackageLockNode = {\n version?: string;\n dependencies?: Record<string, string>;\n};\n\ntype PackageLockShape = {\n lockfileVersion?: number;\n packages?: Record<string, PackageLockNode>;\n dependencies?: Record<string, { version?: string; dependencies?: Record<string, unknown> }>;\n};\n\nexport const parsePackageLock = (\n raw: string,\n directSpecs: readonly DirectDependencySpec[],\n): LockfileExtraction => {\n const parsed = JSON.parse(raw) as PackageLockShape;\n const nodes: LockedDependencyNode[] = [];\n\n if (parsed.packages !== undefined) {\n for (const [packagePath, packageData] of Object.entries(parsed.packages)) {\n if (packagePath.length === 0 || packageData.version === undefined) {\n continue;\n }\n\n const segments = packagePath.split(\"node_modules/\");\n const name = segments[segments.length - 1] ?? \"\";\n if (name.length === 0) {\n continue;\n }\n\n const dependencies = Object.entries(packageData.dependencies ?? {})\n .map(([depName, depRange]) => `${depName}@${String(depRange)}`)\n .sort((a, b) => a.localeCompare(b));\n\n nodes.push({\n name,\n version: packageData.version,\n dependencies,\n });\n }\n } else if (parsed.dependencies !== undefined) {\n for (const [name, dep] of Object.entries(parsed.dependencies)) {\n if (dep.version === undefined) {\n continue;\n }\n\n const dependencies = Object.entries(dep.dependencies ?? {})\n .map(([depName, depVersion]) => `${depName}@${String(depVersion)}`)\n .sort((a, b) => a.localeCompare(b));\n\n nodes.push({\n name,\n version: dep.version,\n dependencies,\n });\n }\n }\n\n nodes.sort((a, b) => a.name.localeCompare(b.name) || a.version.localeCompare(b.version));\n\n return {\n kind: \"npm\",\n directDependencies: directSpecs,\n nodes,\n };\n};\n","import type {\n DirectDependencySpec,\n LockfileExtraction,\n LockedDependencyNode,\n} from \"../domain/types.js\";\n\ntype ParserState = \"root\" | \"importers\" | \"packages\" | \"packageDeps\";\n\nconst sanitizeValue = (value: string): string => value.replace(/^['\"]|['\"]$/g, \"\").trim();\n\nconst parsePackageKey = (rawKey: string): { name: string; version: string } | null => {\n const key = sanitizeValue(rawKey.replace(/:$/, \"\"));\n const withoutSlash = key.startsWith(\"/\") ? key.slice(1) : key;\n\n const lastAt = withoutSlash.lastIndexOf(\"@\");\n if (lastAt <= 0) {\n return null;\n }\n\n const name = withoutSlash.slice(0, lastAt);\n const versionWithPeers = withoutSlash.slice(lastAt + 1);\n const version = versionWithPeers.split(\"(\")[0] ?? versionWithPeers;\n\n if (name.length === 0 || version.length === 0) {\n return null;\n }\n\n return { name, version };\n};\n\nexport const parsePnpmLockfile = (\n raw: string,\n directSpecs: readonly DirectDependencySpec[],\n): LockfileExtraction => {\n const lines = raw.split(\"\\n\");\n let state: ParserState = \"root\";\n let currentPackage: string | null = null;\n let currentDependencyName: string | null = null;\n const dependenciesByNode = new Map<string, Set<string>>();\n\n for (const line of lines) {\n if (line.trim().length === 0 || line.trimStart().startsWith(\"#\")) {\n continue;\n }\n\n if (line.startsWith(\"importers:\")) {\n state = \"importers\";\n continue;\n }\n\n if (line.startsWith(\"packages:\")) {\n state = \"packages\";\n continue;\n }\n\n if (state === \"packages\" || state === \"packageDeps\") {\n const packageMatch = line.match(/^\\s{2}([^\\s].+):\\s*$/);\n if (packageMatch !== null) {\n const parsedKey = parsePackageKey(packageMatch[1] ?? \"\");\n if (parsedKey !== null) {\n currentPackage = `${parsedKey.name}@${parsedKey.version}`;\n dependenciesByNode.set(currentPackage, new Set());\n state = \"packageDeps\";\n currentDependencyName = null;\n }\n continue;\n }\n }\n\n if (state === \"packageDeps\" && currentPackage !== null) {\n const depLine = line.match(/^\\s{6}([^:\\s]+):\\s*(.+)$/);\n if (depLine !== null) {\n const depName = sanitizeValue(depLine[1] ?? \"\");\n const depRef = sanitizeValue(depLine[2] ?? \"\");\n const depVersion = depRef.split(\"(\")[0] ?? depRef;\n\n if (depName.length > 0 && depVersion.length > 0) {\n dependenciesByNode.get(currentPackage)?.add(`${depName}@${depVersion}`);\n }\n currentDependencyName = null;\n continue;\n }\n\n const depBlockLine = line.match(/^\\s{6}([^:\\s]+):\\s*$/);\n if (depBlockLine !== null) {\n currentDependencyName = sanitizeValue(depBlockLine[1] ?? \"\");\n continue;\n }\n\n const depVersionLine = line.match(/^\\s{8}version:\\s*(.+)$/);\n if (depVersionLine !== null && currentDependencyName !== null) {\n const depRef = sanitizeValue(depVersionLine[1] ?? \"\");\n const depVersion = depRef.split(\"(\")[0] ?? depRef;\n if (depVersion.length > 0) {\n dependenciesByNode.get(currentPackage)?.add(`${currentDependencyName}@${depVersion}`);\n }\n currentDependencyName = null;\n continue;\n }\n\n if (line.match(/^\\s{4}(dependencies|optionalDependencies):\\s*$/) !== null) {\n continue;\n }\n }\n }\n\n const nodes: LockedDependencyNode[] = [...dependenciesByNode.entries()]\n .map(([nodeId, deps]) => {\n const at = nodeId.lastIndexOf(\"@\");\n return {\n name: nodeId.slice(0, at),\n version: nodeId.slice(at + 1),\n dependencies: [...deps].sort((a, b) => a.localeCompare(b)),\n };\n })\n .sort((a, b) => a.name.localeCompare(b.name) || a.version.localeCompare(b.version));\n\n return {\n kind: \"pnpm\",\n directDependencies: directSpecs,\n nodes,\n };\n};\n","import type {\n DirectDependencySpec,\n LockfileExtraction,\n LockedDependencyNode,\n} from \"../domain/types.js\";\n\nconst stripQuotes = (value: string): string => value.replace(/^['\"]|['\"]$/g, \"\");\n\nconst parseVersionSelector = (selector: string): string | null => {\n const npmIndex = selector.lastIndexOf(\"@npm:\");\n if (npmIndex >= 0) {\n return selector.slice(npmIndex + 5);\n }\n\n const lastAt = selector.lastIndexOf(\"@\");\n if (lastAt <= 0) {\n return null;\n }\n\n return selector.slice(lastAt + 1);\n};\n\nexport const parseYarnLock = (\n raw: string,\n directSpecs: readonly DirectDependencySpec[],\n): LockfileExtraction => {\n const lines = raw.split(\"\\n\");\n const nodes: LockedDependencyNode[] = [];\n\n let selectors: string[] = [];\n let version: string | null = null;\n let readingDependencies = false;\n let dependencies: string[] = [];\n\n const flushEntry = (): void => {\n if (selectors.length === 0 || version === null) {\n selectors = [];\n version = null;\n dependencies = [];\n readingDependencies = false;\n return;\n }\n\n for (const selector of selectors) {\n const parsedVersion = parseVersionSelector(selector);\n const at = selector.lastIndexOf(\"@\");\n const name = at <= 0 ? selector : selector.slice(0, at);\n if (name.length === 0) {\n continue;\n }\n\n nodes.push({\n name,\n version,\n dependencies: [...dependencies].sort((a, b) => a.localeCompare(b)),\n });\n\n if (parsedVersion !== null) {\n nodes.push({\n name,\n version: parsedVersion,\n dependencies: [...dependencies].sort((a, b) => a.localeCompare(b)),\n });\n }\n }\n\n selectors = [];\n version = null;\n dependencies = [];\n readingDependencies = false;\n };\n\n for (const line of lines) {\n if (line.trim().length === 0) {\n continue;\n }\n\n if (!line.startsWith(\" \") && line.endsWith(\":\")) {\n flushEntry();\n const keyText = line.slice(0, -1);\n selectors = keyText\n .split(\",\")\n .map((part) => stripQuotes(part.trim()))\n .filter((part) => part.length > 0);\n continue;\n }\n\n if (line.match(/^\\s{2}version\\s+/) !== null) {\n const value = line.replace(/^\\s{2}version\\s+/, \"\").trim();\n version = stripQuotes(value);\n readingDependencies = false;\n continue;\n }\n\n if (line.match(/^\\s{2}dependencies:\\s*$/) !== null) {\n readingDependencies = true;\n continue;\n }\n\n if (readingDependencies && line.match(/^\\s{4}[^\\s].+$/) !== null) {\n const depLine = line.trim();\n const firstSpace = depLine.indexOf(\" \");\n if (firstSpace <= 0) {\n continue;\n }\n\n const depName = stripQuotes(depLine.slice(0, firstSpace));\n const depRef = stripQuotes(depLine.slice(firstSpace + 1).trim());\n const depVersion = parseVersionSelector(depRef) ?? depRef;\n dependencies.push(`${depName}@${depVersion}`);\n continue;\n }\n\n readingDependencies = false;\n }\n\n flushEntry();\n\n const deduped = new Map<string, LockedDependencyNode>();\n for (const node of nodes) {\n const key = `${node.name}@${node.version}`;\n if (!deduped.has(key)) {\n deduped.set(key, node);\n }\n }\n\n return {\n kind: \"yarn\",\n directDependencies: directSpecs,\n nodes: [...deduped.values()].sort(\n (a, b) => a.name.localeCompare(b.name) || a.version.localeCompare(b.version),\n ),\n };\n};\n","import type { DirectDependencySpec, LockfileExtraction } from \"../domain/types.js\";\n\nexport const parseBunLock = (\n _raw: string,\n _directSpecs: readonly DirectDependencySpec[],\n): LockfileExtraction => {\n throw new Error(\"unsupported_lockfile_format\");\n};\n","import type { LockfileExtraction } from \"../domain/types.js\";\nimport type { parsePackageJson } from \"../parsing/package-json-loader.js\";\nimport { parsePackageLock } from \"../parsing/package-lock-parser.js\";\nimport { parsePnpmLockfile } from \"../parsing/pnpm-lock-parser.js\";\nimport { parseYarnLock } from \"../parsing/yarn-lock-parser.js\";\nimport { parseBunLock } from \"../parsing/bun-lock-parser.js\";\n\ntype SupportedLockfileKind = \"pnpm\" | \"npm\" | \"npm-shrinkwrap\" | \"yarn\" | \"bun\";\n\nexport const parseLockfileExtraction = (\n lockfileKind: SupportedLockfileKind,\n lockfileRaw: string,\n directSpecs: ReturnType<typeof parsePackageJson>,\n): LockfileExtraction => {\n switch (lockfileKind) {\n case \"pnpm\":\n return parsePnpmLockfile(lockfileRaw, directSpecs);\n case \"npm\":\n case \"npm-shrinkwrap\":\n return {\n ...parsePackageLock(lockfileRaw, directSpecs),\n kind: lockfileKind,\n };\n case \"yarn\":\n return parseYarnLock(lockfileRaw, directSpecs);\n case \"bun\":\n return parseBunLock(lockfileRaw, directSpecs);\n default:\n throw new Error(\"unsupported_lockfile_format\");\n }\n};\n","import type { CacheStore } from \"./cache-store.js\";\n\ntype CachedFetchOptions<T> = {\n key: string;\n ttlMs: number;\n cacheStore: CacheStore | null;\n fetchFresh: () => Promise<T | null>;\n nowMs?: number;\n};\n\nexport const cachedFetch = async <T>(options: CachedFetchOptions<T>): Promise<T | null> => {\n const nowMs = options.nowMs ?? Date.now();\n const cachedEntry =\n options.cacheStore === null ? null : await options.cacheStore.get<T>(options.key);\n\n if (cachedEntry !== null && nowMs - cachedEntry.fetchedAtMs <= options.ttlMs) {\n return cachedEntry.value;\n }\n\n try {\n const fresh = await options.fetchFresh();\n if (fresh !== null) {\n void options.cacheStore?.set(options.key, { value: fresh, fetchedAtMs: nowMs }).catch(() => {\n // Cache persistence failures should not impact the primary fetch path.\n });\n return fresh;\n }\n } catch {\n // Network failures should not block stale fallback.\n }\n\n return cachedEntry?.value ?? null;\n};\n","import { setTimeout as sleep } from \"node:timers/promises\";\n\nexport type FetchRetryOptions = {\n retries: number;\n baseDelayMs: number;\n};\n\nconst parseRetryAfterMs = (value: string | null): number | null => {\n if (value === null) {\n return null;\n }\n\n const seconds = Number.parseInt(value, 10);\n if (!Number.isFinite(seconds) || seconds <= 0) {\n return null;\n }\n\n return seconds * 1000;\n};\n\nconst shouldRetryStatus = (status: number): boolean => status === 429 || status >= 500;\n\nexport const fetchJsonWithRetry = async <T>(\n url: string,\n options: FetchRetryOptions,\n): Promise<T | null> => {\n for (let attempt = 0; attempt <= options.retries; attempt += 1) {\n const response = await fetch(url);\n if (response.ok) {\n return (await response.json()) as T;\n }\n\n if (!shouldRetryStatus(response.status) || attempt === options.retries) {\n return null;\n }\n\n const retryAfterMs = parseRetryAfterMs(response.headers.get(\"retry-after\"));\n const backoffMs = retryAfterMs ?? options.baseDelayMs * 2 ** attempt;\n await sleep(backoffMs);\n }\n\n return null;\n};\n","import { join } from \"node:path\";\nimport type { CacheStore } from \"./cache-store.js\";\nimport { resolveCodesentinelCacheDir } from \"./codesentinel-cache-dir.js\";\nimport { FileCacheStore } from \"./file-cache-store.js\";\n\nconst SIX_HOURS_MS = 6 * 60 * 60 * 1000;\nconst ONE_DAY_MS = 24 * 60 * 60 * 1000;\nconst DEFAULT_MAX_BYTES = 20 * 1024 * 1024;\nconst DEFAULT_MAX_ENTRY_BYTES = 4 * 1024 * 1024;\nconst DEFAULT_SWEEP_INTERVAL_WRITES = 25;\n\nlet cacheStoreSingleton: CacheStore | null | undefined;\n\nconst parsePositiveIntegerFromEnv = (value: string | undefined, fallback: number): number => {\n if (value === undefined) {\n return fallback;\n }\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return fallback;\n }\n return parsed;\n};\n\nconst cacheDisabled = (env: NodeJS.ProcessEnv): boolean => {\n const mode = env[\"CODESENTINEL_CACHE_MODE\"]?.trim().toLowerCase();\n return mode === \"none\";\n};\n\nexport const getNpmMetadataCacheStore = (): CacheStore | null => {\n if (cacheStoreSingleton !== undefined) {\n return cacheStoreSingleton;\n }\n\n if (cacheDisabled(process.env)) {\n cacheStoreSingleton = null;\n return cacheStoreSingleton;\n }\n\n const path = join(resolveCodesentinelCacheDir(process.env), \"npm-metadata-v2\");\n const packumentTtlMs = getPackumentCacheTtlMs();\n const downloadsTtlMs = getWeeklyDownloadsCacheTtlMs();\n cacheStoreSingleton = new FileCacheStore(path, {\n maxBytes: parsePositiveIntegerFromEnv(\n process.env[\"CODESENTINEL_CACHE_MAX_BYTES\"],\n DEFAULT_MAX_BYTES,\n ),\n maxEntryBytes: parsePositiveIntegerFromEnv(\n process.env[\"CODESENTINEL_CACHE_MAX_ENTRY_BYTES\"],\n DEFAULT_MAX_ENTRY_BYTES,\n ),\n sweepIntervalWrites: parsePositiveIntegerFromEnv(\n process.env[\"CODESENTINEL_CACHE_SWEEP_INTERVAL_WRITES\"],\n DEFAULT_SWEEP_INTERVAL_WRITES,\n ),\n bucketForKey: (key) => {\n if (key.startsWith(\"npm:downloads:last-week:\")) {\n return \"downloads\";\n }\n if (key.startsWith(\"npm:packument:\")) {\n return \"packument\";\n }\n return \"default\";\n },\n maxAgeMsByBucket: {\n downloads: downloadsTtlMs,\n packument: packumentTtlMs,\n },\n });\n return cacheStoreSingleton;\n};\n\nexport const getPackumentCacheTtlMs = (): number =>\n parsePositiveIntegerFromEnv(process.env[\"CODESENTINEL_CACHE_TTL_PACKUMENT_MS\"], SIX_HOURS_MS);\n\nexport const getWeeklyDownloadsCacheTtlMs = (): number =>\n parsePositiveIntegerFromEnv(process.env[\"CODESENTINEL_CACHE_TTL_DOWNLOADS_MS\"], ONE_DAY_MS);\n\nexport const toMetadataPackumentCacheKey = (name: string): string =>\n `npm:packument:metadata:${name}`;\nexport const toGraphPackumentCacheKey = (name: string): string => `npm:packument:graph:${name}`;\nexport const toWeeklyDownloadsCacheKey = (name: string): string =>\n `npm:downloads:last-week:${name}`;\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport const resolveCodesentinelCacheDir = (env: NodeJS.ProcessEnv = process.env): string => {\n const explicit = env[\"CODESENTINEL_CACHE_DIR\"]?.trim();\n if (explicit !== undefined && explicit.length > 0) {\n return explicit;\n }\n\n if (process.platform === \"win32\") {\n const localAppData = env[\"LOCALAPPDATA\"]?.trim();\n if (localAppData !== undefined && localAppData.length > 0) {\n return join(localAppData, \"codesentinel\", \"Cache\");\n }\n return join(homedir(), \"AppData\", \"Local\", \"codesentinel\", \"Cache\");\n }\n\n const xdgCacheHome = env[\"XDG_CACHE_HOME\"]?.trim();\n if (xdgCacheHome !== undefined && xdgCacheHome.length > 0) {\n return join(xdgCacheHome, \"codesentinel\");\n }\n\n return join(homedir(), \".cache\", \"codesentinel\");\n};\n","import { createHash } from \"node:crypto\";\nimport { mkdir, readdir, readFile, rename, stat, unlink, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { CacheEntry, CacheStore } from \"./cache-store.js\";\n\ntype CacheEntryPayload = {\n key: string;\n fetchedAtMs: number;\n value: unknown;\n};\n\nconst parseCacheEntryPayload = (value: unknown): CacheEntryPayload | null => {\n if (typeof value !== \"object\" || value === null) {\n return null;\n }\n\n const payload = value as { key?: unknown; fetchedAtMs?: unknown; value?: unknown };\n if (typeof payload.key !== \"string\" || payload.key.length === 0) {\n return null;\n }\n if (typeof payload.fetchedAtMs !== \"number\" || !Number.isFinite(payload.fetchedAtMs)) {\n return null;\n }\n\n return {\n key: payload.key,\n fetchedAtMs: payload.fetchedAtMs,\n value: payload.value,\n };\n};\n\ntype FileCacheStoreOptions = {\n maxBytes: number;\n maxEntryBytes: number;\n sweepIntervalWrites: number;\n bucketForKey?: (key: string) => string;\n maxAgeMsByBucket?: Readonly<Record<string, number>>;\n};\n\nconst DEFAULT_OPTIONS: FileCacheStoreOptions = {\n maxBytes: 100 * 1024 * 1024,\n maxEntryBytes: 4 * 1024 * 1024,\n sweepIntervalWrites: 25,\n};\n\nconst DEFAULT_BUCKET = \"default\";\n\nconst normalizeBucket = (value: string): string => {\n const trimmed = value.trim().toLowerCase();\n if (trimmed.length === 0) {\n return DEFAULT_BUCKET;\n }\n return trimmed.replace(/[^a-z0-9_-]/g, \"_\");\n};\n\nexport class FileCacheStore implements CacheStore {\n private readonly byKey = new Map<string, CacheEntry<unknown> | null>();\n private readonly inFlightWrites = new Map<string, Promise<void>>();\n private writesSinceSweep = 0;\n private sweepPromise: Promise<void> = Promise.resolve();\n\n constructor(\n private readonly directoryPath: string,\n private readonly options: FileCacheStoreOptions = DEFAULT_OPTIONS,\n ) {}\n\n private bucketForKey(key: string): string {\n const configured = this.options.bucketForKey?.(key);\n if (configured === undefined) {\n return DEFAULT_BUCKET;\n }\n return normalizeBucket(configured);\n }\n\n private toEntryPath(key: string): string {\n const bucket = this.bucketForKey(key);\n const digest = createHash(\"sha256\").update(key).digest(\"hex\");\n return join(this.directoryPath, bucket, `${digest}.json`);\n }\n\n private async writeEntry(key: string, entry: CacheEntry<unknown>): Promise<void> {\n const filePath = this.toEntryPath(key);\n const bucketPath = join(this.directoryPath, this.bucketForKey(key));\n await mkdir(bucketPath, { recursive: true });\n const tempPath = `${filePath}.tmp`;\n const payload: CacheEntryPayload = {\n key,\n fetchedAtMs: entry.fetchedAtMs,\n value: entry.value,\n };\n const raw = JSON.stringify(payload);\n if (Buffer.byteLength(raw, \"utf8\") > this.options.maxEntryBytes) {\n return;\n }\n\n await writeFile(tempPath, raw, \"utf8\");\n await rename(tempPath, filePath);\n }\n\n private async sweepIfNeeded(): Promise<void> {\n this.writesSinceSweep += 1;\n if (this.writesSinceSweep < this.options.sweepIntervalWrites) {\n return;\n }\n this.writesSinceSweep = 0;\n\n this.sweepPromise = this.sweepPromise\n .catch(() => {\n // Keep sweep queue alive across failures.\n })\n .then(async () => {\n await this.evictToSizeLimit();\n });\n await this.sweepPromise;\n }\n\n private async evictToSizeLimit(): Promise<void> {\n const nowMs = Date.now();\n let entries: Array<{ path: string; size: number; mtimeMs: number; bucket: string }>;\n try {\n const bucketEntries = await readdir(this.directoryPath, { withFileTypes: true });\n const bucketNames = bucketEntries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name);\n entries = (\n await Promise.all(\n bucketNames.map(async (bucket) => {\n const bucketPath = join(this.directoryPath, bucket);\n const files = await readdir(bucketPath, { withFileTypes: true });\n return await Promise.all(\n files\n .filter((entry) => entry.isFile() && entry.name.endsWith(\".json\"))\n .map(async (entry) => {\n const path = join(bucketPath, entry.name);\n const info = await stat(path);\n return {\n path,\n size: info.size,\n mtimeMs: info.mtimeMs,\n bucket,\n };\n }),\n );\n }),\n )\n )\n .flat()\n .filter((entry) => Number.isFinite(entry.size) && entry.size > 0);\n } catch {\n return;\n }\n\n if (this.options.maxAgeMsByBucket !== undefined) {\n const retained: typeof entries = [];\n let deletedAny = false;\n for (const entry of entries) {\n const maxAgeMs = this.options.maxAgeMsByBucket[entry.bucket];\n const expired =\n typeof maxAgeMs === \"number\" &&\n Number.isFinite(maxAgeMs) &&\n nowMs - entry.mtimeMs > maxAgeMs;\n if (!expired) {\n retained.push(entry);\n continue;\n }\n\n try {\n await unlink(entry.path);\n deletedAny = true;\n } catch {\n retained.push(entry);\n }\n }\n entries = retained;\n if (deletedAny) {\n this.byKey.clear();\n }\n }\n\n let totalBytes = entries.reduce((sum, entry) => sum + entry.size, 0);\n if (totalBytes <= this.options.maxBytes) {\n return;\n }\n\n entries.sort((a, b) => a.mtimeMs - b.mtimeMs);\n let deletedAny = false;\n for (const entry of entries) {\n if (totalBytes <= this.options.maxBytes) {\n break;\n }\n try {\n await unlink(entry.path);\n deletedAny = true;\n totalBytes -= entry.size;\n } catch {\n // Ignore eviction failures for individual files.\n }\n }\n if (deletedAny) {\n this.byKey.clear();\n }\n }\n\n async get<T>(key: string): Promise<CacheEntry<T> | null> {\n if (this.byKey.has(key)) {\n return (this.byKey.get(key) as CacheEntry<T> | null) ?? null;\n }\n\n try {\n const raw = await readFile(this.toEntryPath(key), \"utf8\");\n const parsed = parseCacheEntryPayload(JSON.parse(raw));\n if (parsed === null || parsed.key !== key) {\n this.byKey.set(key, null);\n return null;\n }\n\n const value = { fetchedAtMs: parsed.fetchedAtMs, value: parsed.value as T };\n this.byKey.set(key, value as CacheEntry<unknown>);\n return value;\n } catch {\n this.byKey.set(key, null);\n return null;\n }\n }\n\n async set<T>(key: string, entry: CacheEntry<T>): Promise<void> {\n const normalized = entry as CacheEntry<unknown>;\n this.byKey.set(key, normalized);\n\n const previous = this.inFlightWrites.get(key) ?? Promise.resolve();\n const next = previous\n .catch(() => {\n // Keep write chain active even after previous failures.\n })\n .then(async () => {\n await this.writeEntry(key, normalized);\n await this.sweepIfNeeded();\n });\n this.inFlightWrites.set(key, next);\n await next;\n }\n}\n","import type { DirectDependencySpec, LockedDependencyNode } from \"../domain/types.js\";\nimport { cachedFetch } from \"../infrastructure/cached-fetch.js\";\nimport { fetchJsonWithRetry } from \"../infrastructure/fetch-json-with-retry.js\";\nimport {\n getNpmMetadataCacheStore,\n getPackumentCacheTtlMs,\n toGraphPackumentCacheKey,\n} from \"../infrastructure/npm-metadata-cache.js\";\n\ntype NpmPackageManifest = {\n dependencies?: Record<string, string>;\n};\n\ntype NpmPackumentRaw = {\n \"dist-tags\"?: Record<string, string>;\n versions?: Record<string, NpmPackageManifest>;\n};\n\ntype NpmPackumentGraph = {\n \"dist-tags\"?: Record<string, string>;\n versionNames: readonly string[];\n dependenciesByVersion: Readonly<Record<string, Record<string, string>>>;\n};\n\ntype ParsedSemver = {\n major: number;\n minor: number;\n patch: number;\n prerelease: readonly (string | number)[];\n};\n\ntype ResolvedVersion = {\n version: string;\n resolution: \"exact\" | \"tag\" | \"range\" | \"latest\";\n fallbackUsed: boolean;\n};\n\ntype QueueItem = {\n name: string;\n requested: string | null;\n depth: number;\n};\n\nexport type ResolvedDirectDependency = {\n name: string;\n requestedRange: string;\n resolvedVersion: string;\n resolution: \"exact\" | \"tag\" | \"range\" | \"latest\";\n scope: \"prod\" | \"dev\";\n};\n\nexport type ResolveRegistryGraphResult = {\n nodes: readonly LockedDependencyNode[];\n directDependencies: readonly ResolvedDirectDependency[];\n assumptions: readonly string[];\n truncated: boolean;\n};\n\nexport type ResolveRegistryGraphOptions = {\n maxNodes: number;\n maxDepth: number;\n};\n\nconst MAX_RETRIES = 3;\nconst RETRY_BASE_DELAY_MS = 500;\nconst PACKUMENT_CACHE_STORE = getNpmMetadataCacheStore();\n\nconst parsePrerelease = (value: string | undefined): readonly (string | number)[] => {\n if (value === undefined || value.length === 0) {\n return [];\n }\n\n return value.split(\".\").map((part) => {\n const asNumber = Number.parseInt(part, 10);\n if (!Number.isNaN(asNumber) && `${asNumber}` === part) {\n return asNumber;\n }\n\n return part;\n });\n};\n\nconst parseSemver = (value: string): ParsedSemver | null => {\n const trimmed = value.trim();\n const semverMatch = trimmed.match(\n /^v?(\\d+)\\.(\\d+)\\.(\\d+)(?:-([0-9A-Za-z.-]+))?(?:\\+[0-9A-Za-z.-]+)?$/,\n );\n if (semverMatch === null) {\n return null;\n }\n\n const major = Number.parseInt(semverMatch[1] ?? \"\", 10);\n const minor = Number.parseInt(semverMatch[2] ?? \"\", 10);\n const patch = Number.parseInt(semverMatch[3] ?? \"\", 10);\n if (!Number.isFinite(major) || !Number.isFinite(minor) || !Number.isFinite(patch)) {\n return null;\n }\n\n return {\n major,\n minor,\n patch,\n prerelease: parsePrerelease(semverMatch[4]),\n };\n};\n\nconst compareIdentifier = (left: string | number, right: string | number): number => {\n if (typeof left === \"number\" && typeof right === \"number\") {\n return left - right;\n }\n\n if (typeof left === \"number\") {\n return -1;\n }\n\n if (typeof right === \"number\") {\n return 1;\n }\n\n return left.localeCompare(right);\n};\n\nconst compareSemver = (left: ParsedSemver, right: ParsedSemver): number => {\n if (left.major !== right.major) {\n return left.major - right.major;\n }\n if (left.minor !== right.minor) {\n return left.minor - right.minor;\n }\n if (left.patch !== right.patch) {\n return left.patch - right.patch;\n }\n\n if (left.prerelease.length === 0 && right.prerelease.length === 0) {\n return 0;\n }\n if (left.prerelease.length === 0) {\n return 1;\n }\n if (right.prerelease.length === 0) {\n return -1;\n }\n\n const maxLength = Math.max(left.prerelease.length, right.prerelease.length);\n for (let i = 0; i < maxLength; i += 1) {\n const leftPart = left.prerelease[i];\n const rightPart = right.prerelease[i];\n\n if (leftPart === undefined && rightPart === undefined) {\n return 0;\n }\n if (leftPart === undefined) {\n return -1;\n }\n if (rightPart === undefined) {\n return 1;\n }\n\n const diff = compareIdentifier(leftPart, rightPart);\n if (diff !== 0) {\n return diff;\n }\n }\n\n return 0;\n};\n\nconst isWildcardPart = (value: string | undefined): boolean =>\n value === undefined || value === \"*\" || value.toLowerCase() === \"x\";\n\nconst matchesPartialVersion = (version: ParsedSemver, token: string): boolean => {\n const normalized = token.trim().replace(/^v/, \"\");\n if (normalized === \"*\" || normalized.length === 0) {\n return true;\n }\n\n const [majorPart, minorPart, patchPart] = normalized.split(\".\");\n if (majorPart !== undefined && !isWildcardPart(majorPart)) {\n const major = Number.parseInt(majorPart, 10);\n if (!Number.isFinite(major) || major !== version.major) {\n return false;\n }\n }\n\n if (minorPart !== undefined && !isWildcardPart(minorPart)) {\n const minor = Number.parseInt(minorPart, 10);\n if (!Number.isFinite(minor) || minor !== version.minor) {\n return false;\n }\n }\n\n if (patchPart !== undefined && !isWildcardPart(patchPart)) {\n const patch = Number.parseInt(patchPart, 10);\n if (!Number.isFinite(patch) || patch !== version.patch) {\n return false;\n }\n }\n\n return true;\n};\n\nconst parseComparatorToken = (token: string): { operator: string; versionToken: string } => {\n const operators = [\">=\", \"<=\", \">\", \"<\", \"=\"];\n for (const operator of operators) {\n if (token.startsWith(operator)) {\n return {\n operator,\n versionToken: token.slice(operator.length).trim(),\n };\n }\n }\n\n return {\n operator: \"=\",\n versionToken: token.trim(),\n };\n};\n\nconst satisfiesComparator = (version: ParsedSemver, token: string): boolean | null => {\n if (token.length === 0 || token === \"*\") {\n return true;\n }\n\n if (token.startsWith(\"^\")) {\n const base = parseSemver(token.slice(1));\n if (base === null) {\n return null;\n }\n\n let upper: ParsedSemver;\n if (base.major > 0) {\n upper = { major: base.major + 1, minor: 0, patch: 0, prerelease: [] };\n } else if (base.minor > 0) {\n upper = { major: 0, minor: base.minor + 1, patch: 0, prerelease: [] };\n } else {\n upper = { major: 0, minor: 0, patch: base.patch + 1, prerelease: [] };\n }\n\n return compareSemver(version, base) >= 0 && compareSemver(version, upper) < 0;\n }\n\n if (token.startsWith(\"~\")) {\n const base = parseSemver(token.slice(1));\n if (base === null) {\n return null;\n }\n\n const upper: ParsedSemver = {\n major: base.major,\n minor: base.minor + 1,\n patch: 0,\n prerelease: [],\n };\n\n return compareSemver(version, base) >= 0 && compareSemver(version, upper) < 0;\n }\n\n const parsedComparator = parseComparatorToken(token);\n const hasWildcard = /(^|[.])(?:x|X|\\*)($|[.])/.test(parsedComparator.versionToken);\n if (hasWildcard) {\n if (parsedComparator.operator !== \"=\") {\n return null;\n }\n return matchesPartialVersion(version, parsedComparator.versionToken);\n }\n\n const parsedVersion = parseSemver(parsedComparator.versionToken);\n if (parsedVersion === null) {\n if (parsedComparator.operator !== \"=\") {\n return null;\n }\n\n return matchesPartialVersion(version, parsedComparator.versionToken);\n }\n\n const comparison = compareSemver(version, parsedVersion);\n switch (parsedComparator.operator) {\n case \">\":\n return comparison > 0;\n case \">=\":\n return comparison >= 0;\n case \"<\":\n return comparison < 0;\n case \"<=\":\n return comparison <= 0;\n case \"=\":\n return comparison === 0;\n default:\n return null;\n }\n};\n\nconst satisfiesRangeClause = (version: ParsedSemver, clause: string): boolean | null => {\n const hyphenMatch = clause.match(/^\\s*(.+?)\\s+-\\s+(.+?)\\s*$/);\n if (hyphenMatch !== null) {\n const lower = hyphenMatch[1];\n const upper = hyphenMatch[2];\n if (lower === undefined || upper === undefined) {\n return null;\n }\n\n const lowerResult = satisfiesComparator(version, `>=${lower}`);\n const upperResult = satisfiesComparator(version, `<=${upper}`);\n if (lowerResult === null || upperResult === null) {\n return null;\n }\n\n return lowerResult && upperResult;\n }\n\n const tokens = clause\n .split(/\\s+/)\n .map((token) => token.trim())\n .filter((token) => token.length > 0);\n\n if (tokens.length === 0) {\n return true;\n }\n\n for (const token of tokens) {\n const matched = satisfiesComparator(version, token);\n if (matched === null) {\n return null;\n }\n\n if (!matched) {\n return false;\n }\n }\n\n return true;\n};\n\nconst resolveRangeVersion = (versions: readonly string[], requested: string): string | null => {\n const clauses = requested\n .split(\"||\")\n .map((clause) => clause.trim())\n .filter((clause) => clause.length > 0);\n\n if (clauses.length === 0) {\n return null;\n }\n\n const parsedVersions = versions\n .map((version) => ({ version, parsed: parseSemver(version) }))\n .filter(\n (candidate): candidate is { version: string; parsed: ParsedSemver } =>\n candidate.parsed !== null,\n )\n .sort((a, b) => compareSemver(b.parsed, a.parsed));\n\n for (const candidate of parsedVersions) {\n let clauseMatched = false;\n let clauseUnsupported = false;\n\n for (const clause of clauses) {\n const matched = satisfiesRangeClause(candidate.parsed, clause);\n if (matched === null) {\n clauseUnsupported = true;\n continue;\n }\n\n if (matched) {\n clauseMatched = true;\n break;\n }\n }\n\n if (clauseMatched) {\n return candidate.version;\n }\n\n if (clauseUnsupported && clauses.length === 1) {\n return null;\n }\n }\n\n return null;\n};\n\nconst slimPackumentForGraph = (payload: NpmPackumentRaw): NpmPackumentGraph => {\n const versions = payload.versions ?? {};\n const dependenciesByVersion: Record<string, Record<string, string>> = {};\n const versionNames = Object.keys(versions);\n\n for (const [version, manifest] of Object.entries(versions)) {\n const dependenciesRaw = manifest?.dependencies ?? {};\n const dependencies: Record<string, string> = {};\n for (const [dependencyName, dependencyRange] of Object.entries(dependenciesRaw)) {\n if (dependencyName.length > 0 && dependencyRange.length > 0) {\n dependencies[dependencyName] = dependencyRange;\n }\n }\n\n if (Object.keys(dependencies).length > 0) {\n dependenciesByVersion[version] = dependencies;\n }\n }\n\n const slim: NpmPackumentGraph = {\n versionNames,\n dependenciesByVersion,\n };\n if (payload[\"dist-tags\"] !== undefined) {\n slim[\"dist-tags\"] = payload[\"dist-tags\"];\n }\n return slim;\n};\n\nconst fetchPackument = async (name: string): Promise<NpmPackumentGraph | null> => {\n const encodedName = encodeURIComponent(name);\n try {\n return await cachedFetch<NpmPackumentGraph>({\n key: toGraphPackumentCacheKey(name),\n ttlMs: getPackumentCacheTtlMs(),\n cacheStore: PACKUMENT_CACHE_STORE,\n fetchFresh: async () => {\n const payload = await fetchJsonWithRetry<NpmPackumentRaw>(\n `https://registry.npmjs.org/${encodedName}`,\n {\n retries: MAX_RETRIES,\n baseDelayMs: RETRY_BASE_DELAY_MS,\n },\n );\n if (payload === null) {\n return null;\n }\n return slimPackumentForGraph(payload);\n },\n });\n } catch {\n return null;\n }\n};\n\nconst resolveRequestedVersion = (\n packument: NpmPackumentGraph,\n requested: string | null,\n): ResolvedVersion | null => {\n const versionKeys = [...packument.versionNames];\n const versionSet = new Set(versionKeys);\n const tags = packument[\"dist-tags\"] ?? {};\n const latest = tags[\"latest\"];\n\n if (requested !== null && versionSet.has(requested)) {\n return {\n version: requested,\n resolution: \"exact\",\n fallbackUsed: false,\n };\n }\n\n if (requested !== null) {\n const tagged = tags[requested];\n if (tagged !== undefined && versionSet.has(tagged)) {\n return {\n version: tagged,\n resolution: \"tag\",\n fallbackUsed: false,\n };\n }\n }\n\n if (requested !== null) {\n const matched = resolveRangeVersion(versionKeys, requested);\n if (matched !== null && versionSet.has(matched)) {\n return {\n version: matched,\n resolution: \"range\",\n fallbackUsed: false,\n };\n }\n }\n\n if (latest !== undefined && versionSet.has(latest)) {\n return {\n version: latest,\n resolution: \"latest\",\n fallbackUsed: requested !== null,\n };\n }\n\n const semverSorted = versionKeys\n .map((version) => ({ version, parsed: parseSemver(version) }))\n .filter(\n (candidate): candidate is { version: string; parsed: ParsedSemver } =>\n candidate.parsed !== null,\n )\n .sort((a, b) => compareSemver(b.parsed, a.parsed))\n .map((candidate) => candidate.version);\n const fallbackVersion = semverSorted[0] ?? versionKeys.sort((a, b) => b.localeCompare(a))[0];\n if (fallbackVersion === undefined) {\n return null;\n }\n\n return {\n version: fallbackVersion,\n resolution: \"latest\",\n fallbackUsed: requested !== null,\n };\n};\n\nexport const resolveRegistryGraphFromDirectSpecs = async (\n directSpecs: readonly DirectDependencySpec[],\n options: ResolveRegistryGraphOptions,\n): Promise<ResolveRegistryGraphResult> => {\n const maxNodes = Math.max(1, options.maxNodes);\n const maxDepth = Math.max(0, options.maxDepth);\n\n const queue: QueueItem[] = directSpecs.map((spec) => ({\n name: spec.name,\n requested: spec.requestedRange,\n depth: 0,\n }));\n const scopeByName = new Map(directSpecs.map((spec) => [spec.name, spec.scope]));\n const requestedByName = new Map(directSpecs.map((spec) => [spec.name, spec.requestedRange]));\n const packumentByName = new Map<string, NpmPackumentGraph | null>();\n const nodesByKey = new Map<string, LockedDependencyNode>();\n const directByName = new Map<string, ResolvedDirectDependency>();\n const assumptions = new Set<string>();\n let truncated = false;\n\n while (queue.length > 0) {\n if (nodesByKey.size >= maxNodes) {\n truncated = true;\n assumptions.add(`Dependency graph truncated at ${maxNodes} nodes.`);\n break;\n }\n\n const item = queue.shift();\n if (item === undefined) {\n break;\n }\n\n let packument = packumentByName.get(item.name) ?? null;\n if (!packumentByName.has(item.name)) {\n packument = await fetchPackument(item.name);\n packumentByName.set(item.name, packument);\n }\n\n if (packument === null) {\n if (scopeByName.has(item.name)) {\n assumptions.add(`Could not resolve direct dependency from registry: ${item.name}.`);\n }\n continue;\n }\n\n const resolved = resolveRequestedVersion(packument, item.requested);\n if (resolved === null) {\n if (scopeByName.has(item.name)) {\n assumptions.add(`Could not resolve direct dependency version: ${item.name}.`);\n }\n continue;\n }\n\n if (scopeByName.has(item.name) && !directByName.has(item.name)) {\n directByName.set(item.name, {\n name: item.name,\n requestedRange: requestedByName.get(item.name) ?? \"latest\",\n resolvedVersion: resolved.version,\n resolution: resolved.resolution,\n scope: scopeByName.get(item.name) ?? \"prod\",\n });\n }\n\n if (resolved.fallbackUsed && item.requested !== null) {\n assumptions.add(\n `Resolved ${item.name}@${item.requested} to latest (${resolved.version}) because exact/tag/range match was unavailable.`,\n );\n }\n\n const nodeKey = `${item.name}@${resolved.version}`;\n if (nodesByKey.has(nodeKey)) {\n continue;\n }\n\n const manifestDependencies = packument.dependenciesByVersion[resolved.version] ?? {};\n const dependencies = Object.entries(manifestDependencies)\n .filter(\n ([dependencyName, dependencyRange]) =>\n dependencyName.length > 0 && dependencyRange.length > 0,\n )\n .sort((a, b) => a[0].localeCompare(b[0]));\n\n nodesByKey.set(nodeKey, {\n name: item.name,\n version: resolved.version,\n dependencies: dependencies.map(\n ([dependencyName, dependencyRange]) => `${dependencyName}@${dependencyRange}`,\n ),\n });\n\n if (item.depth >= maxDepth && dependencies.length > 0) {\n truncated = true;\n assumptions.add(`Dependency graph truncated at depth ${maxDepth}.`);\n continue;\n }\n\n for (const [dependencyName, dependencyRange] of dependencies) {\n if (nodesByKey.size + queue.length >= maxNodes) {\n truncated = true;\n assumptions.add(`Dependency graph truncated at ${maxNodes} nodes.`);\n break;\n }\n\n queue.push({\n name: dependencyName,\n requested: dependencyRange,\n depth: item.depth + 1,\n });\n }\n }\n\n return {\n nodes: [...nodesByKey.values()].sort(\n (a, b) => a.name.localeCompare(b.name) || a.version.localeCompare(b.version),\n ),\n directDependencies: [...directByName.values()].sort((a, b) => a.name.localeCompare(b.name)),\n assumptions: [...assumptions].sort((a, b) => a.localeCompare(b)),\n truncated,\n };\n};\n","import type { LockfileExtraction } from \"../domain/types.js\";\nimport { loadPackageJson, selectLockfile } from \"../infrastructure/fs-loader.js\";\nimport { parsePackageJson } from \"../parsing/package-json-loader.js\";\nimport { parseLockfileExtraction } from \"./parse-lockfile-extraction.js\";\nimport { resolveRegistryGraphFromDirectSpecs } from \"./resolve-registry-graph.js\";\n\ntype LockfileKind = \"pnpm\" | \"npm\" | \"npm-shrinkwrap\" | \"yarn\" | \"bun\";\n\nexport type PreparedDependencyExtraction =\n | {\n available: false;\n reason: \"package_json_not_found\" | \"lockfile_not_found\";\n }\n | {\n available: true;\n lockfileKind: LockfileKind;\n extraction: LockfileExtraction;\n };\n\nexport const prepareDependencyExtraction = async (\n repositoryPath: string,\n): Promise<PreparedDependencyExtraction> => {\n const packageJson = loadPackageJson(repositoryPath);\n if (packageJson === null) {\n return {\n available: false,\n reason: \"package_json_not_found\",\n };\n }\n\n const directSpecs = parsePackageJson(packageJson.raw);\n const lockfile = selectLockfile(repositoryPath);\n\n if (lockfile === null) {\n const resolvedGraph = await resolveRegistryGraphFromDirectSpecs(directSpecs, {\n maxNodes: 500,\n maxDepth: 8,\n });\n if (resolvedGraph.nodes.length === 0) {\n return {\n available: false,\n reason: \"lockfile_not_found\",\n };\n }\n\n return {\n available: true,\n lockfileKind: \"npm\",\n extraction: {\n kind: \"npm\",\n directDependencies: resolvedGraph.directDependencies.map((dependency) => ({\n name: dependency.name,\n requestedRange: dependency.requestedRange,\n scope: dependency.scope,\n })),\n nodes: resolvedGraph.nodes,\n },\n };\n }\n\n return {\n available: true,\n lockfileKind: lockfile.kind,\n extraction: parseLockfileExtraction(lockfile.kind, lockfile.raw, directSpecs),\n };\n};\n","import type { ExternalAnalysisSummary } from \"@codesentinel/core\";\nimport { buildExternalAnalysisSummary } from \"../domain/external-analysis.js\";\nimport {\n DEFAULT_EXTERNAL_ANALYSIS_CONFIG,\n type DependencyMetadataProvider,\n type ExternalAnalysisConfig,\n} from \"../domain/types.js\";\nimport { collectDependencyMetadata } from \"./collect-dependency-metadata.js\";\nimport { prepareDependencyExtraction } from \"./prepare-dependency-extraction.js\";\n\nexport type AnalyzeDependencyExposureInput = {\n repositoryPath: string;\n config?: Partial<ExternalAnalysisConfig>;\n};\n\nexport type DependencyExposureProgressEvent =\n | { stage: \"package_json_loaded\" }\n | { stage: \"lockfile_selected\"; kind: \"pnpm\" | \"npm\" | \"npm-shrinkwrap\" | \"yarn\" | \"bun\" }\n | { stage: \"lockfile_parsed\"; dependencyNodes: number; directDependencies: number }\n | { stage: \"metadata_fetch_started\"; total: number }\n | { stage: \"metadata_fetch_progress\"; completed: number; total: number; packageName: string }\n | { stage: \"metadata_fetch_completed\"; total: number }\n | { stage: \"summary_built\"; totalDependencies: number; directDependencies: number };\n\nconst withDefaults = (\n overrides: Partial<ExternalAnalysisConfig> | undefined,\n): ExternalAnalysisConfig => ({\n ...DEFAULT_EXTERNAL_ANALYSIS_CONFIG,\n ...overrides,\n});\n\nexport const analyzeDependencyExposure = async (\n input: AnalyzeDependencyExposureInput,\n metadataProvider: DependencyMetadataProvider,\n onProgress?: (event: DependencyExposureProgressEvent) => void,\n): Promise<ExternalAnalysisSummary> => {\n const config = withDefaults(input.config);\n\n try {\n const prepared = await prepareDependencyExtraction(input.repositoryPath);\n if (!prepared.available) {\n return {\n targetPath: input.repositoryPath,\n available: false,\n reason: prepared.reason,\n };\n }\n\n onProgress?.({ stage: \"package_json_loaded\" });\n onProgress?.({ stage: \"lockfile_selected\", kind: prepared.lockfileKind });\n\n const { extraction } = prepared;\n\n onProgress?.({\n stage: \"lockfile_parsed\",\n dependencyNodes: extraction.nodes.length,\n directDependencies: extraction.directDependencies.length,\n });\n onProgress?.({ stage: \"metadata_fetch_started\", total: extraction.nodes.length });\n const metadataEntries = await collectDependencyMetadata(\n extraction,\n metadataProvider,\n config.metadataRequestConcurrency,\n (event) =>\n onProgress?.({\n stage: \"metadata_fetch_progress\",\n completed: event.completed,\n total: event.total,\n packageName: event.packageName,\n }),\n );\n onProgress?.({ stage: \"metadata_fetch_completed\", total: extraction.nodes.length });\n\n const metadataByKey = new Map<string, Awaited<(typeof metadataEntries)[number]>[\"metadata\"]>();\n for (const entry of metadataEntries) {\n metadataByKey.set(entry.key, entry.metadata);\n }\n\n const summary = buildExternalAnalysisSummary(\n input.repositoryPath,\n extraction,\n metadataByKey,\n config,\n );\n if (summary.available) {\n onProgress?.({\n stage: \"summary_built\",\n totalDependencies: summary.metrics.totalDependencies,\n directDependencies: summary.metrics.directDependencies,\n });\n }\n\n return summary;\n } catch (error) {\n const message = error instanceof Error ? error.message : \"unknown\";\n if (message.includes(\"unsupported_lockfile_format\")) {\n return {\n targetPath: input.repositoryPath,\n available: false,\n reason: \"unsupported_lockfile_format\",\n };\n }\n\n return {\n targetPath: input.repositoryPath,\n available: false,\n reason: \"invalid_lockfile\",\n };\n }\n};\n","import type { ExternalAnalysisSummary } from \"@codesentinel/core\";\nimport { buildExternalAnalysisSummary } from \"../domain/external-analysis.js\";\nimport {\n DEFAULT_EXTERNAL_ANALYSIS_CONFIG,\n type DependencyMetadataProvider,\n type ExternalAnalysisConfig,\n type LockfileExtraction,\n} from \"../domain/types.js\";\nimport { resolveRegistryGraphFromDirectSpecs } from \"./resolve-registry-graph.js\";\n\nexport type AnalyzeDependencyCandidateInput = {\n dependency: string;\n config?: Partial<ExternalAnalysisConfig>;\n maxNodes?: number;\n maxDepth?: number;\n};\n\nexport type AnalyzeDependencyCandidateResult =\n | {\n available: false;\n reason: \"invalid_dependency_spec\" | \"package_not_found\";\n dependency: string;\n }\n | {\n available: true;\n dependency: {\n name: string;\n requested: string | null;\n resolvedVersion: string;\n resolution: \"exact\" | \"tag\" | \"range\" | \"latest\";\n };\n graph: {\n nodeCount: number;\n truncated: boolean;\n maxNodes: number;\n maxDepth: number;\n };\n assumptions: readonly string[];\n external: ExternalAnalysisSummary;\n };\n\nconst DEFAULT_MAX_NODES = 250;\nconst DEFAULT_MAX_DEPTH = 6;\n\nconst withDefaults = (\n overrides: Partial<ExternalAnalysisConfig> | undefined,\n): ExternalAnalysisConfig => ({\n ...DEFAULT_EXTERNAL_ANALYSIS_CONFIG,\n ...overrides,\n});\n\nconst parseDependencySpec = (value: string): { name: string; requested: string | null } | null => {\n const trimmed = value.trim();\n if (trimmed.length === 0 || /\\s/.test(trimmed)) {\n return null;\n }\n\n if (trimmed.startsWith(\"@\")) {\n const splitIndex = trimmed.lastIndexOf(\"@\");\n if (splitIndex <= 0) {\n return { name: trimmed, requested: null };\n }\n\n const name = trimmed.slice(0, splitIndex);\n const requested = trimmed.slice(splitIndex + 1);\n if (name.length === 0 || requested.length === 0) {\n return null;\n }\n\n return { name, requested };\n }\n\n const splitIndex = trimmed.lastIndexOf(\"@\");\n if (splitIndex <= 0) {\n return { name: trimmed, requested: null };\n }\n\n const name = trimmed.slice(0, splitIndex);\n const requested = trimmed.slice(splitIndex + 1);\n if (name.length === 0 || requested.length === 0) {\n return null;\n }\n\n return { name, requested };\n};\n\nconst mapWithConcurrency = async <T, R>(\n values: readonly T[],\n limit: number,\n handler: (value: T) => Promise<R>,\n): Promise<readonly R[]> => {\n const effectiveLimit = Math.max(1, limit);\n const workerCount = Math.min(effectiveLimit, values.length);\n const UNSET = Symbol(\"map_with_concurrency_unset\");\n const results = new Array<R | typeof UNSET>(values.length).fill(UNSET);\n let index = 0;\n\n const workers: Promise<void>[] = Array.from({ length: workerCount }, async () => {\n // This loop always terminates: each iteration advances `index`,\n // and workers return once `index >= values.length`.\n while (true) {\n const current = index;\n index += 1;\n if (current >= values.length) {\n return;\n }\n\n const value = values[current] as T;\n results[current] = await handler(value);\n }\n });\n\n await Promise.all(workers);\n if (results.some((value) => value === UNSET)) {\n throw new Error(\"map_with_concurrency_incomplete_results\");\n }\n return results as R[];\n};\n\nexport const analyzeDependencyCandidate = async (\n input: AnalyzeDependencyCandidateInput,\n metadataProvider: DependencyMetadataProvider,\n): Promise<AnalyzeDependencyCandidateResult> => {\n const parsed = parseDependencySpec(input.dependency);\n if (parsed === null) {\n return {\n available: false,\n reason: \"invalid_dependency_spec\",\n dependency: input.dependency,\n };\n }\n\n const maxNodes = Math.max(1, input.maxNodes ?? DEFAULT_MAX_NODES);\n const maxDepth = Math.max(0, input.maxDepth ?? DEFAULT_MAX_DEPTH);\n const config = withDefaults(input.config);\n\n const graph = await resolveRegistryGraphFromDirectSpecs(\n [\n {\n name: parsed.name,\n requestedRange: parsed.requested ?? \"latest\",\n scope: \"prod\",\n },\n ],\n { maxNodes, maxDepth },\n );\n\n const direct = graph.directDependencies.find((dependency) => dependency.name === parsed.name);\n if (direct === undefined || graph.nodes.length === 0) {\n return {\n available: false,\n reason: \"package_not_found\",\n dependency: input.dependency,\n };\n }\n\n const metadataEntries = await mapWithConcurrency(\n graph.nodes,\n config.metadataRequestConcurrency,\n async (node) => ({\n key: `${node.name}@${node.version}`,\n metadata: await metadataProvider.getMetadata(node.name, node.version, {\n directDependency: node.name === parsed.name,\n }),\n }),\n );\n\n const metadataByKey = new Map<string, Awaited<(typeof metadataEntries)[number]>[\"metadata\"]>();\n for (const entry of metadataEntries) {\n metadataByKey.set(entry.key, entry.metadata);\n }\n\n const extraction: LockfileExtraction = {\n kind: \"npm\",\n directDependencies: [\n {\n name: parsed.name,\n requestedRange: parsed.requested ?? \"latest\",\n scope: \"prod\",\n },\n ],\n nodes: graph.nodes,\n };\n\n const external = buildExternalAnalysisSummary(\n `npm:${parsed.name}`,\n extraction,\n metadataByKey,\n config,\n );\n\n return {\n available: true,\n dependency: {\n name: parsed.name,\n requested: parsed.requested,\n resolvedVersion: direct.resolvedVersion,\n resolution: direct.resolution,\n },\n graph: {\n nodeCount: graph.nodes.length,\n truncated: graph.truncated,\n maxNodes,\n maxDepth,\n },\n assumptions: graph.assumptions,\n external,\n };\n};\n","import type {\n DependencyMetadata,\n DependencyMetadataProvider,\n DependencyMetadataRequestContext,\n} from \"../domain/types.js\";\nimport { cachedFetch } from \"./cached-fetch.js\";\nimport { fetchJsonWithRetry } from \"./fetch-json-with-retry.js\";\nimport {\n getNpmMetadataCacheStore,\n getPackumentCacheTtlMs,\n getWeeklyDownloadsCacheTtlMs,\n toMetadataPackumentCacheKey,\n toWeeklyDownloadsCacheKey,\n} from \"./npm-metadata-cache.js\";\n\ntype NpmPackagePayload = {\n time?: Record<string, string>;\n maintainers?: Array<{ name?: string; email?: string }>;\n};\n\ntype NpmDownloadsPayload = {\n downloads?: number;\n};\n\nconst ONE_DAY_MS = 24 * 60 * 60 * 1000;\nconst MAX_RETRIES = 3;\nconst RETRY_BASE_DELAY_MS = 500;\nconst round4 = (value: number): number => Number(value.toFixed(4));\n\nconst parseDate = (iso: string | undefined): number | null => {\n if (iso === undefined) {\n return null;\n }\n\n const value = Date.parse(iso);\n return Number.isNaN(value) ? null : value;\n};\n\nexport class NpmRegistryMetadataProvider implements DependencyMetadataProvider {\n private readonly cache = new Map<string, DependencyMetadata | null>();\n private readonly cacheStore = getNpmMetadataCacheStore();\n\n private async fetchWeeklyDownloads(name: string): Promise<number | null> {\n const encodedName = encodeURIComponent(name);\n const payload = await cachedFetch<NpmDownloadsPayload>({\n key: toWeeklyDownloadsCacheKey(name),\n ttlMs: getWeeklyDownloadsCacheTtlMs(),\n cacheStore: this.cacheStore,\n fetchFresh: async () =>\n await fetchJsonWithRetry<NpmDownloadsPayload>(\n `https://api.npmjs.org/downloads/point/last-week/${encodedName}`,\n { retries: MAX_RETRIES, baseDelayMs: RETRY_BASE_DELAY_MS },\n ),\n });\n if (payload === null) {\n return null;\n }\n\n const downloads = payload.downloads;\n if (typeof downloads !== \"number\" || Number.isNaN(downloads) || downloads < 0) {\n return null;\n }\n\n return Math.floor(downloads);\n }\n\n async getMetadata(\n name: string,\n version: string,\n context: DependencyMetadataRequestContext,\n ): Promise<DependencyMetadata | null> {\n const key = `${name}@${version}`;\n if (this.cache.has(key)) {\n return this.cache.get(key) ?? null;\n }\n\n try {\n const encodedName = encodeURIComponent(name);\n const payload = await cachedFetch<NpmPackagePayload>({\n key: toMetadataPackumentCacheKey(name),\n ttlMs: getPackumentCacheTtlMs(),\n cacheStore: this.cacheStore,\n fetchFresh: async () => {\n const fresh = await fetchJsonWithRetry<NpmPackagePayload>(\n `https://registry.npmjs.org/${encodedName}`,\n {\n retries: MAX_RETRIES,\n baseDelayMs: RETRY_BASE_DELAY_MS,\n },\n );\n if (fresh === null) {\n return null;\n }\n const slim: NpmPackagePayload = {};\n if (fresh.time !== undefined) {\n slim.time = fresh.time;\n }\n if (fresh.maintainers !== undefined) {\n slim.maintainers = fresh.maintainers;\n }\n return slim;\n },\n });\n if (payload === null) {\n this.cache.set(key, null);\n return null;\n }\n const timeEntries = payload.time ?? {};\n\n const publishDates = Object.entries(timeEntries)\n .filter(([tag]) => tag !== \"created\" && tag !== \"modified\")\n .map(([, date]) => parseDate(date))\n .filter((value): value is number => value !== null)\n .sort((a, b) => a - b);\n\n const modifiedAt = parseDate(timeEntries[\"modified\"]);\n const now = Date.now();\n const daysSinceLastRelease =\n modifiedAt === null ? null : Math.max(0, round4((now - modifiedAt) / ONE_DAY_MS));\n\n let releaseFrequencyDays: number | null = null;\n if (publishDates.length >= 2) {\n const totalIntervals = publishDates.length - 1;\n let sum = 0;\n for (let i = 1; i < publishDates.length; i += 1) {\n const current = publishDates[i];\n const previous = publishDates[i - 1];\n if (current !== undefined && previous !== undefined) {\n sum += current - previous;\n }\n }\n\n releaseFrequencyDays = round4(sum / totalIntervals / ONE_DAY_MS);\n }\n\n const maintainers = payload.maintainers ?? [];\n const maintainerCount = maintainers.length > 0 ? maintainers.length : null;\n const weeklyDownloads = context.directDependency\n ? await this.fetchWeeklyDownloads(name).catch(() => null)\n : null;\n\n const metadata: DependencyMetadata = {\n name,\n version,\n weeklyDownloads,\n maintainerCount,\n releaseFrequencyDays,\n daysSinceLastRelease,\n repositoryActivity30d: null,\n busFactor: null,\n };\n\n this.cache.set(key, metadata);\n return metadata;\n } catch {\n this.cache.set(key, null);\n return null;\n }\n }\n}\n","import type { DependencyMetadata, DependencyMetadataProvider } from \"../domain/types.js\";\n\nexport class NoopMetadataProvider implements DependencyMetadataProvider {\n getMetadata(\n _name: string,\n _version: string,\n _context: { directDependency: boolean },\n ): Promise<DependencyMetadata | null> {\n return Promise.resolve(null);\n }\n}\n","import type { ExternalAnalysisSummary } from \"@codesentinel/core\";\nimport {\n analyzeDependencyExposure,\n type DependencyExposureProgressEvent,\n type AnalyzeDependencyExposureInput,\n} from \"./application/analyze-dependency-exposure.js\";\nimport {\n analyzeDependencyCandidate,\n type AnalyzeDependencyCandidateInput,\n type AnalyzeDependencyCandidateResult,\n} from \"./application/analyze-dependency-candidate.js\";\nimport { NpmRegistryMetadataProvider } from \"./infrastructure/npm-registry-metadata-provider.js\";\nimport { NoopMetadataProvider } from \"./infrastructure/noop-metadata-provider.js\";\n\nexport type { AnalyzeDependencyExposureInput } from \"./application/analyze-dependency-exposure.js\";\nexport type { DependencyExposureProgressEvent } from \"./application/analyze-dependency-exposure.js\";\nexport type {\n AnalyzeDependencyCandidateInput,\n AnalyzeDependencyCandidateResult,\n} from \"./application/analyze-dependency-candidate.js\";\n\nexport const analyzeDependencyExposureFromProject = async (\n input: AnalyzeDependencyExposureInput,\n onProgress?: (event: DependencyExposureProgressEvent) => void,\n): Promise<ExternalAnalysisSummary> => {\n const metadataProvider =\n process.env[\"CODESENTINEL_EXTERNAL_METADATA\"] === \"none\"\n ? new NoopMetadataProvider()\n : new NpmRegistryMetadataProvider();\n\n return analyzeDependencyExposure(input, metadataProvider, onProgress);\n};\n\nexport const analyzeDependencyCandidateFromRegistry = async (\n input: AnalyzeDependencyCandidateInput,\n): Promise<AnalyzeDependencyCandidateResult> => {\n const metadataProvider =\n process.env[\"CODESENTINEL_EXTERNAL_METADATA\"] === \"none\"\n ? new NoopMetadataProvider()\n : new NpmRegistryMetadataProvider();\n\n return analyzeDependencyCandidate(input, metadataProvider);\n};\n","import type {\n AnalyzeSummary,\n RepositoryHealthSummary,\n RiskFactorTrace,\n RiskTrace,\n} from \"@codesentinel/core\";\n\nexport const SNAPSHOT_SCHEMA_VERSION = \"codesentinel.snapshot.v1\" as const;\nexport const REPORT_SCHEMA_VERSION = \"codesentinel.report.v1\" as const;\nexport const RISK_MODEL_VERSION = \"deterministic-v1\" as const;\n\nexport type SnapshotSchemaVersion = typeof SNAPSHOT_SCHEMA_VERSION;\nexport type ReportSchemaVersion = typeof REPORT_SCHEMA_VERSION;\n\nexport type RiskTier = \"low\" | \"moderate\" | \"elevated\" | \"high\" | \"very_high\";\nexport type HealthTier = \"critical\" | \"weak\" | \"fair\" | \"good\" | \"excellent\";\n\nexport type ReportFormat = \"json\" | \"text\" | \"md\";\n\nexport type CodeSentinelSnapshot = {\n schemaVersion: SnapshotSchemaVersion;\n generatedAt: string;\n riskModelVersion: string;\n source: {\n targetPath: string;\n };\n analysis: AnalyzeSummary;\n trace?: RiskTrace;\n analysisConfig?: Readonly<Record<string, string | number | boolean | null>>;\n};\n\nexport type RenderedFactor = {\n id: string;\n label: string;\n contribution: number;\n confidence: number;\n evidence: string;\n};\n\nexport type HotspotReportItem = {\n target: string;\n score: number;\n normalizedScore: number;\n topFactors: readonly RenderedFactor[];\n suggestedActions: readonly string[];\n biggestLevers: readonly string[];\n};\n\nexport type RepositoryDimensionScores = {\n structural: number | null;\n evolution: number | null;\n external: number | null;\n interactions: number | null;\n};\n\nexport type SnapshotDiff = {\n riskScoreDelta: number;\n normalizedScoreDelta: number;\n fileRiskChanges: ReadonlyArray<{ target: string; before: number; after: number; delta: number }>;\n moduleRiskChanges: ReadonlyArray<{\n target: string;\n before: number;\n after: number;\n delta: number;\n }>;\n newHotspots: readonly string[];\n resolvedHotspots: readonly string[];\n newCycles: readonly string[];\n resolvedCycles: readonly string[];\n externalChanges: {\n highRiskAdded: readonly string[];\n highRiskRemoved: readonly string[];\n singleMaintainerAdded: readonly string[];\n singleMaintainerRemoved: readonly string[];\n abandonedAdded: readonly string[];\n abandonedRemoved: readonly string[];\n };\n};\n\nexport type CodeSentinelReport = {\n schemaVersion: ReportSchemaVersion;\n generatedAt: string;\n repository: {\n targetPath: string;\n riskScore: number;\n normalizedScore: number;\n riskTier: RiskTier;\n healthTier: HealthTier;\n confidence: number | null;\n dimensionScores: RepositoryDimensionScores;\n };\n health: RepositoryHealthSummary;\n hotspots: readonly HotspotReportItem[];\n structural: {\n cycleCount: number;\n cycles: readonly string[];\n fragileClusters: ReadonlyArray<{\n id: string;\n kind: string;\n score: number;\n files: readonly string[];\n }>;\n };\n external:\n | {\n available: false;\n reason: string;\n }\n | {\n available: true;\n highRiskDependencies: readonly string[];\n highRiskDevelopmentDependencies: readonly string[];\n singleMaintainerDependencies: readonly string[];\n abandonedDependencies: readonly string[];\n };\n appendix: {\n snapshotSchemaVersion: string;\n riskModelVersion: string;\n timestamp: string;\n normalization: string;\n analysisConfig?: Readonly<Record<string, string | number | boolean | null>>;\n };\n diff?: SnapshotDiff;\n};\n\nexport const round4 = (value: number): number => Number(value.toFixed(4));\n\nexport const toRiskTier = (score: number): RiskTier => {\n if (score < 20) {\n return \"low\";\n }\n if (score < 40) {\n return \"moderate\";\n }\n if (score < 60) {\n return \"elevated\";\n }\n if (score < 80) {\n return \"high\";\n }\n return \"very_high\";\n};\n\nexport const toHealthTier = (score: number): HealthTier => {\n if (score < 20) {\n return \"critical\";\n }\n if (score < 40) {\n return \"weak\";\n }\n if (score < 60) {\n return \"fair\";\n }\n if (score < 80) {\n return \"good\";\n }\n return \"excellent\";\n};\n\nconst factorLabelById: Readonly<Record<string, string>> = {\n \"repository.structural\": \"Structural complexity\",\n \"repository.evolution\": \"Change volatility\",\n \"repository.external\": \"External dependency pressure\",\n \"repository.composite.interactions\": \"Intersection amplification\",\n \"file.structural\": \"File structural complexity\",\n \"file.evolution\": \"File change volatility\",\n \"file.external\": \"File external pressure\",\n \"file.composite.interactions\": \"File interaction amplification\",\n \"module.average_file_risk\": \"Average file risk\",\n \"module.peak_file_risk\": \"Peak file risk\",\n \"dependency.signals\": \"Dependency risk signals\",\n \"dependency.staleness\": \"Dependency staleness\",\n \"dependency.maintainer_concentration\": \"Maintainer concentration\",\n \"dependency.topology\": \"Dependency topology pressure\",\n \"dependency.bus_factor\": \"Dependency bus factor\",\n \"dependency.popularity_dampening\": \"Popularity dampening\",\n};\n\nexport const factorLabel = (factorId: string): string => factorLabelById[factorId] ?? factorId;\n\nexport const summarizeEvidence = (factor: RiskFactorTrace): string => {\n const entries = Object.entries(factor.rawMetrics)\n .filter(([, value]) => value !== null)\n .sort((a, b) => a[0].localeCompare(b[0]))\n .slice(0, 3)\n .map(([key, value]) => `${key}=${value}`);\n\n if (entries.length > 0) {\n return entries.join(\", \");\n }\n\n const evidence = [...factor.evidence]\n .map((entry) => {\n if (entry.kind === \"file_metric\") {\n return `${entry.target}:${entry.metric}`;\n }\n if (entry.kind === \"dependency_metric\") {\n return `${entry.target}:${entry.metric}`;\n }\n if (entry.kind === \"repository_metric\") {\n return entry.metric;\n }\n if (entry.kind === \"graph_cycle\") {\n return `cycle:${entry.cycleId}`;\n }\n return `${entry.fileA}<->${entry.fileB}`;\n })\n .sort((a, b) => a.localeCompare(b));\n\n return evidence.join(\", \");\n};\n","import type { CodeSentinelSnapshot, SnapshotDiff } from \"./domain.js\";\nimport { round4 } from \"./domain.js\";\n\ntype ScoreEntry = { target: string; before: number; after: number; delta: number };\n\nconst diffSets = (\n current: readonly string[],\n baseline: readonly string[],\n): { added: readonly string[]; removed: readonly string[] } => {\n const currentSet = new Set(current);\n const baselineSet = new Set(baseline);\n\n const added = [...currentSet]\n .filter((item) => !baselineSet.has(item))\n .sort((a, b) => a.localeCompare(b));\n const removed = [...baselineSet]\n .filter((item) => !currentSet.has(item))\n .sort((a, b) => a.localeCompare(b));\n\n return { added, removed };\n};\n\nconst diffScoreMap = (\n current: ReadonlyMap<string, number>,\n baseline: ReadonlyMap<string, number>,\n): readonly ScoreEntry[] => {\n const keys = [...new Set([...current.keys(), ...baseline.keys()])].sort((a, b) =>\n a.localeCompare(b),\n );\n\n return keys\n .map((key) => {\n const before = baseline.get(key) ?? 0;\n const after = current.get(key) ?? 0;\n const delta = round4(after - before);\n return {\n target: key,\n before: round4(before),\n after: round4(after),\n delta,\n };\n })\n .filter((entry) => entry.delta !== 0)\n .sort((a, b) => Math.abs(b.delta) - Math.abs(a.delta) || a.target.localeCompare(b.target));\n};\n\nconst cycleKey = (nodes: readonly string[]): string =>\n [...nodes].sort((a, b) => a.localeCompare(b)).join(\" -> \");\n\nexport const compareSnapshots = (\n current: CodeSentinelSnapshot,\n baseline: CodeSentinelSnapshot,\n): SnapshotDiff => {\n const currentFileScores = new Map(\n current.analysis.risk.fileScores.map((item) => [item.file, item.score]),\n );\n const baselineFileScores = new Map(\n baseline.analysis.risk.fileScores.map((item) => [item.file, item.score]),\n );\n\n const currentModuleScores = new Map(\n current.analysis.risk.moduleScores.map((item) => [item.module, item.score]),\n );\n const baselineModuleScores = new Map(\n baseline.analysis.risk.moduleScores.map((item) => [item.module, item.score]),\n );\n\n const currentHotspots = current.analysis.risk.hotspots.slice(0, 10).map((item) => item.file);\n const baselineHotspots = baseline.analysis.risk.hotspots.slice(0, 10).map((item) => item.file);\n\n const currentCycles = current.analysis.structural.cycles.map((cycle) => cycleKey(cycle.nodes));\n const baselineCycles = baseline.analysis.structural.cycles.map((cycle) => cycleKey(cycle.nodes));\n\n const currentExternal = current.analysis.external.available\n ? current.analysis.external\n : {\n highRiskDependencies: [] as string[],\n singleMaintainerDependencies: [] as string[],\n abandonedDependencies: [] as string[],\n };\n const baselineExternal = baseline.analysis.external.available\n ? baseline.analysis.external\n : {\n highRiskDependencies: [] as string[],\n singleMaintainerDependencies: [] as string[],\n abandonedDependencies: [] as string[],\n };\n\n const highRisk = diffSets(\n currentExternal.highRiskDependencies,\n baselineExternal.highRiskDependencies,\n );\n const singleMaintainer = diffSets(\n currentExternal.singleMaintainerDependencies,\n baselineExternal.singleMaintainerDependencies,\n );\n const abandoned = diffSets(\n currentExternal.abandonedDependencies,\n baselineExternal.abandonedDependencies,\n );\n\n const hotspots = diffSets(currentHotspots, baselineHotspots);\n const cycles = diffSets(currentCycles, baselineCycles);\n\n return {\n riskScoreDelta: round4(current.analysis.risk.riskScore - baseline.analysis.risk.riskScore),\n normalizedScoreDelta: round4(\n current.analysis.risk.normalizedScore - baseline.analysis.risk.normalizedScore,\n ),\n fileRiskChanges: diffScoreMap(currentFileScores, baselineFileScores),\n moduleRiskChanges: diffScoreMap(currentModuleScores, baselineModuleScores),\n newHotspots: hotspots.added,\n resolvedHotspots: hotspots.removed,\n newCycles: cycles.added,\n resolvedCycles: cycles.removed,\n externalChanges: {\n highRiskAdded: highRisk.added,\n highRiskRemoved: highRisk.removed,\n singleMaintainerAdded: singleMaintainer.added,\n singleMaintainerRemoved: singleMaintainer.removed,\n abandonedAdded: abandoned.added,\n abandonedRemoved: abandoned.removed,\n },\n };\n};\n","import type { TargetTrace } from \"@codesentinel/core\";\nimport {\n REPORT_SCHEMA_VERSION,\n factorLabel,\n round4,\n toHealthTier,\n summarizeEvidence,\n toRiskTier,\n type CodeSentinelReport,\n type CodeSentinelSnapshot,\n type HotspotReportItem,\n type RepositoryDimensionScores,\n type RenderedFactor,\n type SnapshotDiff,\n} from \"./domain.js\";\n\nconst findTraceTarget = (\n snapshot: CodeSentinelSnapshot,\n targetType: TargetTrace[\"targetType\"],\n targetId: string,\n): TargetTrace | undefined =>\n snapshot.trace?.targets.find(\n (target) => target.targetType === targetType && target.targetId === targetId,\n );\n\nconst toRenderedFactors = (target: TargetTrace | undefined): readonly RenderedFactor[] => {\n if (target === undefined) {\n return [];\n }\n\n return [...target.factors]\n .sort((a, b) => b.contribution - a.contribution || a.factorId.localeCompare(b.factorId))\n .slice(0, 4)\n .map((factor) => ({\n id: factor.factorId,\n label: factorLabel(factor.factorId),\n contribution: round4(factor.contribution),\n confidence: round4(factor.confidence),\n evidence: summarizeEvidence(factor),\n }));\n};\n\nconst suggestedActions = (target: TargetTrace | undefined): readonly string[] => {\n if (target === undefined) {\n return [];\n }\n\n const actions: string[] = [];\n for (const lever of target.reductionLevers) {\n switch (lever.factorId) {\n case \"file.evolution\":\n case \"repository.evolution\":\n actions.push(\"Reduce recent churn and volatile edit frequency in this area.\");\n break;\n case \"file.structural\":\n case \"repository.structural\":\n actions.push(\"Reduce fan-in/fan-out concentration and simplify deep dependency paths.\");\n break;\n case \"file.composite.interactions\":\n case \"repository.composite.interactions\":\n actions.push(\"Stabilize central files before concurrent structural changes.\");\n break;\n case \"file.external\":\n case \"repository.external\":\n actions.push(\"Review external dependency pressure for this hotspot.\");\n break;\n default:\n actions.push(`Reduce ${factorLabel(lever.factorId).toLowerCase()} influence.`);\n break;\n }\n }\n\n return [...new Set(actions)].slice(0, 3);\n};\n\nconst hotspotItems = (snapshot: CodeSentinelSnapshot): readonly HotspotReportItem[] =>\n snapshot.analysis.risk.hotspots.slice(0, 10).map((hotspot) => {\n const fileScore = snapshot.analysis.risk.fileScores.find((item) => item.file === hotspot.file);\n const traceTarget = findTraceTarget(snapshot, \"file\", hotspot.file);\n const factors = toRenderedFactors(traceTarget);\n\n return {\n target: hotspot.file,\n score: hotspot.score,\n normalizedScore: fileScore?.normalizedScore ?? round4(hotspot.score / 100),\n topFactors: factors,\n suggestedActions: suggestedActions(traceTarget),\n biggestLevers: (traceTarget?.reductionLevers ?? [])\n .slice(0, 3)\n .map((lever) => `${factorLabel(lever.factorId)} (${lever.estimatedImpact})`),\n };\n });\n\nconst repositoryConfidence = (snapshot: CodeSentinelSnapshot): number | null => {\n const target = findTraceTarget(snapshot, \"repository\", snapshot.analysis.structural.targetPath);\n if (target === undefined || target.factors.length === 0) {\n return null;\n }\n\n const weight = target.factors.reduce((sum, factor) => sum + factor.contribution, 0);\n if (weight <= 0) {\n return null;\n }\n\n const weighted = target.factors.reduce(\n (sum, factor) => sum + factor.confidence * factor.contribution,\n 0,\n );\n return round4(weighted / weight);\n};\n\nconst repositoryDimensionScores = (snapshot: CodeSentinelSnapshot): RepositoryDimensionScores => {\n const target = findTraceTarget(snapshot, \"repository\", snapshot.analysis.structural.targetPath);\n if (target === undefined) {\n return {\n structural: null,\n evolution: null,\n external: null,\n interactions: null,\n };\n }\n\n const structural = target.factors.find((factor) => factor.factorId === \"repository.structural\");\n const evolution = target.factors.find((factor) => factor.factorId === \"repository.evolution\");\n const external = target.factors.find((factor) => factor.factorId === \"repository.external\");\n const interactions = target.factors.find(\n (factor) => factor.factorId === \"repository.composite.interactions\",\n );\n\n const interactionScore =\n interactions === undefined\n ? null\n : round4(\n ((interactions.rawMetrics[\"structuralEvolution\"] ?? 0) +\n (interactions.rawMetrics[\"centralInstability\"] ?? 0) +\n (interactions.rawMetrics[\"dependencyAmplification\"] ?? 0)) *\n 100,\n );\n\n return {\n structural:\n structural === undefined\n ? null\n : round4((structural.rawMetrics[\"structuralDimension\"] ?? 0) * 100),\n evolution:\n evolution === undefined\n ? null\n : round4((evolution.rawMetrics[\"evolutionDimension\"] ?? 0) * 100),\n external:\n external === undefined ? null : round4((external.rawMetrics[\"externalDimension\"] ?? 0) * 100),\n interactions: interactionScore,\n };\n};\n\nexport const createReport = (\n snapshot: CodeSentinelSnapshot,\n diff?: SnapshotDiff,\n): CodeSentinelReport => {\n const external = snapshot.analysis.external;\n\n return {\n schemaVersion: REPORT_SCHEMA_VERSION,\n generatedAt: new Date().toISOString(),\n repository: {\n targetPath: snapshot.analysis.structural.targetPath,\n riskScore: snapshot.analysis.risk.riskScore,\n normalizedScore: snapshot.analysis.risk.normalizedScore,\n riskTier: toRiskTier(snapshot.analysis.risk.riskScore),\n healthTier: toHealthTier(snapshot.analysis.health.healthScore),\n confidence: repositoryConfidence(snapshot),\n dimensionScores: repositoryDimensionScores(snapshot),\n },\n health: snapshot.analysis.health,\n hotspots: hotspotItems(snapshot),\n structural: {\n cycleCount: snapshot.analysis.structural.metrics.cycleCount,\n cycles: snapshot.analysis.structural.cycles.map((cycle) =>\n [...cycle.nodes].sort((a, b) => a.localeCompare(b)).join(\" -> \"),\n ),\n fragileClusters: snapshot.analysis.risk.fragileClusters.map((cluster) => ({\n id: cluster.id,\n kind: cluster.kind,\n score: cluster.score,\n files: [...cluster.files].sort((a, b) => a.localeCompare(b)),\n })),\n },\n external: !external.available\n ? {\n available: false,\n reason: external.reason,\n }\n : {\n available: true,\n highRiskDependencies: [...external.highRiskDependencies].sort((a, b) =>\n a.localeCompare(b),\n ),\n highRiskDevelopmentDependencies: [...external.highRiskDevelopmentDependencies].sort(\n (a, b) => a.localeCompare(b),\n ),\n singleMaintainerDependencies: [...external.singleMaintainerDependencies].sort((a, b) =>\n a.localeCompare(b),\n ),\n abandonedDependencies: [...external.abandonedDependencies].sort((a, b) =>\n a.localeCompare(b),\n ),\n },\n appendix: {\n snapshotSchemaVersion: snapshot.schemaVersion,\n riskModelVersion: snapshot.riskModelVersion,\n timestamp: snapshot.generatedAt,\n normalization:\n \"Scores are deterministic 0-100 outputs from risk-engine normalized factors and interaction terms.\",\n ...(snapshot.analysisConfig === undefined ? {} : { analysisConfig: snapshot.analysisConfig }),\n },\n ...(diff === undefined ? {} : { diff }),\n };\n};\n","import type { CodeSentinelReport } from \"./domain.js\";\n\nconst renderTextDiff = (report: CodeSentinelReport): string[] => {\n if (report.diff === undefined) {\n return [];\n }\n\n return [\n \"\",\n \"Diff\",\n ` riskScoreDelta: ${report.diff.riskScoreDelta}`,\n ` normalizedScoreDelta: ${report.diff.normalizedScoreDelta}`,\n ` newHotspots: ${report.diff.newHotspots.join(\", \") || \"none\"}`,\n ` resolvedHotspots: ${report.diff.resolvedHotspots.join(\", \") || \"none\"}`,\n ` newCycles: ${report.diff.newCycles.join(\", \") || \"none\"}`,\n ` resolvedCycles: ${report.diff.resolvedCycles.join(\", \") || \"none\"}`,\n ];\n};\n\nexport const renderTextReport = (report: CodeSentinelReport): string => {\n const lines: string[] = [];\n lines.push(\"Repository Summary\");\n lines.push(` target: ${report.repository.targetPath}`);\n lines.push(` riskScore: ${report.repository.riskScore}`);\n lines.push(` normalizedScore: ${report.repository.normalizedScore}`);\n lines.push(` riskTier: ${report.repository.riskTier}`);\n lines.push(` healthTier: ${report.repository.healthTier}`);\n lines.push(` confidence: ${report.repository.confidence ?? \"n/a\"}`);\n\n lines.push(\"\");\n lines.push(\"Dimension Scores (0-100)\");\n lines.push(` structural: ${report.repository.dimensionScores.structural ?? \"n/a\"}`);\n lines.push(` evolution: ${report.repository.dimensionScores.evolution ?? \"n/a\"}`);\n lines.push(` external: ${report.repository.dimensionScores.external ?? \"n/a\"}`);\n lines.push(` interactions: ${report.repository.dimensionScores.interactions ?? \"n/a\"}`);\n\n lines.push(\"\");\n lines.push(\"Health Summary\");\n lines.push(` healthScore: ${report.health.healthScore}`);\n lines.push(` normalizedScore: ${report.health.normalizedScore}`);\n lines.push(` modularity: ${report.health.dimensions.modularity}`);\n lines.push(` changeHygiene: ${report.health.dimensions.changeHygiene}`);\n lines.push(` testHealth: ${report.health.dimensions.testHealth}`);\n lines.push(` ownershipDistribution: ${report.health.dimensions.ownershipDistribution}`);\n lines.push(\" topIssues:\");\n for (const issue of report.health.topIssues.slice(0, 5)) {\n const ruleSuffix = issue.ruleId === undefined ? \"\" : ` [rule=${issue.ruleId}]`;\n lines.push(\n ` - [${issue.severity}] (${issue.dimension}) ${issue.id}${ruleSuffix} @ ${issue.target}: ${issue.message}`,\n );\n }\n if (report.health.topIssues.length === 0) {\n lines.push(\" - none\");\n }\n\n lines.push(\"\");\n lines.push(\"Top Hotspots\");\n for (const hotspot of report.hotspots) {\n lines.push(` - ${hotspot.target} | score=${hotspot.score}`);\n for (const factor of hotspot.topFactors) {\n lines.push(\n ` factor: ${factor.label} contribution=${factor.contribution} confidence=${factor.confidence}`,\n );\n lines.push(` evidence: ${factor.evidence}`);\n }\n lines.push(` priority actions: ${hotspot.suggestedActions.join(\" | \") || \"none\"}`);\n }\n\n lines.push(\"\");\n lines.push(\"Structural Observations\");\n lines.push(` cycleCount: ${report.structural.cycleCount}`);\n lines.push(` cycles: ${report.structural.cycles.join(\" ; \") || \"none\"}`);\n lines.push(` fragileClusters: ${report.structural.fragileClusters.length}`);\n\n lines.push(\"\");\n lines.push(\"External Exposure\");\n if (!report.external.available) {\n lines.push(` unavailable: ${report.external.reason}`);\n } else {\n lines.push(\n ` highRiskDependencies: ${report.external.highRiskDependencies.join(\", \") || \"none\"}`,\n );\n lines.push(\n ` highRiskDevelopmentDependencies: ${report.external.highRiskDevelopmentDependencies.join(\", \") || \"none\"}`,\n );\n lines.push(\n ` singleMaintainerDependencies: ${report.external.singleMaintainerDependencies.join(\", \") || \"none\"}`,\n );\n lines.push(\n ` abandonedDependencies: ${report.external.abandonedDependencies.join(\", \") || \"none\"}`,\n );\n }\n\n lines.push(\"\");\n lines.push(\"Appendix\");\n lines.push(` snapshotSchemaVersion: ${report.appendix.snapshotSchemaVersion}`);\n lines.push(` riskModelVersion: ${report.appendix.riskModelVersion}`);\n lines.push(` timestamp: ${report.appendix.timestamp}`);\n lines.push(` normalization: ${report.appendix.normalization}`);\n\n lines.push(...renderTextDiff(report));\n\n return lines.join(\"\\n\");\n};\n\nconst renderMarkdownDiff = (report: CodeSentinelReport): string[] => {\n if (report.diff === undefined) {\n return [];\n }\n\n return [\n \"\",\n \"## Diff\",\n `- riskScoreDelta: \\`${report.diff.riskScoreDelta}\\``,\n `- normalizedScoreDelta: \\`${report.diff.normalizedScoreDelta}\\``,\n `- newHotspots: ${report.diff.newHotspots.map((item) => `\\`${item}\\``).join(\", \") || \"none\"}`,\n `- resolvedHotspots: ${report.diff.resolvedHotspots.map((item) => `\\`${item}\\``).join(\", \") || \"none\"}`,\n `- newCycles: ${report.diff.newCycles.map((item) => `\\`${item}\\``).join(\", \") || \"none\"}`,\n `- resolvedCycles: ${report.diff.resolvedCycles.map((item) => `\\`${item}\\``).join(\", \") || \"none\"}`,\n ];\n};\n\nexport const renderMarkdownReport = (report: CodeSentinelReport): string => {\n const lines: string[] = [];\n lines.push(\"# CodeSentinel Report\");\n lines.push(\"\");\n lines.push(\"## Repository Summary\");\n lines.push(`- target: \\`${report.repository.targetPath}\\``);\n lines.push(`- riskScore: \\`${report.repository.riskScore}\\``);\n lines.push(`- normalizedScore: \\`${report.repository.normalizedScore}\\``);\n lines.push(`- riskTier: \\`${report.repository.riskTier}\\``);\n lines.push(`- healthTier: \\`${report.repository.healthTier}\\``);\n lines.push(`- confidence: \\`${report.repository.confidence ?? \"n/a\"}\\``);\n\n lines.push(\"\");\n lines.push(\"## Dimension Scores (0-100)\");\n lines.push(`- structural: \\`${report.repository.dimensionScores.structural ?? \"n/a\"}\\``);\n lines.push(`- evolution: \\`${report.repository.dimensionScores.evolution ?? \"n/a\"}\\``);\n lines.push(`- external: \\`${report.repository.dimensionScores.external ?? \"n/a\"}\\``);\n lines.push(`- interactions: \\`${report.repository.dimensionScores.interactions ?? \"n/a\"}\\``);\n\n lines.push(\"\");\n lines.push(\"## Health Summary\");\n lines.push(`- healthScore: \\`${report.health.healthScore}\\``);\n lines.push(`- normalizedScore: \\`${report.health.normalizedScore}\\``);\n lines.push(`- modularity: \\`${report.health.dimensions.modularity}\\``);\n lines.push(`- changeHygiene: \\`${report.health.dimensions.changeHygiene}\\``);\n lines.push(`- testHealth: \\`${report.health.dimensions.testHealth}\\``);\n lines.push(`- ownershipDistribution: \\`${report.health.dimensions.ownershipDistribution}\\``);\n if (report.health.topIssues.length === 0) {\n lines.push(\"- top issues: none\");\n } else {\n lines.push(\"- top issues:\");\n for (const issue of report.health.topIssues.slice(0, 5)) {\n const ruleSuffix = issue.ruleId === undefined ? \"\" : ` [rule=${issue.ruleId}]`;\n lines.push(\n ` - [${issue.severity}] \\`${issue.id}\\`${ruleSuffix} (\\`${issue.dimension}\\`) @ \\`${issue.target}\\`: ${issue.message}`,\n );\n }\n }\n\n lines.push(\"\");\n lines.push(\"## Top Hotspots\");\n for (const hotspot of report.hotspots) {\n lines.push(`- **${hotspot.target}** (score: \\`${hotspot.score}\\`)`);\n lines.push(` - Top factors:`);\n for (const factor of hotspot.topFactors) {\n lines.push(\n ` - ${factor.label}: contribution=\\`${factor.contribution}\\`, confidence=\\`${factor.confidence}\\``,\n );\n lines.push(` - evidence: \\`${factor.evidence}\\``);\n }\n lines.push(` - Priority actions: ${hotspot.suggestedActions.join(\" | \") || \"none\"}`);\n }\n\n lines.push(\"\");\n lines.push(\"## Structural Observations\");\n lines.push(`- cycles detected: \\`${report.structural.cycleCount}\\``);\n lines.push(\n `- cycles: ${report.structural.cycles.map((cycle) => `\\`${cycle}\\``).join(\", \") || \"none\"}`,\n );\n lines.push(`- fragile clusters: \\`${report.structural.fragileClusters.length}\\``);\n\n lines.push(\"\");\n lines.push(\"## External Exposure Summary\");\n if (!report.external.available) {\n lines.push(`- unavailable: \\`${report.external.reason}\\``);\n } else {\n lines.push(\n `- high-risk dependencies: ${report.external.highRiskDependencies.map((item) => `\\`${item}\\``).join(\", \") || \"none\"}`,\n );\n lines.push(\n `- high-risk development dependencies: ${report.external.highRiskDevelopmentDependencies.map((item) => `\\`${item}\\``).join(\", \") || \"none\"}`,\n );\n lines.push(\n `- single maintainer dependencies: ${report.external.singleMaintainerDependencies.map((item) => `\\`${item}\\``).join(\", \") || \"none\"}`,\n );\n lines.push(\n `- abandoned dependencies: ${report.external.abandonedDependencies.map((item) => `\\`${item}\\``).join(\", \") || \"none\"}`,\n );\n }\n\n lines.push(\"\");\n lines.push(\"## Appendix\");\n lines.push(`- snapshot schema: \\`${report.appendix.snapshotSchemaVersion}\\``);\n lines.push(`- risk model version: \\`${report.appendix.riskModelVersion}\\``);\n lines.push(`- timestamp: \\`${report.appendix.timestamp}\\``);\n lines.push(`- normalization: ${report.appendix.normalization}`);\n\n lines.push(...renderMarkdownDiff(report));\n\n return lines.join(\"\\n\");\n};\n","import type { AnalyzeSummary, RiskTrace } from \"@codesentinel/core\";\nimport {\n RISK_MODEL_VERSION,\n SNAPSHOT_SCHEMA_VERSION,\n type CodeSentinelSnapshot,\n} from \"./domain.js\";\n\nexport type CreateSnapshotInput = {\n analysis: AnalyzeSummary;\n trace?: RiskTrace;\n generatedAt?: string;\n analysisConfig?: Readonly<Record<string, string | number | boolean | null>>;\n};\n\nexport const createSnapshot = (input: CreateSnapshotInput): CodeSentinelSnapshot => ({\n schemaVersion: SNAPSHOT_SCHEMA_VERSION,\n generatedAt: input.generatedAt ?? new Date().toISOString(),\n riskModelVersion: RISK_MODEL_VERSION,\n source: {\n targetPath: input.analysis.structural.targetPath,\n },\n analysis: input.analysis,\n ...(input.trace === undefined ? {} : { trace: input.trace }),\n ...(input.analysisConfig === undefined ? {} : { analysisConfig: input.analysisConfig }),\n});\n\nexport const parseSnapshot = (raw: string): CodeSentinelSnapshot => {\n const parsed = JSON.parse(raw) as Partial<CodeSentinelSnapshot>;\n if (parsed.schemaVersion !== SNAPSHOT_SCHEMA_VERSION) {\n throw new Error(\"unsupported_snapshot_schema\");\n }\n\n if (typeof parsed.generatedAt !== \"string\") {\n throw new Error(\"invalid_snapshot_generated_at\");\n }\n\n if (parsed.analysis === undefined || parsed.analysis === null) {\n throw new Error(\"invalid_snapshot_analysis\");\n }\n\n if (parsed.source === undefined || typeof parsed.source.targetPath !== \"string\") {\n throw new Error(\"invalid_snapshot_source\");\n }\n\n return parsed as CodeSentinelSnapshot;\n};\n","import type { CodeSentinelReport, ReportFormat } from \"./domain.js\";\nimport { compareSnapshots } from \"./diff.js\";\nimport { createReport } from \"./report.js\";\nimport { renderMarkdownReport, renderTextReport } from \"./renderers.js\";\nimport { createSnapshot, parseSnapshot } from \"./snapshot.js\";\n\nexport {\n SNAPSHOT_SCHEMA_VERSION,\n REPORT_SCHEMA_VERSION,\n RISK_MODEL_VERSION,\n factorLabel,\n summarizeEvidence,\n type CodeSentinelSnapshot,\n type CodeSentinelReport,\n type SnapshotDiff,\n type ReportFormat,\n} from \"./domain.js\";\n\nexport { createSnapshot, parseSnapshot, compareSnapshots, createReport };\n\nexport const formatReport = (report: CodeSentinelReport, format: ReportFormat): string => {\n if (format === \"json\") {\n return JSON.stringify(report, null, 2);\n }\n\n if (format === \"md\") {\n return renderMarkdownReport(report);\n }\n\n return renderTextReport(report);\n};\n","import type { EvidenceRef } from \"@codesentinel/core\";\nimport type { CodeSentinelSnapshot, SnapshotDiff } from \"@codesentinel/reporter\";\n\nexport type ViolationSeverity = \"info\" | \"warn\" | \"error\";\n\nexport type Violation = {\n id: string;\n severity: ViolationSeverity;\n message: string;\n targets: readonly string[];\n evidenceRefs: readonly EvidenceRef[];\n};\n\nexport type FailOnLevel = \"error\" | \"warn\";\n\nexport type GateConfig = {\n maxRiskDelta?: number;\n maxHealthDelta?: number;\n noNewCycles?: boolean;\n noNewHighRiskDeps?: boolean;\n maxNewHotspots?: number;\n maxRiskScore?: number;\n minHealthScore?: number;\n newHotspotScoreThreshold?: number;\n failOn: FailOnLevel;\n};\n\nexport type GateEvaluationInput = {\n current: CodeSentinelSnapshot;\n baseline?: CodeSentinelSnapshot;\n diff?: SnapshotDiff;\n gateConfig: GateConfig;\n};\n\nexport type GateEvaluationResult = {\n violations: readonly Violation[];\n highestSeverity: ViolationSeverity | null;\n exitCode: 0 | 1 | 2;\n evaluatedGates: readonly string[];\n};\n\nexport const EXIT_CODES = {\n ok: 0,\n errorViolation: 1,\n warnViolation: 2,\n invalidConfiguration: 3,\n internalError: 4,\n} as const;\n\nexport class GovernanceConfigurationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"GovernanceConfigurationError\";\n }\n}\n\nexport const DEFAULT_NEW_HOTSPOT_SCORE_THRESHOLD = 60;\n","import type { EvidenceRef } from \"@codesentinel/core\";\nimport {\n DEFAULT_NEW_HOTSPOT_SCORE_THRESHOLD,\n GovernanceConfigurationError,\n type GateEvaluationInput,\n type GateEvaluationResult,\n type Violation,\n type ViolationSeverity,\n} from \"./domain.js\";\n\nconst severityRank: Readonly<Record<ViolationSeverity, number>> = {\n info: 0,\n warn: 1,\n error: 2,\n};\n\nconst compareSeverity = (\n left: ViolationSeverity | null,\n right: ViolationSeverity | null,\n): ViolationSeverity | null => {\n if (left === null) {\n return right;\n }\n if (right === null) {\n return left;\n }\n\n return severityRank[left] >= severityRank[right] ? left : right;\n};\n\nconst stableSortViolations = (violations: readonly Violation[]): readonly Violation[] =>\n [...violations].sort((a, b) => {\n const severity = severityRank[b.severity] - severityRank[a.severity];\n if (severity !== 0) {\n return severity;\n }\n\n if (a.id !== b.id) {\n return a.id.localeCompare(b.id);\n }\n\n const aTarget = a.targets[0] ?? \"\";\n const bTarget = b.targets[0] ?? \"\";\n if (aTarget !== bTarget) {\n return aTarget.localeCompare(bTarget);\n }\n\n return a.message.localeCompare(b.message);\n });\n\nconst makeViolation = (\n id: string,\n severity: ViolationSeverity,\n message: string,\n targets: readonly string[],\n evidenceRefs: readonly EvidenceRef[],\n): Violation => ({\n id,\n severity,\n message,\n targets: [...targets].sort((a, b) => a.localeCompare(b)),\n evidenceRefs,\n});\n\nconst requireDiff = (input: GateEvaluationInput, gateId: string): void => {\n if (input.baseline === undefined || input.diff === undefined) {\n throw new GovernanceConfigurationError(`${gateId} requires --compare <baseline.json>`);\n }\n};\n\nconst validateGateConfig = (input: GateEvaluationInput): void => {\n const config = input.gateConfig;\n\n if (\n config.maxRiskDelta !== undefined &&\n (!Number.isFinite(config.maxRiskDelta) || config.maxRiskDelta < 0)\n ) {\n throw new GovernanceConfigurationError(\"max-risk-delta must be a finite number >= 0\");\n }\n\n if (\n config.maxHealthDelta !== undefined &&\n (!Number.isFinite(config.maxHealthDelta) || config.maxHealthDelta < 0)\n ) {\n throw new GovernanceConfigurationError(\"max-health-delta must be a finite number >= 0\");\n }\n\n if (\n config.maxNewHotspots !== undefined &&\n (!Number.isInteger(config.maxNewHotspots) || config.maxNewHotspots < 0)\n ) {\n throw new GovernanceConfigurationError(\"max-new-hotspots must be an integer >= 0\");\n }\n\n if (\n config.maxRiskScore !== undefined &&\n (!Number.isFinite(config.maxRiskScore) || config.maxRiskScore < 0 || config.maxRiskScore > 100)\n ) {\n throw new GovernanceConfigurationError(\"max-risk-score must be a number in [0, 100]\");\n }\n\n if (\n config.minHealthScore !== undefined &&\n (!Number.isFinite(config.minHealthScore) ||\n config.minHealthScore < 0 ||\n config.minHealthScore > 100)\n ) {\n throw new GovernanceConfigurationError(\"min-health-score must be a number in [0, 100]\");\n }\n\n if (\n config.newHotspotScoreThreshold !== undefined &&\n (!Number.isFinite(config.newHotspotScoreThreshold) ||\n config.newHotspotScoreThreshold < 0 ||\n config.newHotspotScoreThreshold > 100)\n ) {\n throw new GovernanceConfigurationError(\n \"new-hotspot-score-threshold must be a number in [0, 100]\",\n );\n }\n};\n\nexport const evaluateGates = (input: GateEvaluationInput): GateEvaluationResult => {\n validateGateConfig(input);\n\n const config = input.gateConfig;\n const violations: Violation[] = [];\n const evaluatedGates: string[] = [];\n\n if (config.maxRiskScore !== undefined) {\n evaluatedGates.push(\"max-risk-score\");\n const current = input.current.analysis.risk.riskScore;\n if (current > config.maxRiskScore) {\n violations.push(\n makeViolation(\n \"max-risk-score\",\n \"error\",\n `Risk score ${current} exceeds configured max ${config.maxRiskScore}.`,\n [input.current.analysis.structural.targetPath],\n [{ kind: \"repository_metric\", metric: \"riskScore\" }],\n ),\n );\n }\n }\n\n if (config.minHealthScore !== undefined) {\n evaluatedGates.push(\"min-health-score\");\n const current = input.current.analysis.health.healthScore;\n if (current < config.minHealthScore) {\n violations.push(\n makeViolation(\n \"min-health-score\",\n \"error\",\n `Health score ${current} is below configured minimum ${config.minHealthScore}.`,\n [input.current.analysis.structural.targetPath],\n [{ kind: \"repository_metric\", metric: \"healthScore\" }],\n ),\n );\n }\n }\n\n if (config.maxRiskDelta !== undefined) {\n evaluatedGates.push(\"max-risk-delta\");\n requireDiff(input, \"max-risk-delta\");\n const baseline = input.baseline;\n if (baseline === undefined) {\n throw new GovernanceConfigurationError(\"max-risk-delta requires baseline snapshot\");\n }\n\n const delta =\n input.current.analysis.risk.normalizedScore - baseline.analysis.risk.normalizedScore;\n if (delta > config.maxRiskDelta) {\n violations.push(\n makeViolation(\n \"max-risk-delta\",\n \"error\",\n `Risk normalized score delta ${delta.toFixed(4)} exceeds allowed ${config.maxRiskDelta}.`,\n [input.current.analysis.structural.targetPath],\n [{ kind: \"repository_metric\", metric: \"normalizedScore\" }],\n ),\n );\n }\n }\n\n if (config.maxHealthDelta !== undefined) {\n evaluatedGates.push(\"max-health-delta\");\n requireDiff(input, \"max-health-delta\");\n const baseline = input.baseline;\n if (baseline === undefined) {\n throw new GovernanceConfigurationError(\"max-health-delta requires baseline snapshot\");\n }\n\n const delta =\n input.current.analysis.health.normalizedScore - baseline.analysis.health.normalizedScore;\n if (delta < -config.maxHealthDelta) {\n violations.push(\n makeViolation(\n \"max-health-delta\",\n \"error\",\n `Health normalized score delta ${delta.toFixed(4)} is below allowed minimum ${(-config.maxHealthDelta).toFixed(4)}.`,\n [input.current.analysis.structural.targetPath],\n [{ kind: \"repository_metric\", metric: \"healthNormalizedScore\" }],\n ),\n );\n }\n }\n\n if (config.noNewCycles === true) {\n evaluatedGates.push(\"no-new-cycles\");\n requireDiff(input, \"no-new-cycles\");\n const diff = input.diff;\n if (diff === undefined) {\n throw new GovernanceConfigurationError(\"no-new-cycles requires diff\");\n }\n if (diff.newCycles.length > 0) {\n violations.push(\n makeViolation(\n \"no-new-cycles\",\n \"error\",\n `Detected ${diff.newCycles.length} new structural cycle(s).`,\n diff.newCycles,\n [{ kind: \"repository_metric\", metric: \"cycleCount\" }],\n ),\n );\n }\n }\n\n if (config.noNewHighRiskDeps === true) {\n evaluatedGates.push(\"no-new-high-risk-deps\");\n requireDiff(input, \"no-new-high-risk-deps\");\n const diff = input.diff;\n if (diff === undefined) {\n throw new GovernanceConfigurationError(\"no-new-high-risk-deps requires diff\");\n }\n if (diff.externalChanges.highRiskAdded.length > 0) {\n violations.push(\n makeViolation(\n \"no-new-high-risk-deps\",\n \"error\",\n `Detected ${diff.externalChanges.highRiskAdded.length} new high-risk dependency(ies).`,\n diff.externalChanges.highRiskAdded,\n diff.externalChanges.highRiskAdded.map((name) => ({\n kind: \"dependency_metric\",\n target: name,\n metric: \"highRiskDependencies\",\n })),\n ),\n );\n }\n }\n\n if (config.maxNewHotspots !== undefined) {\n evaluatedGates.push(\"max-new-hotspots\");\n requireDiff(input, \"max-new-hotspots\");\n const diff = input.diff;\n if (diff === undefined) {\n throw new GovernanceConfigurationError(\"max-new-hotspots requires diff\");\n }\n\n const scoreByFile = new Map(\n input.current.analysis.risk.fileScores.map((item) => [item.file, item.score]),\n );\n const threshold = config.newHotspotScoreThreshold ?? DEFAULT_NEW_HOTSPOT_SCORE_THRESHOLD;\n const counted = diff.newHotspots.filter((file) => (scoreByFile.get(file) ?? 0) >= threshold);\n\n if (counted.length > config.maxNewHotspots) {\n violations.push(\n makeViolation(\n \"max-new-hotspots\",\n \"warn\",\n `Detected ${counted.length} new hotspot(s) above score ${threshold}; allowed max is ${config.maxNewHotspots}.`,\n counted,\n counted.map((file) => ({ kind: \"file_metric\", target: file, metric: \"score\" })),\n ),\n );\n }\n }\n\n const ordered = stableSortViolations(violations);\n const highestSeverity = ordered.reduce<ViolationSeverity | null>(\n (current, violation) => compareSeverity(current, violation.severity),\n null,\n );\n\n const exitCode: 0 | 1 | 2 =\n highestSeverity === \"error\"\n ? 1\n : highestSeverity === \"warn\" && config.failOn === \"warn\"\n ? 2\n : 0;\n\n return {\n violations: ordered,\n highestSeverity,\n exitCode,\n evaluatedGates: [...evaluatedGates].sort((a, b) => a.localeCompare(b)),\n };\n};\n","import { factorLabel, summarizeEvidence, type CodeSentinelSnapshot } from \"@codesentinel/reporter\";\nimport type { GateEvaluationResult, Violation } from \"./domain.js\";\n\nconst renderViolationText = (violation: Violation): string => {\n const targets = violation.targets.join(\", \") || \"n/a\";\n return `- [${violation.severity}] ${violation.id}: ${violation.message} (targets: ${targets})`;\n};\n\nexport const renderCheckText = (\n snapshot: CodeSentinelSnapshot,\n result: GateEvaluationResult,\n): string => {\n const lines: string[] = [];\n lines.push(\"CodeSentinel Check\");\n lines.push(`target: ${snapshot.analysis.structural.targetPath}`);\n lines.push(`riskScore: ${snapshot.analysis.risk.riskScore}`);\n lines.push(`evaluatedGates: ${result.evaluatedGates.join(\", \") || \"none\"}`);\n lines.push(`violations: ${result.violations.length}`);\n lines.push(`exitCode: ${result.exitCode}`);\n lines.push(\"\");\n lines.push(\"Violations\");\n if (result.violations.length === 0) {\n lines.push(\"- none\");\n } else {\n for (const violation of result.violations) {\n lines.push(renderViolationText(violation));\n }\n }\n\n return lines.join(\"\\n\");\n};\n\nexport const renderCheckMarkdown = (\n snapshot: CodeSentinelSnapshot,\n result: GateEvaluationResult,\n): string => {\n const lines: string[] = [];\n lines.push(\"## CodeSentinel CI Summary\");\n lines.push(`- target: \\`${snapshot.analysis.structural.targetPath}\\``);\n lines.push(`- riskScore: \\`${snapshot.analysis.risk.riskScore}\\``);\n lines.push(\n `- evaluatedGates: ${result.evaluatedGates.map((item) => `\\`${item}\\``).join(\", \") || \"none\"}`,\n );\n lines.push(`- violations: \\`${result.violations.length}\\``);\n lines.push(`- exitCode: \\`${result.exitCode}\\``);\n\n const repositoryTrace = snapshot.trace?.targets.find(\n (target) =>\n target.targetType === \"repository\" &&\n target.targetId === snapshot.analysis.structural.targetPath,\n );\n if (repositoryTrace !== undefined) {\n lines.push(\"\");\n lines.push(\"### Why\");\n const topFactors = [...repositoryTrace.factors]\n .sort((a, b) => b.contribution - a.contribution || a.factorId.localeCompare(b.factorId))\n .slice(0, 3);\n\n for (const factor of topFactors) {\n lines.push(\n `- ${factorLabel(factor.factorId)}: contribution=\\`${factor.contribution}\\`, evidence=\\`${summarizeEvidence(factor)}\\``,\n );\n }\n }\n\n lines.push(\"\");\n lines.push(\"### Violations\");\n if (result.violations.length === 0) {\n lines.push(\"- none\");\n } else {\n for (const violation of result.violations) {\n lines.push(`- [${violation.severity}] **${violation.id}**: ${violation.message}`);\n if (violation.targets.length > 0) {\n lines.push(` - targets: ${violation.targets.map((target) => `\\`${target}\\``).join(\", \")}`);\n }\n }\n }\n\n return lines.join(\"\\n\");\n};\n","import { mkdirSync, rmSync } from \"node:fs\";\nimport { basename, join, resolve } from \"node:path\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport type { CodeSentinelSnapshot } from \"@codesentinel/reporter\";\nimport {\n BaselineAutoResolutionError,\n resolveAutoBaseline,\n type BaselineAutoResolution,\n type GitCommandResult,\n} from \"./baseline-auto-resolver.js\";\n\nconst execFileAsync = promisify(execFile);\n\nconst SENTINEL_TMP_DIR = \".codesentinel-tmp\";\nconst WORKTREE_DIR = \"worktrees\";\n\nexport class BaselineRefResolutionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"BaselineRefResolutionError\";\n }\n}\n\nconst runGit = async (repositoryPath: string, args: readonly string[]): Promise<string> => {\n const result = await tryRunGit(repositoryPath, args);\n if (result.ok) {\n return result.stdout;\n }\n throw new BaselineRefResolutionError(result.message);\n};\n\nconst tryRunGit = async (\n repositoryPath: string,\n args: readonly string[],\n): Promise<GitCommandResult> => {\n try {\n const { stdout } = await execFileAsync(\"git\", [\"-C\", repositoryPath, ...args], {\n encoding: \"utf8\",\n });\n return { ok: true, stdout: stdout.trim() };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"unknown git error\";\n return { ok: false, message };\n }\n};\n\nconst buildWorktreePath = (repoRoot: string, sha: string): string => {\n const tmpRoot = join(repoRoot, SENTINEL_TMP_DIR, WORKTREE_DIR);\n mkdirSync(tmpRoot, { recursive: true });\n\n const baseName = `baseline-${sha.slice(0, 12)}-${process.pid}`;\n const candidate = resolve(tmpRoot, baseName);\n return candidate;\n};\n\nconst sanitizeSnapshotForWorktree = (\n snapshot: CodeSentinelSnapshot,\n worktreePath: string,\n canonicalPath: string,\n): CodeSentinelSnapshot => {\n const replacePrefix = (value: string): string =>\n value.startsWith(worktreePath) ? `${canonicalPath}${value.slice(worktreePath.length)}` : value;\n\n const structural = snapshot.analysis.structural;\n\n return {\n ...snapshot,\n source: {\n targetPath: replacePrefix(snapshot.source.targetPath),\n },\n analysis: {\n ...snapshot.analysis,\n structural: {\n ...structural,\n targetPath: replacePrefix(structural.targetPath),\n nodes: structural.nodes.map((node) => ({\n ...node,\n absolutePath: replacePrefix(node.absolutePath),\n })),\n },\n evolution: {\n ...snapshot.analysis.evolution,\n targetPath: replacePrefix(snapshot.analysis.evolution.targetPath),\n },\n external: {\n ...snapshot.analysis.external,\n targetPath: replacePrefix(snapshot.analysis.external.targetPath),\n },\n },\n };\n};\n\nexport type BaselineRefResolutionResult = {\n baselineSnapshot: CodeSentinelSnapshot;\n resolvedRef: string;\n resolvedSha: string;\n};\n\nexport type ResolveBaselineFromRefInput = {\n repositoryPath: string;\n baselineRef: string;\n analyzeWorktree: (worktreePath: string, repositoryRoot: string) => Promise<CodeSentinelSnapshot>;\n};\n\nexport type ResolveAutoBaselineRefInput = {\n repositoryPath: string;\n baselineSha?: string;\n mainBranchCandidates?: readonly string[];\n environment?: Readonly<Record<string, string | undefined>>;\n};\n\nexport const resolveBaselineSnapshotFromRef = async (\n input: ResolveBaselineFromRefInput,\n): Promise<BaselineRefResolutionResult> => {\n const repositoryPath = resolve(input.repositoryPath);\n const ref = input.baselineRef.trim();\n if (ref.length === 0) {\n throw new BaselineRefResolutionError(\"baseline-ref cannot be empty\");\n }\n\n const repoRoot = await runGit(repositoryPath, [\"rev-parse\", \"--show-toplevel\"]);\n const sha = await runGit(repositoryPath, [\"rev-parse\", \"--verify\", `${ref}^{commit}`]);\n\n const worktreePath = buildWorktreePath(repoRoot, sha);\n\n const cleanup = (): void => {\n try {\n rmSync(worktreePath, { recursive: true, force: true });\n } catch {\n // Best-effort fallback cleanup if worktree remove fails.\n }\n };\n\n try {\n await runGit(repoRoot, [\"worktree\", \"add\", \"--detach\", worktreePath, sha]);\n\n const snapshot = await input.analyzeWorktree(worktreePath, repoRoot);\n const sanitized = sanitizeSnapshotForWorktree(snapshot, worktreePath, repoRoot);\n\n return {\n baselineSnapshot: sanitized,\n resolvedRef: ref,\n resolvedSha: sha,\n };\n } finally {\n try {\n await runGit(repoRoot, [\"worktree\", \"remove\", \"--force\", worktreePath]);\n } catch {\n cleanup();\n }\n }\n};\n\nexport const baselineTempDirectoryName = (): string =>\n basename(join(SENTINEL_TMP_DIR, WORKTREE_DIR));\n\nexport const resolveAutoBaselineRef = async (\n input: ResolveAutoBaselineRefInput,\n): Promise<BaselineAutoResolution> => {\n const repositoryPath = resolve(input.repositoryPath);\n const repoRoot = await runGit(repositoryPath, [\"rev-parse\", \"--show-toplevel\"]);\n\n try {\n return await resolveAutoBaseline({\n ...(input.baselineSha === undefined ? {} : { baselineSha: input.baselineSha }),\n ...(input.environment === undefined ? {} : { environment: input.environment }),\n ...(input.mainBranchCandidates === undefined\n ? {}\n : { mainBranchCandidates: input.mainBranchCandidates }),\n git: {\n resolveCommit: async (ref: string): Promise<GitCommandResult> =>\n tryRunGit(repoRoot, [\"rev-parse\", \"--verify\", ref]),\n mergeBase: async (leftRef: string, rightRef: string): Promise<GitCommandResult> =>\n tryRunGit(repoRoot, [\"merge-base\", leftRef, rightRef]),\n currentBranch: async (): Promise<GitCommandResult> =>\n tryRunGit(repoRoot, [\"symbolic-ref\", \"--quiet\", \"--short\", \"HEAD\"]),\n isShallowRepository: async (): Promise<GitCommandResult> =>\n tryRunGit(repoRoot, [\"rev-parse\", \"--is-shallow-repository\"]),\n },\n });\n } catch (error) {\n if (error instanceof BaselineAutoResolutionError) {\n throw new BaselineRefResolutionError(error.message);\n }\n throw error;\n }\n};\n","export class BaselineAutoResolutionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"BaselineAutoResolutionError\";\n }\n}\n\nexport type BaselineAutoResolutionStrategy =\n | \"explicit_sha\"\n | \"ci_base_branch\"\n | \"main_branch_previous_commit\"\n | \"feature_branch_merge_base\";\n\nexport type BaselineAutoResolutionAttempt = {\n step: string;\n candidate: string;\n outcome: \"resolved\" | \"failed\" | \"skipped\";\n detail?: string;\n};\n\nexport type BaselineAutoResolution = {\n strategy: BaselineAutoResolutionStrategy;\n resolvedRef: string;\n resolvedSha: string;\n attempts: readonly BaselineAutoResolutionAttempt[];\n baseBranch?: string;\n};\n\nexport type GitCommandResult = { ok: true; stdout: string } | { ok: false; message: string };\n\nexport type BaselineAutoGitAdapter = {\n resolveCommit: (ref: string) => Promise<GitCommandResult>;\n mergeBase: (leftRef: string, rightRef: string) => Promise<GitCommandResult>;\n currentBranch: () => Promise<GitCommandResult>;\n isShallowRepository: () => Promise<GitCommandResult>;\n};\n\nexport type ResolveAutoBaselineInput = {\n baselineSha?: string;\n environment?: Readonly<Record<string, string | undefined>>;\n mainBranchCandidates?: readonly string[];\n git: BaselineAutoGitAdapter;\n};\n\nconst DEFAULT_MAIN_BRANCH_CANDIDATES = [\"main\", \"master\"] as const;\n\nconst providerBaseBranchKeys = [\n \"GITHUB_BASE_REF\",\n \"CI_MERGE_REQUEST_TARGET_BRANCH_NAME\",\n \"BITBUCKET_PR_DESTINATION_BRANCH\",\n] as const;\n\nconst normalizeMainBranches = (input: readonly string[] | undefined): readonly string[] => {\n const source = input === undefined || input.length === 0 ? DEFAULT_MAIN_BRANCH_CANDIDATES : input;\n const seen = new Set<string>();\n const values: string[] = [];\n\n for (const candidate of source) {\n const trimmed = candidate.trim();\n if (trimmed.length === 0 || seen.has(trimmed)) {\n continue;\n }\n seen.add(trimmed);\n values.push(trimmed);\n }\n\n return values.length > 0 ? values : DEFAULT_MAIN_BRANCH_CANDIDATES;\n};\n\nconst firstNonEmptyEnv = (\n environment: Readonly<Record<string, string | undefined>>,\n): { key: string; value: string } | undefined => {\n for (const key of providerBaseBranchKeys) {\n const value = environment[key]?.trim();\n if (value !== undefined && value.length > 0) {\n return { key, value };\n }\n }\n return undefined;\n};\n\nconst asBoolean = (value: string): boolean => {\n return value.trim().toLowerCase() === \"true\";\n};\n\nconst buildNoBaselineMessage = (): string => {\n return \"unable to resolve auto baseline; set --baseline-ref <ref> explicitly or provide --baseline <snapshot.json>\";\n};\n\nexport const resolveAutoBaseline = async (\n input: ResolveAutoBaselineInput,\n): Promise<BaselineAutoResolution> => {\n const attempts: BaselineAutoResolutionAttempt[] = [];\n const mainBranches = normalizeMainBranches(input.mainBranchCandidates);\n const environment = input.environment ?? {};\n\n const baselineSha = input.baselineSha?.trim();\n if (baselineSha !== undefined && baselineSha.length > 0) {\n const result = await input.git.resolveCommit(`${baselineSha}^{commit}`);\n if (result.ok) {\n attempts.push({ step: \"explicit-sha\", candidate: baselineSha, outcome: \"resolved\" });\n return {\n strategy: \"explicit_sha\",\n resolvedRef: baselineSha,\n resolvedSha: result.stdout,\n attempts,\n };\n }\n\n attempts.push({\n step: \"explicit-sha\",\n candidate: baselineSha,\n outcome: \"failed\",\n detail: result.message,\n });\n throw new BaselineAutoResolutionError(\n `invalid --baseline-sha '${baselineSha}': ${result.message}`,\n );\n }\n\n const providerBaseBranch = firstNonEmptyEnv(environment);\n if (providerBaseBranch !== undefined) {\n const originRef = `origin/${providerBaseBranch.value}`;\n const originResult = await input.git.resolveCommit(`${originRef}^{commit}`);\n if (originResult.ok) {\n attempts.push({\n step: `ci-base-branch:${providerBaseBranch.key}`,\n candidate: originRef,\n outcome: \"resolved\",\n });\n return {\n strategy: \"ci_base_branch\",\n resolvedRef: originRef,\n resolvedSha: originResult.stdout,\n attempts,\n baseBranch: providerBaseBranch.value,\n };\n }\n attempts.push({\n step: `ci-base-branch:${providerBaseBranch.key}`,\n candidate: originRef,\n outcome: \"failed\",\n detail: originResult.message,\n });\n\n const localRef = providerBaseBranch.value;\n const localResult = await input.git.resolveCommit(`${localRef}^{commit}`);\n if (localResult.ok) {\n attempts.push({\n step: `ci-base-branch-local:${providerBaseBranch.key}`,\n candidate: localRef,\n outcome: \"resolved\",\n });\n return {\n strategy: \"ci_base_branch\",\n resolvedRef: localRef,\n resolvedSha: localResult.stdout,\n attempts,\n baseBranch: providerBaseBranch.value,\n };\n }\n attempts.push({\n step: `ci-base-branch-local:${providerBaseBranch.key}`,\n candidate: localRef,\n outcome: \"failed\",\n detail: localResult.message,\n });\n } else {\n attempts.push({\n step: \"ci-base-branch\",\n candidate: providerBaseBranchKeys.join(\",\"),\n outcome: \"skipped\",\n detail: \"no CI base branch environment variable found\",\n });\n }\n\n const branchResult = await input.git.currentBranch();\n const branchName = branchResult.ok ? branchResult.stdout.trim() : undefined;\n if (branchName !== undefined && mainBranches.includes(branchName)) {\n const headPrevious = await input.git.resolveCommit(\"HEAD~1^{commit}\");\n if (headPrevious.ok) {\n attempts.push({\n step: \"main-branch-head-previous\",\n candidate: \"HEAD~1\",\n outcome: \"resolved\",\n });\n return {\n strategy: \"main_branch_previous_commit\",\n resolvedRef: \"HEAD~1\",\n resolvedSha: headPrevious.stdout,\n attempts,\n };\n }\n attempts.push({\n step: \"main-branch-head-previous\",\n candidate: \"HEAD~1\",\n outcome: \"failed\",\n detail: headPrevious.message,\n });\n throw new BaselineAutoResolutionError(\n `unable to resolve baseline from HEAD~1 on branch '${branchName}': ${headPrevious.message}`,\n );\n }\n\n if (branchName === undefined) {\n attempts.push({\n step: \"current-branch\",\n candidate: \"HEAD\",\n outcome: \"skipped\",\n detail: \"detached HEAD or symbolic-ref unavailable\",\n });\n } else {\n attempts.push({\n step: \"current-branch\",\n candidate: branchName,\n outcome: \"resolved\",\n detail: \"feature branch detected\",\n });\n }\n\n const mergeBaseCandidates = [\n ...mainBranches.map((candidate) => `origin/${candidate}`),\n ...mainBranches,\n ];\n\n for (const candidate of mergeBaseCandidates) {\n const mergeBase = await input.git.mergeBase(\"HEAD\", candidate);\n if (mergeBase.ok) {\n attempts.push({\n step: \"merge-base\",\n candidate: `HEAD..${candidate}`,\n outcome: \"resolved\",\n });\n return {\n strategy: \"feature_branch_merge_base\",\n resolvedRef: mergeBase.stdout,\n resolvedSha: mergeBase.stdout,\n attempts,\n };\n }\n attempts.push({\n step: \"merge-base\",\n candidate: `HEAD..${candidate}`,\n outcome: \"failed\",\n detail: mergeBase.message,\n });\n }\n\n const shallowResult = await input.git.isShallowRepository();\n const shallowRepository = shallowResult.ok && asBoolean(shallowResult.stdout);\n if (shallowRepository) {\n throw new BaselineAutoResolutionError(\n `${buildNoBaselineMessage()}; repository appears shallow. Fetch full history (for example: git fetch --unshallow or fetch-depth: 0).`,\n );\n }\n\n throw new BaselineAutoResolutionError(buildNoBaselineMessage());\n};\n","import type { AnalyzeSummary } from \"@codesentinel/core\";\n\nexport type AnalyzeOutputMode = \"summary\" | \"json\";\n\ntype EvolutionAvailable = Extract<AnalyzeSummary[\"evolution\"], { available: true }>;\ntype ExternalAvailable = Extract<AnalyzeSummary[\"external\"], { available: true }>;\n\nconst toHealthTier = (score: number): \"critical\" | \"weak\" | \"fair\" | \"good\" | \"excellent\" => {\n if (score < 20) {\n return \"critical\";\n }\n if (score < 40) {\n return \"weak\";\n }\n if (score < 60) {\n return \"fair\";\n }\n if (score < 80) {\n return \"good\";\n }\n return \"excellent\";\n};\n\ntype SummaryShape = {\n targetPath: string;\n structural: AnalyzeSummary[\"structural\"][\"metrics\"];\n evolution:\n | {\n available: false;\n reason: \"not_git_repository\";\n }\n | {\n available: true;\n metrics: EvolutionAvailable[\"metrics\"];\n hotspotsTop: readonly string[];\n };\n external:\n | {\n available: false;\n reason:\n | \"package_json_not_found\"\n | \"lockfile_not_found\"\n | \"unsupported_lockfile_format\"\n | \"invalid_lockfile\";\n }\n | {\n available: true;\n metrics: ExternalAvailable[\"metrics\"];\n highRiskDependenciesTop: readonly string[];\n highRiskDevelopmentDependenciesTop: readonly string[];\n transitiveExposureDependenciesTop: readonly string[];\n };\n risk: {\n riskScore: number;\n normalizedScore: number;\n hotspotsTop: ReadonlyArray<{\n file: string;\n score: number;\n }>;\n fragileClusterCount: number;\n dependencyAmplificationZoneCount: number;\n };\n health: {\n healthScore: number;\n healthTier: \"critical\" | \"weak\" | \"fair\" | \"good\" | \"excellent\";\n normalizedScore: number;\n dimensions: AnalyzeSummary[\"health\"][\"dimensions\"];\n topIssues: AnalyzeSummary[\"health\"][\"topIssues\"];\n };\n};\n\nconst createSummaryShape = (summary: AnalyzeSummary): SummaryShape => ({\n targetPath: summary.structural.targetPath,\n structural: summary.structural.metrics,\n evolution: summary.evolution.available\n ? {\n available: true,\n metrics: summary.evolution.metrics,\n hotspotsTop: summary.evolution.hotspots.slice(0, 5).map((hotspot) => hotspot.filePath),\n }\n : {\n available: false,\n reason: summary.evolution.reason,\n },\n external: summary.external.available\n ? {\n available: true,\n metrics: summary.external.metrics,\n highRiskDependenciesTop: summary.external.highRiskDependencies.slice(0, 10),\n highRiskDevelopmentDependenciesTop: summary.external.highRiskDevelopmentDependencies.slice(\n 0,\n 10,\n ),\n transitiveExposureDependenciesTop: summary.external.transitiveExposureDependencies.slice(\n 0,\n 10,\n ),\n }\n : {\n available: false,\n reason: summary.external.reason,\n },\n risk: {\n riskScore: summary.risk.riskScore,\n normalizedScore: summary.risk.normalizedScore,\n hotspotsTop: summary.risk.hotspots.slice(0, 5).map((hotspot) => ({\n file: hotspot.file,\n score: hotspot.score,\n })),\n fragileClusterCount: summary.risk.fragileClusters.length,\n dependencyAmplificationZoneCount: summary.risk.dependencyAmplificationZones.length,\n },\n health: {\n healthScore: summary.health.healthScore,\n healthTier: toHealthTier(summary.health.healthScore),\n normalizedScore: summary.health.normalizedScore,\n dimensions: summary.health.dimensions,\n topIssues: summary.health.topIssues.slice(0, 5),\n },\n});\n\nexport const formatAnalyzeOutput = (summary: AnalyzeSummary, mode: AnalyzeOutputMode): string =>\n mode === \"json\"\n ? JSON.stringify(summary, null, 2)\n : JSON.stringify(createSummaryShape(summary), null, 2);\n","import type { AnalyzeSummary, RiskFactorTrace, RiskTrace, TargetTrace } from \"@codesentinel/core\";\nimport type { ExplainFormat } from \"./run-explain-command.js\";\n\nexport type ExplainOutputPayload = {\n summary: AnalyzeSummary;\n trace: RiskTrace;\n selectedTargets: readonly TargetTrace[];\n};\n\nconst sortFactorByContribution = (left: RiskFactorTrace, right: RiskFactorTrace): number =>\n right.contribution - left.contribution || left.factorId.localeCompare(right.factorId);\n\nconst toRiskBand = (score: number): \"low\" | \"moderate\" | \"elevated\" | \"high\" | \"very_high\" => {\n if (score < 20) {\n return \"low\";\n }\n if (score < 40) {\n return \"moderate\";\n }\n if (score < 60) {\n return \"elevated\";\n }\n if (score < 80) {\n return \"high\";\n }\n return \"very_high\";\n};\n\nconst factorLabelById: Readonly<Record<string, string>> = {\n \"repository.structural\": \"Structural complexity\",\n \"repository.evolution\": \"Change volatility\",\n \"repository.external\": \"External dependency pressure\",\n \"repository.composite.interactions\": \"Intersection amplification\",\n \"file.structural\": \"File structural complexity\",\n \"file.evolution\": \"File change volatility\",\n \"file.external\": \"File external pressure\",\n \"file.composite.interactions\": \"File interaction amplification\",\n \"module.average_file_risk\": \"Average file risk\",\n \"module.peak_file_risk\": \"Peak file risk\",\n \"dependency.signals\": \"Dependency risk signals\",\n \"dependency.staleness\": \"Dependency staleness\",\n \"dependency.maintainer_concentration\": \"Maintainer concentration\",\n \"dependency.topology\": \"Dependency topology pressure\",\n \"dependency.bus_factor\": \"Dependency bus factor\",\n \"dependency.popularity_dampening\": \"Popularity dampening\",\n};\n\nconst formatFactorLabel = (factorId: string): string => factorLabelById[factorId] ?? factorId;\n\nconst formatNumber = (value: number | null | undefined): string =>\n value === null || value === undefined ? \"n/a\" : `${value}`;\n\nconst formatDimension = (value: number | null): string => (value === null ? \"n/a\" : `${value}`);\n\nconst formatFactorSummary = (factor: RiskFactorTrace): string =>\n `${formatFactorLabel(factor.factorId)} (+${factor.contribution}, confidence=${factor.confidence})`;\n\nconst formatFactorContribution = (factor: RiskFactorTrace): string =>\n `${formatFactorLabel(factor.factorId)}=${factor.contribution}`;\n\nconst formatFactorEvidence = (factor: RiskFactorTrace): string => {\n if (factor.factorId === \"repository.structural\") {\n return `structural dimension=${formatNumber(factor.rawMetrics[\"structuralDimension\"])}`;\n }\n\n if (factor.factorId === \"repository.evolution\") {\n return `evolution dimension=${formatNumber(factor.rawMetrics[\"evolutionDimension\"])}`;\n }\n\n if (factor.factorId === \"repository.external\") {\n return `external dimension=${formatNumber(factor.rawMetrics[\"externalDimension\"])}`;\n }\n\n if (factor.factorId === \"repository.composite.interactions\") {\n return `structural×evolution=${formatNumber(factor.rawMetrics[\"structuralEvolution\"])}, central instability=${formatNumber(factor.rawMetrics[\"centralInstability\"])}, dependency amplification=${formatNumber(factor.rawMetrics[\"dependencyAmplification\"])}`;\n }\n\n if (factor.factorId === \"file.structural\") {\n return `fanIn=${formatNumber(factor.rawMetrics[\"fanIn\"])}, fanOut=${formatNumber(factor.rawMetrics[\"fanOut\"])}, depth=${formatNumber(factor.rawMetrics[\"depth\"])}, inCycle=${formatNumber(factor.rawMetrics[\"cycleParticipation\"])}, structuralAttenuation=${formatNumber(factor.rawMetrics[\"structuralAttenuation\"])}`;\n }\n\n if (factor.factorId === \"file.evolution\") {\n return `commitCount=${formatNumber(factor.rawMetrics[\"commitCount\"])}, churnTotal=${formatNumber(factor.rawMetrics[\"churnTotal\"])}, recentVolatility=${formatNumber(factor.rawMetrics[\"recentVolatility\"])}`;\n }\n\n if (factor.factorId === \"file.external\") {\n return `repositoryExternalPressure=${formatNumber(factor.rawMetrics[\"repositoryExternalPressure\"])}, dependencyAffinity=${formatNumber(factor.rawMetrics[\"dependencyAffinity\"])}`;\n }\n\n if (factor.factorId === \"file.composite.interactions\") {\n return `structural×evolution=${formatNumber(factor.rawMetrics[\"structuralEvolutionInteraction\"])}, central instability=${formatNumber(factor.rawMetrics[\"centralInstabilityInteraction\"])}, dependency amplification=${formatNumber(factor.rawMetrics[\"dependencyAmplificationInteraction\"])}`;\n }\n\n return \"evidence available in trace\";\n};\n\nconst findRepositoryTarget = (targets: readonly TargetTrace[]): TargetTrace | undefined =>\n targets.find((target) => target.targetType === \"repository\");\n\nconst repositoryDimensionScores = (\n repositoryTarget: TargetTrace | undefined,\n): {\n structural: number | null;\n evolution: number | null;\n external: number | null;\n interactions: number | null;\n} => {\n if (repositoryTarget === undefined) {\n return {\n structural: null,\n evolution: null,\n external: null,\n interactions: null,\n };\n }\n\n const structural = repositoryTarget.factors.find(\n (factor) => factor.factorId === \"repository.structural\",\n );\n const evolution = repositoryTarget.factors.find(\n (factor) => factor.factorId === \"repository.evolution\",\n );\n const external = repositoryTarget.factors.find(\n (factor) => factor.factorId === \"repository.external\",\n );\n const interactions = repositoryTarget.factors.find(\n (factor) => factor.factorId === \"repository.composite.interactions\",\n );\n\n return {\n structural:\n structural === undefined\n ? null\n : Number(((structural.rawMetrics[\"structuralDimension\"] ?? 0) * 100).toFixed(4)),\n evolution:\n evolution === undefined\n ? null\n : Number(((evolution.rawMetrics[\"evolutionDimension\"] ?? 0) * 100).toFixed(4)),\n external:\n external === undefined\n ? null\n : Number(((external.rawMetrics[\"externalDimension\"] ?? 0) * 100).toFixed(4)),\n interactions:\n interactions === undefined\n ? null\n : Number(\n (\n ((interactions.rawMetrics[\"structuralEvolution\"] ?? 0) +\n (interactions.rawMetrics[\"centralInstability\"] ?? 0) +\n (interactions.rawMetrics[\"dependencyAmplification\"] ?? 0)) *\n 100\n ).toFixed(4),\n ),\n };\n};\n\nconst buildRepositoryActions = (\n payload: ExplainOutputPayload,\n repositoryTarget: TargetTrace | undefined,\n): readonly string[] => {\n if (repositoryTarget === undefined) {\n return [\"No repository trace available.\"];\n }\n\n const topHotspots = payload.summary.risk.hotspots.slice(0, 3).map((hotspot) => hotspot.file);\n const highRiskDependencies = payload.summary.external.available\n ? payload.summary.external.highRiskDependencies.slice(0, 3)\n : [];\n\n const actions: string[] = [];\n for (const lever of repositoryTarget.reductionLevers) {\n if (lever.factorId === \"repository.evolution\") {\n actions.push(\n `Reduce volatility/churn in top hotspots first: ${topHotspots.join(\", \") || \"no hotspots available\"}.`,\n );\n continue;\n }\n\n if (lever.factorId === \"repository.structural\") {\n actions.push(\n `Lower fan-in/fan-out and break cycles in central files: ${topHotspots.join(\", \") || \"no hotspots available\"}.`,\n );\n continue;\n }\n\n if (lever.factorId === \"repository.composite.interactions\") {\n actions.push(\n \"Stabilize central files before refactors; interaction effects are amplifying risk.\",\n );\n continue;\n }\n\n if (lever.factorId === \"repository.external\") {\n actions.push(\n `Review high-risk direct dependencies: ${highRiskDependencies.join(\", \") || \"none detected\"}.`,\n );\n continue;\n }\n }\n\n if (actions.length === 0) {\n actions.push(\"No clear reduction levers available from current trace.\");\n }\n\n return actions.slice(0, 3);\n};\n\nconst renderTargetText = (target: TargetTrace): string => {\n const lines: string[] = [];\n lines.push(`${target.targetType}: ${target.targetId}`);\n lines.push(` score: ${target.totalScore} (${target.normalizedScore})`);\n lines.push(\" top factors:\");\n\n const topFactors = [...target.factors].sort(sortFactorByContribution).slice(0, 5);\n for (const factor of topFactors) {\n lines.push(` - ${formatFactorSummary(factor)}`);\n lines.push(` evidence: ${formatFactorEvidence(factor)}`);\n }\n\n lines.push(\" reduction levers:\");\n for (const lever of target.reductionLevers) {\n lines.push(\n ` - ${formatFactorLabel(lever.factorId)} | estimatedImpact=${lever.estimatedImpact}`,\n );\n }\n\n return lines.join(\"\\n\");\n};\n\nconst renderText = (payload: ExplainOutputPayload): string => {\n const lines: string[] = [];\n const repositoryTarget =\n findRepositoryTarget(payload.selectedTargets) ?? findRepositoryTarget(payload.trace.targets);\n const repositoryTopFactors =\n repositoryTarget === undefined\n ? []\n : [...repositoryTarget.factors].sort(sortFactorByContribution).slice(0, 3);\n const dimensionScores = repositoryDimensionScores(repositoryTarget);\n const compositeFactors = repositoryTopFactors.filter((factor) => factor.family === \"composite\");\n\n lines.push(`target: ${payload.summary.structural.targetPath}`);\n lines.push(`riskScore: ${payload.summary.risk.riskScore}`);\n lines.push(`riskBand: ${toRiskBand(payload.summary.risk.riskScore)}`);\n lines.push(`selectedTargets: ${payload.selectedTargets.length}`);\n lines.push(\"dimensionScores:\");\n lines.push(` structural: ${formatDimension(dimensionScores.structural)}`);\n lines.push(` evolution: ${formatDimension(dimensionScores.evolution)}`);\n lines.push(` external: ${formatDimension(dimensionScores.external)}`);\n lines.push(` interactions: ${formatDimension(dimensionScores.interactions)}`);\n lines.push(\"\");\n lines.push(\"explanation:\");\n lines.push(\n ` key drivers: ${repositoryTopFactors.map(formatFactorSummary).join(\"; \") || \"insufficient data\"}`,\n );\n lines.push(\n ` contributions: ${repositoryTopFactors.map(formatFactorContribution).join(\", \") || \"insufficient data\"}`,\n );\n lines.push(\n ` interaction effects: ${compositeFactors.map((factor) => `${formatFactorLabel(factor.factorId)} [${formatFactorEvidence(factor)}]`).join(\"; \") || \"none\"}`,\n );\n lines.push(` priority actions: ${buildRepositoryActions(payload, repositoryTarget).join(\" \")}`);\n lines.push(\"\");\n\n for (const target of payload.selectedTargets) {\n lines.push(renderTargetText(target));\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\").trimEnd();\n};\n\nconst renderMarkdown = (payload: ExplainOutputPayload): string => {\n const lines: string[] = [];\n const repositoryTarget =\n findRepositoryTarget(payload.selectedTargets) ?? findRepositoryTarget(payload.trace.targets);\n const repositoryTopFactors =\n repositoryTarget === undefined\n ? []\n : [...repositoryTarget.factors].sort(sortFactorByContribution).slice(0, 3);\n const dimensionScores = repositoryDimensionScores(repositoryTarget);\n const compositeFactors = repositoryTopFactors.filter((factor) => factor.family === \"composite\");\n\n lines.push(`# CodeSentinel Explanation`);\n lines.push(`- target: \\`${payload.summary.structural.targetPath}\\``);\n lines.push(`- riskScore: \\`${payload.summary.risk.riskScore}\\``);\n lines.push(`- riskBand: \\`${toRiskBand(payload.summary.risk.riskScore)}\\``);\n lines.push(`- selectedTargets: \\`${payload.selectedTargets.length}\\``);\n lines.push(\"\");\n lines.push(\"## Dimension Scores (0-100)\");\n lines.push(`- structural: \\`${formatDimension(dimensionScores.structural)}\\``);\n lines.push(`- evolution: \\`${formatDimension(dimensionScores.evolution)}\\``);\n lines.push(`- external: \\`${formatDimension(dimensionScores.external)}\\``);\n lines.push(`- interactions: \\`${formatDimension(dimensionScores.interactions)}\\``);\n lines.push(\"\");\n lines.push(`## Summary`);\n lines.push(\n `- key drivers: ${repositoryTopFactors.map(formatFactorSummary).join(\"; \") || \"insufficient data\"}`,\n );\n lines.push(\n `- contributions: ${repositoryTopFactors.map(formatFactorContribution).join(\", \") || \"insufficient data\"}`,\n );\n lines.push(\n `- interaction effects: ${compositeFactors.map((factor) => `${formatFactorLabel(factor.factorId)} [${formatFactorEvidence(factor)}]`).join(\"; \") || \"none\"}`,\n );\n lines.push(`- priority actions: ${buildRepositoryActions(payload, repositoryTarget).join(\" \")}`);\n lines.push(\"\");\n\n for (const target of payload.selectedTargets) {\n lines.push(`## ${target.targetType}: \\`${target.targetId}\\``);\n lines.push(`- score: \\`${target.totalScore}\\` (\\`${target.normalizedScore}\\`)`);\n lines.push(`- Top factors:`);\n for (const factor of [...target.factors].sort(sortFactorByContribution).slice(0, 5)) {\n lines.push(\n ` - \\`${formatFactorLabel(factor.factorId)}\\` contribution=\\`${factor.contribution}\\` confidence=\\`${factor.confidence}\\``,\n );\n lines.push(` - evidence: \\`${formatFactorEvidence(factor)}\\``);\n }\n lines.push(`- Reduction levers:`);\n for (const lever of target.reductionLevers) {\n lines.push(\n ` - \\`${formatFactorLabel(lever.factorId)}\\` estimatedImpact=\\`${lever.estimatedImpact}\\``,\n );\n }\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\").trimEnd();\n};\n\nexport const formatExplainOutput = (\n payload: ExplainOutputPayload,\n format: ExplainFormat,\n): string => {\n if (format === \"json\") {\n return JSON.stringify(payload, null, 2);\n }\n\n if (format === \"md\") {\n return renderMarkdown(payload);\n }\n\n return renderText(payload);\n};\n","import type { AnalyzeDependencyCandidateResult } from \"@codesentinel/dependency-firewall\";\n\nexport type DependencyRiskOutputMode = \"summary\" | \"json\";\n\ntype UnavailableResult = Extract<AnalyzeDependencyCandidateResult, { available: false }>;\ntype AvailableResult = Extract<AnalyzeDependencyCandidateResult, { available: true }>;\n\ntype DependencyRiskSummaryShape =\n | {\n available: false;\n reason: UnavailableResult[\"reason\"];\n dependency: string;\n }\n | {\n available: true;\n dependency: AvailableResult[\"dependency\"];\n graph: AvailableResult[\"graph\"];\n assumptions: readonly string[];\n external: {\n available: boolean;\n metrics: Record<string, unknown> | null;\n ownRiskSignals: readonly string[];\n inheritedRiskSignals: readonly string[];\n highRiskDependenciesTop: readonly string[];\n transitiveExposureDependenciesTop: readonly string[];\n };\n };\n\nconst createSummaryShape = (\n result: AnalyzeDependencyCandidateResult,\n): DependencyRiskSummaryShape => {\n if (!result.available) {\n return {\n available: false,\n reason: result.reason,\n dependency: result.dependency,\n };\n }\n\n const direct = result.external.available ? result.external.dependencies[0] : undefined;\n\n return {\n available: true,\n dependency: result.dependency,\n graph: result.graph,\n assumptions: result.assumptions,\n external: {\n available: result.external.available,\n metrics: result.external.available ? result.external.metrics : null,\n ownRiskSignals: direct?.ownRiskSignals ?? [],\n inheritedRiskSignals: direct?.inheritedRiskSignals ?? [],\n highRiskDependenciesTop: result.external.available\n ? result.external.highRiskDependencies.slice(0, 10)\n : [],\n transitiveExposureDependenciesTop: result.external.available\n ? result.external.transitiveExposureDependencies.slice(0, 10)\n : [],\n },\n };\n};\n\nexport const formatDependencyRiskOutput = (\n result: AnalyzeDependencyCandidateResult,\n mode: DependencyRiskOutputMode,\n): string =>\n mode === \"json\"\n ? JSON.stringify(result, null, 2)\n : JSON.stringify(createSummaryShape(result), null, 2);\n","export type LogLevel = \"silent\" | \"error\" | \"warn\" | \"info\" | \"debug\";\n\nconst logLevelRank: Readonly<Record<Exclude<LogLevel, \"silent\">, number>> = {\n error: 0,\n warn: 1,\n info: 2,\n debug: 3,\n};\n\nexport type Logger = {\n error: (message: string) => void;\n warn: (message: string) => void;\n info: (message: string) => void;\n debug: (message: string) => void;\n};\n\nconst noop = (): void => {};\n\nexport const createSilentLogger = (): Logger => ({\n error: noop,\n warn: noop,\n info: noop,\n debug: noop,\n});\n\nconst shouldLog = (\n configuredLevel: LogLevel,\n messageLevel: Exclude<LogLevel, \"silent\">,\n): boolean => {\n if (configuredLevel === \"silent\") {\n return false;\n }\n\n return logLevelRank[messageLevel] <= logLevelRank[configuredLevel];\n};\n\nconst write = (messageLevel: Exclude<LogLevel, \"silent\">, message: string): void => {\n process.stderr.write(`[codesentinel] ${messageLevel.toUpperCase()} ${message}\\n`);\n};\n\nexport const createStderrLogger = (level: LogLevel): Logger => {\n if (level === \"silent\") {\n return createSilentLogger();\n }\n\n return {\n error: (message) => {\n if (shouldLog(level, \"error\")) {\n write(\"error\", message);\n }\n },\n warn: (message) => {\n if (shouldLog(level, \"warn\")) {\n write(\"warn\", message);\n }\n },\n info: (message) => {\n if (shouldLog(level, \"info\")) {\n write(\"info\", message);\n }\n },\n debug: (message) => {\n if (shouldLog(level, \"debug\")) {\n write(\"debug\", message);\n }\n },\n };\n};\n\nexport const parseLogLevel = (value: string | undefined): LogLevel => {\n switch (value) {\n case \"silent\":\n case \"error\":\n case \"warn\":\n case \"info\":\n case \"debug\":\n return value;\n default:\n return \"info\";\n }\n};\n","import { spawn } from \"node:child_process\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { stderr, stdin } from \"node:process\";\nimport { clearScreenDown, cursorTo, emitKeypressEvents } from \"node:readline\";\n\nconst UPDATE_CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000;\nconst UPDATE_CACHE_PATH = join(homedir(), \".cache\", \"codesentinel\", \"update-check.json\");\nconst SEMVER_PATTERN =\n /^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)(?:-(?<prerelease>[0-9A-Za-z.-]+))?(?:\\+[0-9A-Za-z.-]+)?$/;\nconst ANSI = {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n cyan: \"\\x1b[36m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n} as const;\n\nconst hideCursor = (): void => {\n stderr.write(\"\\x1b[?25l\");\n};\n\nconst showCursor = (): void => {\n stderr.write(\"\\x1b[?25h\");\n};\n\ntype Semver = {\n major: number;\n minor: number;\n patch: number;\n prerelease: readonly (number | string)[];\n};\n\ntype UpdateCheckCache = {\n lastCheckedAt: string;\n};\n\nconst parsePrereleaseIdentifier = (identifier: string): number | string => {\n if (/^\\d+$/.test(identifier)) {\n return Number.parseInt(identifier, 10);\n }\n return identifier;\n};\n\nconst parseSemver = (value: string): Semver | null => {\n const match = SEMVER_PATTERN.exec(value.trim());\n if (match === null) {\n return null;\n }\n\n const groups = match.groups;\n if (groups === undefined) {\n return null;\n }\n\n const majorRaw = groups[\"major\"];\n const minorRaw = groups[\"minor\"];\n const patchRaw = groups[\"patch\"];\n const prereleaseRaw = groups[\"prerelease\"];\n if (majorRaw === undefined || minorRaw === undefined || patchRaw === undefined) {\n return null;\n }\n\n const prerelease =\n prereleaseRaw === undefined || prereleaseRaw.length === 0\n ? []\n : prereleaseRaw.split(\".\").map(parsePrereleaseIdentifier);\n\n return {\n major: Number.parseInt(majorRaw, 10),\n minor: Number.parseInt(minorRaw, 10),\n patch: Number.parseInt(patchRaw, 10),\n prerelease,\n };\n};\n\nconst comparePrerelease = (\n left: readonly (number | string)[],\n right: readonly (number | string)[],\n): number => {\n if (left.length === 0 && right.length === 0) {\n return 0;\n }\n if (left.length === 0) {\n return 1;\n }\n if (right.length === 0) {\n return -1;\n }\n\n const length = Math.max(left.length, right.length);\n for (let index = 0; index < length; index += 1) {\n const leftValue = left[index];\n const rightValue = right[index];\n if (leftValue === undefined) {\n return -1;\n }\n if (rightValue === undefined) {\n return 1;\n }\n\n if (typeof leftValue === \"number\" && typeof rightValue === \"number\") {\n if (leftValue !== rightValue) {\n return leftValue > rightValue ? 1 : -1;\n }\n continue;\n }\n\n if (typeof leftValue === \"number\" && typeof rightValue === \"string\") {\n return -1;\n }\n if (typeof leftValue === \"string\" && typeof rightValue === \"number\") {\n return 1;\n }\n\n if (leftValue !== rightValue) {\n return leftValue > rightValue ? 1 : -1;\n }\n }\n\n return 0;\n};\n\nexport const compareVersions = (left: string, right: string): number | null => {\n const leftParsed = parseSemver(left);\n const rightParsed = parseSemver(right);\n if (leftParsed === null || rightParsed === null) {\n return null;\n }\n\n if (leftParsed.major !== rightParsed.major) {\n return leftParsed.major > rightParsed.major ? 1 : -1;\n }\n if (leftParsed.minor !== rightParsed.minor) {\n return leftParsed.minor > rightParsed.minor ? 1 : -1;\n }\n if (leftParsed.patch !== rightParsed.patch) {\n return leftParsed.patch > rightParsed.patch ? 1 : -1;\n }\n\n return comparePrerelease(leftParsed.prerelease, rightParsed.prerelease);\n};\n\nconst isTruthy = (value: string | undefined): boolean => {\n if (value === undefined) {\n return false;\n }\n return [\"1\", \"true\", \"yes\", \"on\"].includes(value.trim().toLowerCase());\n};\n\nexport const parseNpmViewVersionOutput = (output: string): string | null => {\n const trimmed = output.trim();\n if (trimmed.length === 0) {\n return null;\n }\n\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n if (typeof parsed === \"string\" && parsed.trim().length > 0) {\n return parsed.trim();\n }\n if (Array.isArray(parsed) && parsed.length > 0) {\n const latest = (parsed as unknown[]).at(-1);\n if (typeof latest === \"string\" && latest.trim().length > 0) {\n return latest.trim();\n }\n }\n } catch {\n return trimmed;\n }\n\n return null;\n};\n\nexport const renderUpdateInProgressMessage = (packageName: string): string =>\n `Updating CodeSentinel via \\`npm install -g ${packageName}\\`...\\n`;\n\nexport const renderUpdateSuccessMessage = (): string =>\n \"🎉 Update ran successfully! Please restart CodeSentinel.\\n\";\n\nexport const renderAlreadyUpToDateMessage = (currentVersion: string): string =>\n `CodeSentinel is already up to date (${currentVersion}).\\n`;\n\nexport const renderUpdateCheckFailedMessage = (): string =>\n \"CodeSentinel could not check for updates right now. Please try again later.\\n\";\n\nconst readCache = async (): Promise<UpdateCheckCache | null> => {\n try {\n const raw = await readFile(UPDATE_CACHE_PATH, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n if (\n typeof parsed === \"object\" &&\n parsed !== null &&\n typeof (parsed as { lastCheckedAt?: unknown }).lastCheckedAt === \"string\"\n ) {\n return { lastCheckedAt: (parsed as { lastCheckedAt: string }).lastCheckedAt };\n }\n } catch {\n return null;\n }\n\n return null;\n};\n\nconst writeCache = async (cache: UpdateCheckCache): Promise<void> => {\n await mkdir(dirname(UPDATE_CACHE_PATH), { recursive: true });\n await writeFile(UPDATE_CACHE_PATH, JSON.stringify(cache), \"utf8\");\n};\n\nexport const shouldRunUpdateCheck = (input: {\n argv: readonly string[];\n env: NodeJS.ProcessEnv;\n isInteractive: boolean;\n nowMs: number;\n lastCheckedAt: string | null;\n}): boolean => {\n if (!input.isInteractive) {\n return false;\n }\n if (isTruthy(input.env[\"CI\"])) {\n return false;\n }\n if (isTruthy(input.env[\"CODESENTINEL_NO_UPDATE_NOTIFIER\"])) {\n return false;\n }\n if (input.argv.some((argument) => argument === \"--help\" || argument === \"-h\")) {\n return false;\n }\n if (input.argv.some((argument) => argument === \"--version\" || argument === \"-V\")) {\n return false;\n }\n\n if (input.lastCheckedAt === null) {\n return true;\n }\n\n const lastCheckedMs = Date.parse(input.lastCheckedAt);\n if (!Number.isFinite(lastCheckedMs)) {\n return true;\n }\n\n return input.nowMs - lastCheckedMs >= UPDATE_CHECK_INTERVAL_MS;\n};\n\nconst runCommand = async (\n command: string,\n args: readonly string[],\n mode: \"capture\" | \"inherit\",\n): Promise<{ code: number; stdout: string }> => {\n return await new Promise((resolvePromise, reject) => {\n const child = spawn(command, [...args], {\n stdio: mode === \"inherit\" ? \"inherit\" : [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let stdoutRaw = \"\";\n if (mode === \"capture\" && child.stdout !== null) {\n child.stdout.setEncoding(\"utf8\");\n child.stdout.on(\"data\", (chunk: string) => {\n stdoutRaw += chunk;\n });\n }\n\n child.on(\"error\", (error) => {\n reject(error);\n });\n child.on(\"close\", (code) => {\n resolvePromise({ code: code ?? 1, stdout: stdoutRaw });\n });\n });\n};\n\nconst fetchLatestVersion = async (packageName: string): Promise<string | null> => {\n const result = await runCommand(\"npm\", [\"view\", packageName, \"version\", \"--json\"], \"capture\");\n if (result.code !== 0) {\n return null;\n }\n return parseNpmViewVersionOutput(result.stdout);\n};\n\ntype UpdatePromptChoice = \"install\" | \"skip\";\n\nconst renderUpdatePrompt = (\n packageName: string,\n latestVersion: string,\n currentVersion: string,\n selectedIndex: number,\n): number => {\n const options: readonly string[] = [\n `1. Update now (runs \\`npm install -g ${packageName}\\`)`,\n \"2. Skip\",\n ];\n\n const lines = [\n ` ${ANSI.bold}${ANSI.cyan}✨ Update available! ${currentVersion} -> ${latestVersion}${ANSI.reset}`,\n \"\",\n ` ${ANSI.dim}Release notes: https://github.com/getcodesentinel/codesentinel/releases/latest${ANSI.reset}`,\n \"\",\n ...options.map((option, index) => {\n const selected = index === selectedIndex;\n const prefix = selected ? `${ANSI.green}>${ANSI.reset}` : \" \";\n const text = selected ? `${ANSI.bold}${option}${ANSI.reset}` : option;\n return `${prefix} ${text}`;\n }),\n \"\",\n ` ${ANSI.dim}Use ↑/↓ to choose. Press enter to continue. Press q or Ctrl+C to exit.${ANSI.reset}`,\n ];\n\n stderr.write(lines.join(\"\\n\"));\n return lines.length;\n};\n\nconst promptInstall = async (\n packageName: string,\n latestVersion: string,\n currentVersion: string,\n): Promise<UpdatePromptChoice> => {\n if (!stdin.isTTY || !stderr.isTTY || typeof stdin.setRawMode !== \"function\") {\n stderr.write(\n `New version ${latestVersion} is available (current ${currentVersion}). Run: npm install -g @getcodesentinel/codesentinel@latest\\n`,\n );\n return \"skip\";\n }\n\n return await new Promise<UpdatePromptChoice>((resolve) => {\n emitKeypressEvents(stdin);\n\n let selectedIndex = 0;\n const previousRawMode = stdin.isRaw;\n\n const clearPromptArea = (): void => {\n cursorTo(stderr, 0, 0);\n clearScreenDown(stderr);\n };\n\n const redraw = (): void => {\n clearPromptArea();\n renderUpdatePrompt(packageName, latestVersion, currentVersion, selectedIndex);\n };\n\n const cleanup = (choice: UpdatePromptChoice): void => {\n stdin.off(\"keypress\", onKeypress);\n stdin.pause();\n if (typeof stdin.setRawMode === \"function\") {\n stdin.setRawMode(previousRawMode);\n }\n clearPromptArea();\n showCursor();\n if (choice === \"install\") {\n stderr.write(`${ANSI.yellow}${renderUpdateInProgressMessage(packageName)}${ANSI.reset}`);\n } else {\n stderr.write(\"\\n\");\n }\n resolve(choice);\n };\n\n const onKeypress = (_str: string, key: { name?: string; ctrl?: boolean }): void => {\n if (key.ctrl === true && key.name === \"c\") {\n cleanup(\"skip\");\n return;\n }\n\n if (key.name === \"q\") {\n cleanup(\"skip\");\n return;\n }\n\n if (key.name === \"up\") {\n selectedIndex = selectedIndex > 0 ? selectedIndex - 1 : 1;\n redraw();\n return;\n }\n if (key.name === \"down\") {\n selectedIndex = selectedIndex < 1 ? selectedIndex + 1 : 0;\n redraw();\n return;\n }\n if (key.name === \"return\" || key.name === \"enter\") {\n cleanup(selectedIndex === 0 ? \"install\" : \"skip\");\n }\n };\n\n stdin.on(\"keypress\", onKeypress);\n if (typeof stdin.setRawMode === \"function\") {\n hideCursor();\n stdin.setRawMode(true);\n }\n stdin.resume();\n redraw();\n });\n};\n\nconst installLatestVersion = async (packageName: string): Promise<boolean> => {\n const result = await runCommand(\"npm\", [\"install\", \"-g\", `${packageName}@latest`], \"inherit\");\n return result.code === 0;\n};\n\nexport const runManualCliUpdate = async (input: {\n packageName: string;\n currentVersion: string;\n}): Promise<number> => {\n const latestVersion = await fetchLatestVersion(input.packageName);\n if (latestVersion === null) {\n stderr.write(renderUpdateCheckFailedMessage());\n return 1;\n }\n\n const comparison = compareVersions(latestVersion, input.currentVersion);\n if (comparison === null) {\n stderr.write(renderUpdateCheckFailedMessage());\n return 1;\n }\n\n if (comparison <= 0) {\n stderr.write(renderAlreadyUpToDateMessage(input.currentVersion));\n return 0;\n }\n\n const choice = await promptInstall(input.packageName, latestVersion, input.currentVersion);\n if (choice !== \"install\") {\n return 0;\n }\n\n const installed = await installLatestVersion(input.packageName);\n if (installed) {\n stderr.write(renderUpdateSuccessMessage());\n return 0;\n }\n\n stderr.write(\n \"CodeSentinel update failed. You can retry with: npm install -g @getcodesentinel/codesentinel@latest\\n\",\n );\n return 1;\n};\n\nexport const checkForCliUpdates = async (input: {\n packageName: string;\n currentVersion: string;\n argv: readonly string[];\n env: NodeJS.ProcessEnv;\n}): Promise<void> => {\n try {\n const nowMs = Date.now();\n const cache = await readCache();\n const shouldCheck = shouldRunUpdateCheck({\n argv: input.argv,\n env: input.env,\n isInteractive: Boolean(process.stdout.isTTY) && Boolean(process.stdin.isTTY),\n nowMs,\n lastCheckedAt: cache?.lastCheckedAt ?? null,\n });\n if (!shouldCheck) {\n return;\n }\n\n await writeCache({ lastCheckedAt: new Date(nowMs).toISOString() });\n\n const latestVersion = await fetchLatestVersion(input.packageName);\n if (latestVersion === null) {\n return;\n }\n\n const comparison = compareVersions(latestVersion, input.currentVersion);\n if (comparison === null || comparison <= 0) {\n return;\n }\n\n const choice = await promptInstall(input.packageName, latestVersion, input.currentVersion);\n if (choice !== \"install\") {\n return;\n }\n\n const installed = await installLatestVersion(input.packageName);\n if (installed) {\n stderr.write(renderUpdateSuccessMessage());\n process.exit(0);\n } else {\n stderr.write(\n \"CodeSentinel update failed. You can retry with: npm install -g @getcodesentinel/codesentinel@latest\\n\",\n );\n }\n } catch {\n // Update checks are best-effort and must never block the CLI command.\n }\n};\n","import { spawn } from \"node:child_process\";\nimport type { Readable } from \"node:stream\";\nimport { stderr, stdin, stdout } from \"node:process\";\nimport { clearScreenDown, cursorTo, emitKeypressEvents, moveCursor } from \"node:readline\";\nimport type { Interface as ReadlineInterface } from \"node:readline\";\nimport { createInterface as createPromisesInterface } from \"node:readline/promises\";\n\nconst ANSI = {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n cyan: \"\\x1b[36m\",\n green: \"\\x1b[32m\",\n} as const;\nconst PROMPT_PADDING = \" \";\n\ntype MenuActionDefinition = {\n label: string;\n description: string;\n commandBuilder: () => MenuActionResult | Promise<MenuActionResult>;\n};\n\ntype MenuActionResult =\n | {\n kind: \"run\";\n args: readonly string[];\n }\n | {\n kind: \"cancel\";\n };\n\nconst isWhitespace = (value: string): boolean => /\\s/.test(value);\n\nexport const splitShellLikeArgs = (input: string): string[] => {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return [];\n }\n\n const result: string[] = [];\n let current = \"\";\n let quote: '\"' | \"'\" | null = null;\n let escaping = false;\n\n for (const character of trimmed) {\n if (escaping) {\n current += character;\n escaping = false;\n continue;\n }\n\n if (character === \"\\\\\") {\n escaping = true;\n continue;\n }\n\n if (quote !== null) {\n if (character === quote) {\n quote = null;\n } else {\n current += character;\n }\n continue;\n }\n\n if (character === '\"' || character === \"'\") {\n quote = character;\n continue;\n }\n\n if (isWhitespace(character)) {\n if (current.length > 0) {\n result.push(current);\n current = \"\";\n }\n continue;\n }\n\n current += character;\n }\n\n if (escaping) {\n current += \"\\\\\";\n }\n if (quote !== null) {\n throw new Error(\"Unterminated quoted argument\");\n }\n if (current.length > 0) {\n result.push(current);\n }\n\n return result;\n};\n\nconst renderMenu = (\n currentVersion: string,\n actions: readonly MenuActionDefinition[],\n selectedIndex: number,\n): void => {\n const optionLabels = actions.map((action, index) => `${index + 1}. ${action.label}`);\n const labelWidth = optionLabels.reduce((max, label) => Math.max(max, label.length), 0);\n const lines = [\n ` ${ANSI.bold}${ANSI.cyan}CodeSentinel${ANSI.reset} ${ANSI.dim}v${currentVersion}${ANSI.reset}`,\n \"\",\n \" Choose an action:\",\n \"\",\n ...actions.map((action, index) => {\n const selected = index === selectedIndex;\n const prefix = selected ? `${ANSI.green}>${ANSI.reset}` : \" \";\n const label = optionLabels[index]?.padEnd(labelWidth, \" \") ?? \"\";\n const renderedLabel = selected ? `${ANSI.bold}${label}${ANSI.reset}` : label;\n return `${prefix} ${renderedLabel} ${ANSI.dim}${action.description}${ANSI.reset}`;\n }),\n \"\",\n ` ${ANSI.dim}Use ↑/↓ to choose. Press enter to continue. Press q or Ctrl+C to exit.${ANSI.reset}`,\n ];\n\n stderr.write(lines.join(\"\\n\"));\n};\n\nconst clearTerminal = (): void => {\n cursorTo(stderr, 0, 0);\n clearScreenDown(stderr);\n};\n\nconst hideCursor = (): void => {\n stderr.write(\"\\x1b[?25l\");\n};\n\nconst showCursor = (): void => {\n stderr.write(\"\\x1b[?25h\");\n};\n\nconst pipeWithPadding = (\n stream: Readable | null,\n target: NodeJS.WriteStream,\n padding: string,\n): void => {\n if (stream === null) {\n return;\n }\n\n stream.setEncoding(\"utf8\");\n\n let buffer = \"\";\n let needsPrefix = true;\n\n const writeChunk = (chunk: string): void => {\n let start = 0;\n while (start < chunk.length) {\n if (needsPrefix) {\n target.write(padding);\n needsPrefix = false;\n }\n\n const newlineIndex = chunk.indexOf(\"\\n\", start);\n if (newlineIndex === -1) {\n target.write(chunk.slice(start));\n return;\n }\n\n target.write(chunk.slice(start, newlineIndex + 1));\n needsPrefix = true;\n start = newlineIndex + 1;\n }\n };\n\n stream.on(\"data\", (chunk: string) => {\n buffer += chunk;\n const lastNewlineIndex = buffer.lastIndexOf(\"\\n\");\n\n if (lastNewlineIndex === -1) {\n return;\n }\n\n writeChunk(buffer.slice(0, lastNewlineIndex + 1));\n buffer = buffer.slice(lastNewlineIndex + 1);\n });\n\n stream.on(\"end\", () => {\n if (buffer.length > 0) {\n writeChunk(buffer);\n buffer = \"\";\n }\n });\n};\n\nconst promptSelection = async (\n currentVersion: string,\n actions: readonly MenuActionDefinition[],\n): Promise<number | \"exit\"> => {\n if (!stdin.isTTY || !stderr.isTTY || typeof stdin.setRawMode !== \"function\") {\n return \"exit\";\n }\n\n return await new Promise<number | \"exit\">((resolve) => {\n emitKeypressEvents(stdin);\n\n let selectedIndex = 0;\n const previousRawMode = stdin.isRaw;\n\n const redraw = (): void => {\n clearTerminal();\n renderMenu(currentVersion, actions, selectedIndex);\n moveCursor(stderr, -1, 0);\n };\n\n const cleanup = (selection: number | \"exit\"): void => {\n stdin.off(\"keypress\", onKeypress);\n stdin.pause();\n stdin.setRawMode(previousRawMode);\n clearTerminal();\n showCursor();\n resolve(selection);\n };\n\n const onKeypress = (_str: string, key: { name?: string; ctrl?: boolean }): void => {\n if (key.ctrl === true && key.name === \"c\") {\n cleanup(\"exit\");\n return;\n }\n\n if (key.name === \"q\") {\n cleanup(\"exit\");\n return;\n }\n\n if (key.name === \"up\") {\n selectedIndex = selectedIndex > 0 ? selectedIndex - 1 : actions.length - 1;\n redraw();\n return;\n }\n\n if (key.name === \"down\") {\n selectedIndex = selectedIndex < actions.length - 1 ? selectedIndex + 1 : 0;\n redraw();\n return;\n }\n\n if (key.name === \"return\" || key.name === \"enter\") {\n cleanup(selectedIndex);\n }\n };\n\n stdin.on(\"keypress\", onKeypress);\n hideCursor();\n stdin.setRawMode(true);\n stdin.resume();\n redraw();\n });\n};\n\nconst createPrompt = (): ReadlineInterface =>\n createPromisesInterface({\n input: stdin,\n output: stderr,\n }) as unknown as ReadlineInterface;\n\nconst promptText = async (\n prompt: ReadlineInterface,\n label: string,\n defaultValue?: string,\n): Promise<string | null> => {\n const suffix =\n defaultValue === undefined || defaultValue.length === 0 ? \"\" : ` [${defaultValue}]`;\n let answer: string;\n\n try {\n answer = await (prompt as unknown as ReturnType<typeof createPromisesInterface>).question(\n `${PROMPT_PADDING}${label}${suffix}: `,\n );\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ABORT_ERR\") {\n stderr.write(\"\\n\");\n return null;\n }\n throw error;\n }\n\n const trimmed = answer.trim();\n return trimmed.length > 0 ? trimmed : (defaultValue ?? \"\");\n};\n\nconst renderDependencyRiskPrompt = (errorMessage?: string): void => {\n clearTerminal();\n stderr.write(`${PROMPT_PADDING}${ANSI.bold}Scan dependency risk${ANSI.reset}\\n`);\n if (errorMessage !== undefined) {\n stderr.write(`\\n${PROMPT_PADDING}${errorMessage}\\n`);\n }\n stderr.write(\"\\n\");\n};\n\nconst buildDependencyRiskArgs = async (): Promise<MenuActionResult> => {\n const prompt = createPrompt();\n\n try {\n let errorMessage: string | undefined;\n\n while (true) {\n renderDependencyRiskPrompt(errorMessage);\n const dependency = await promptText(prompt, \"Package name\");\n if (dependency === null) {\n return { kind: \"cancel\" };\n }\n\n if (dependency.length === 0) {\n errorMessage = \"A package name is required.\";\n continue;\n }\n\n return {\n kind: \"run\",\n args: [\"dependency-risk\", dependency],\n };\n }\n } finally {\n prompt.close();\n }\n};\n\nconst waitForReturnToMenu = async (): Promise<void> => {\n if (!stdin.isTTY || !stderr.isTTY || typeof stdin.setRawMode !== \"function\") {\n return;\n }\n\n stderr.write(`\\n${PROMPT_PADDING}Press enter to return to the menu...`);\n\n await new Promise<void>((resolve) => {\n emitKeypressEvents(stdin);\n const previousRawMode = stdin.isRaw;\n\n const cleanup = (): void => {\n stdin.off(\"keypress\", onKeypress);\n stdin.pause();\n stdin.setRawMode(previousRawMode);\n showCursor();\n stderr.write(\"\\n\");\n resolve();\n };\n\n const onKeypress = (_str: string, key: { name?: string; ctrl?: boolean }): void => {\n if (key.ctrl === true && key.name === \"c\") {\n cleanup();\n return;\n }\n\n if (key.name === \"return\" || key.name === \"enter\") {\n cleanup();\n }\n };\n\n hideCursor();\n stdin.on(\"keypress\", onKeypress);\n stdin.setRawMode(true);\n stdin.resume();\n });\n};\n\nconst runCliCommand = async (scriptPath: string, args: readonly string[]): Promise<number> => {\n return await new Promise((resolve, reject) => {\n const child = spawn(process.execPath, [...process.execArgv, scriptPath, ...args], {\n stdio: [\"inherit\", \"pipe\", \"pipe\"],\n env: {\n ...process.env,\n CODESENTINEL_NO_UPDATE_NOTIFIER: \"1\",\n },\n });\n\n pipeWithPadding(child.stdout, stdout, PROMPT_PADDING);\n pipeWithPadding(child.stderr, stderr, PROMPT_PADDING);\n\n child.on(\"error\", (error) => {\n reject(error);\n });\n child.on(\"close\", (code) => {\n resolve(code ?? 1);\n });\n });\n};\n\nexport const runInteractiveCliMenu = async (input: {\n currentVersion: string;\n scriptPath: string;\n}): Promise<number> => {\n if (!stdin.isTTY || !stderr.isTTY || !stdout.isTTY) {\n stderr.write(`${PROMPT_PADDING}Interactive menu requires a TTY.\\n`);\n return 1;\n }\n\n const actions: readonly MenuActionDefinition[] = [\n {\n label: \"Run overview\",\n description: \"combined analyze + explain + report\",\n commandBuilder: () => ({ kind: \"run\", args: [\"run\"] }),\n },\n {\n label: \"Analyze repository\",\n description: \"structural and health scoring summary\",\n commandBuilder: () => ({ kind: \"run\", args: [\"analyze\"] }),\n },\n {\n label: \"Explain hotspots\",\n description: \"top findings in markdown by default\",\n commandBuilder: () => ({ kind: \"run\", args: [\"explain\", \"--format\", \"md\"] }),\n },\n {\n label: \"Generate report\",\n description: \"create a full report for a repository\",\n commandBuilder: () => ({ kind: \"run\", args: [\"report\", \"--format\", \"md\"] }),\n },\n {\n label: \"Run policy check\",\n description: \"execute governance gates\",\n commandBuilder: () => ({ kind: \"run\", args: [\"check\"] }),\n },\n {\n label: \"Scan dependency risk\",\n description: \"inspect a package from the registry\",\n commandBuilder: buildDependencyRiskArgs,\n },\n ];\n\n while (true) {\n const selectedIndex = await promptSelection(input.currentVersion, actions);\n if (selectedIndex === \"exit\") {\n stderr.write(\"\\n\");\n return 0;\n }\n\n const selectedAction = actions[selectedIndex];\n if (selectedAction === undefined) {\n stderr.write(`\\n${PROMPT_PADDING}`);\n return 1;\n }\n\n const actionResult = await selectedAction.commandBuilder();\n if (actionResult.kind === \"cancel\") {\n continue;\n }\n\n const exitCode = await runCliCommand(input.scriptPath, actionResult.args);\n if (exitCode !== 0) {\n stderr.write(`\\n${PROMPT_PADDING}Command exited with code ${exitCode}.\\n`);\n } else {\n stderr.write(\"\\n\");\n }\n await waitForReturnToMenu();\n }\n};\n","import { resolve } from \"node:path\";\nimport type { AnalyzeSummary } from \"@codesentinel/core\";\nimport {\n buildProjectGraphSummary,\n type ParseTypescriptProjectProgressEvent,\n} from \"@codesentinel/code-graph\";\nimport {\n analyzeDependencyExposureFromProject,\n type DependencyExposureProgressEvent,\n} from \"@codesentinel/dependency-firewall\";\nimport {\n analyzeRepositoryEvolutionFromGit,\n type EvolutionAnalysisProgressEvent,\n} from \"@codesentinel/git-analyzer\";\nimport {\n computeRepositoryHealthSummary,\n type HealthEngineConfig,\n} from \"@codesentinel/health-engine\";\nimport { computeRepositoryRiskSummary, type RiskEngineConfig } from \"@codesentinel/risk-engine\";\nimport { createSilentLogger, type Logger } from \"./logger.js\";\n\nexport type AuthorIdentityCliMode = \"likely_merge\" | \"strict_email\";\nexport type ScoringProfileCliMode = \"default\" | \"personal\";\nexport type AnalysisRuntimeOptions = {\n recentWindowDays?: number;\n scoringProfile?: ScoringProfileCliMode;\n};\n\nconst resolveTargetPath = (inputPath: string | undefined, cwd: string): string =>\n resolve(cwd, inputPath ?? \".\");\n\nexport type AnalysisInputs = {\n structural: AnalyzeSummary[\"structural\"];\n evolution: AnalyzeSummary[\"evolution\"];\n external: AnalyzeSummary[\"external\"];\n};\n\nconst scoringProfileConfig: Readonly<\n Record<ScoringProfileCliMode, Partial<RiskEngineConfig> | undefined>\n> = {\n default: undefined,\n personal: {\n evolutionFactorWeights: {\n frequency: 0.26,\n churn: 0.24,\n recentVolatility: 0.2,\n ownershipConcentration: 0.08,\n busFactorRisk: 0.04,\n },\n },\n};\n\nconst healthProfileConfig: Readonly<\n Record<ScoringProfileCliMode, Partial<HealthEngineConfig> | undefined>\n> = {\n default: undefined,\n personal: {\n ownershipPenaltyMultiplier: 0.25,\n },\n};\n\nexport const resolveRiskConfigForProfile = (\n scoringProfile: ScoringProfileCliMode | undefined,\n): Partial<RiskEngineConfig> | undefined => {\n return scoringProfileConfig[scoringProfile ?? \"default\"];\n};\n\nexport const resolveHealthConfigForProfile = (\n scoringProfile: ScoringProfileCliMode | undefined,\n): Partial<HealthEngineConfig> | undefined => {\n return healthProfileConfig[scoringProfile ?? \"default\"];\n};\n\nconst createExternalProgressReporter = (\n logger: Logger,\n): ((event: DependencyExposureProgressEvent) => void) => {\n let lastLoggedProgress = 0;\n\n return (event) => {\n switch (event.stage) {\n case \"package_json_loaded\":\n logger.debug(\"external: package.json loaded\");\n break;\n case \"lockfile_selected\":\n logger.info(`external: lockfile selected (${event.kind})`);\n break;\n case \"lockfile_parsed\":\n logger.info(\n `external: parsed ${event.dependencyNodes} locked dependencies (${event.directDependencies} direct)`,\n );\n break;\n case \"metadata_fetch_started\":\n logger.info(`external: fetching dependency metadata (${event.total} packages)`);\n break;\n case \"metadata_fetch_progress\": {\n const currentPercent =\n event.total === 0 ? 100 : Math.floor((event.completed / event.total) * 100);\n if (\n event.completed === event.total ||\n event.completed === 1 ||\n event.completed - lastLoggedProgress >= 25\n ) {\n lastLoggedProgress = event.completed;\n logger.info(\n `external: metadata progress ${event.completed}/${event.total} (${currentPercent}%)`,\n );\n logger.debug(`external: last package processed ${event.packageName}`);\n }\n break;\n }\n case \"metadata_fetch_completed\":\n logger.info(`external: metadata fetch completed (${event.total} packages)`);\n break;\n case \"summary_built\":\n logger.info(\n `external: summary built (${event.totalDependencies} total, ${event.directDependencies} direct)`,\n );\n break;\n }\n };\n};\n\nconst createStructuralProgressReporter = (\n logger: Logger,\n): ((event: ParseTypescriptProjectProgressEvent) => void) => {\n let lastProcessed = 0;\n\n return (event) => {\n switch (event.stage) {\n case \"config_resolved\":\n if (event.usedFallbackScan) {\n logger.info(\n `structural: using filesystem scan discovery (tsconfigs=${event.tsconfigCount})`,\n );\n } else {\n logger.info(`structural: discovered tsconfig graph (${event.tsconfigCount} configs)`);\n }\n break;\n case \"files_discovered\":\n logger.info(`structural: discovered ${event.totalSourceFiles} source files`);\n break;\n case \"program_created\":\n logger.debug(`structural: TypeScript program created (${event.totalSourceFiles} files)`);\n break;\n case \"file_processed\":\n if (\n event.processed === event.total ||\n event.processed === 1 ||\n event.processed - lastProcessed >= 50\n ) {\n lastProcessed = event.processed;\n logger.info(`structural: resolved ${event.processed}/${event.total} files`);\n logger.debug(`structural: last file processed ${event.filePath}`);\n }\n break;\n case \"edges_resolved\":\n logger.info(`structural: resolved ${event.totalEdges} dependency edges`);\n break;\n }\n };\n};\n\nconst createEvolutionProgressReporter = (\n logger: Logger,\n): ((event: EvolutionAnalysisProgressEvent) => void) => {\n let lastParsedRecords = 0;\n\n return (event) => {\n switch (event.stage) {\n case \"checking_git_repository\":\n logger.debug(\"evolution: checking git repository\");\n break;\n case \"not_git_repository\":\n logger.warn(\"evolution: target path is not a git repository\");\n break;\n case \"loading_commit_history\":\n logger.info(\"evolution: loading git history\");\n break;\n case \"history\":\n if (event.event.stage === \"git_log_received\") {\n logger.info(`evolution: git log loaded (${event.event.bytes} bytes)`);\n break;\n }\n\n if (event.event.stage === \"git_log_parsed\") {\n logger.info(`evolution: parsed ${event.event.commits} commits`);\n break;\n }\n\n if (\n event.event.stage === \"git_log_parse_progress\" &&\n (event.event.parsedRecords === event.event.totalRecords ||\n event.event.parsedRecords === 1 ||\n event.event.parsedRecords - lastParsedRecords >= 500)\n ) {\n lastParsedRecords = event.event.parsedRecords;\n const currentPercent =\n event.event.totalRecords === 0\n ? 100\n : Math.floor((event.event.parsedRecords / event.event.totalRecords) * 100);\n logger.info(\n `evolution: parse progress ${event.event.parsedRecords}/${event.event.totalRecords} (${currentPercent}%)`,\n );\n }\n break;\n case \"computing_metrics\":\n logger.info(\"evolution: computing metrics\");\n break;\n case \"analysis_completed\":\n logger.debug(`evolution: analysis completed (available=${event.available})`);\n break;\n }\n };\n};\n\nexport const collectAnalysisInputs = async (\n inputPath: string | undefined,\n authorIdentityMode: AuthorIdentityCliMode,\n options: AnalysisRuntimeOptions = {},\n logger: Logger = createSilentLogger(),\n): Promise<AnalysisInputs> => {\n const invocationCwd = process.env[\"INIT_CWD\"] ?? process.cwd();\n const targetPath = resolveTargetPath(inputPath, invocationCwd);\n logger.info(`analyzing repository: ${targetPath}`);\n\n logger.info(\"building structural graph\");\n const structural = buildProjectGraphSummary({\n projectPath: targetPath,\n onProgress: createStructuralProgressReporter(logger),\n });\n logger.debug(\n `structural metrics: nodes=${structural.metrics.nodeCount}, edges=${structural.metrics.edgeCount}, cycles=${structural.metrics.cycleCount}`,\n );\n\n logger.info(`analyzing git evolution (author identity: ${authorIdentityMode})`);\n const evolution = analyzeRepositoryEvolutionFromGit(\n {\n repositoryPath: targetPath,\n config: {\n authorIdentityMode,\n ...(options.recentWindowDays === undefined\n ? {}\n : { recentWindowDays: options.recentWindowDays }),\n },\n },\n createEvolutionProgressReporter(logger),\n );\n if (evolution.available) {\n logger.debug(\n `evolution metrics: commits=${evolution.metrics.totalCommits}, files=${evolution.metrics.totalFiles}, hotspotThreshold=${evolution.metrics.hotspotThresholdCommitCount}`,\n );\n } else {\n logger.warn(`evolution analysis unavailable: ${evolution.reason}`);\n }\n\n logger.info(\"analyzing external dependencies\");\n const external = await analyzeDependencyExposureFromProject(\n { repositoryPath: targetPath },\n createExternalProgressReporter(logger),\n );\n if (external.available) {\n logger.debug(\n `external metrics: total=${external.metrics.totalDependencies}, direct=${external.metrics.directDependencies}, transitive=${external.metrics.transitiveDependencies}`,\n );\n } else {\n logger.warn(`external analysis unavailable: ${external.reason}`);\n }\n\n return {\n structural,\n evolution,\n external,\n };\n};\n\nexport const runAnalyzeCommand = async (\n inputPath: string | undefined,\n authorIdentityMode: AuthorIdentityCliMode,\n options: AnalysisRuntimeOptions = {},\n logger: Logger = createSilentLogger(),\n): Promise<AnalyzeSummary> => {\n const analysisInputs = await collectAnalysisInputs(\n inputPath,\n authorIdentityMode,\n options,\n logger,\n );\n logger.info(\"computing risk summary\");\n const riskConfig = resolveRiskConfigForProfile(options.scoringProfile);\n const healthConfig = resolveHealthConfigForProfile(options.scoringProfile);\n const risk = computeRepositoryRiskSummary({\n structural: analysisInputs.structural,\n evolution: analysisInputs.evolution,\n external: analysisInputs.external,\n ...(riskConfig === undefined ? {} : { config: riskConfig }),\n });\n const health = computeRepositoryHealthSummary({\n structural: analysisInputs.structural,\n evolution: analysisInputs.evolution,\n ...(healthConfig === undefined ? {} : { config: healthConfig }),\n });\n logger.info(\n `analysis completed (riskScore=${risk.riskScore}, healthScore=${health.healthScore})`,\n );\n\n return {\n structural: analysisInputs.structural,\n evolution: analysisInputs.evolution,\n external: analysisInputs.external,\n risk,\n health,\n };\n};\n","export type NodeRecord = {\n id: string;\n absolutePath: string;\n relativePath: string;\n};\n\nexport type EdgeRecord = {\n from: string;\n to: string;\n};\n\nexport type GraphData = {\n nodes: readonly NodeRecord[];\n edges: readonly EdgeRecord[];\n adjacencyById: ReadonlyMap<string, readonly string[]>;\n};\n\nconst edgeKey = (from: string, to: string): string => `${from}\\u0000${to}`;\n\nexport const createGraphData = (\n nodes: readonly NodeRecord[],\n rawEdges: readonly EdgeRecord[],\n): GraphData => {\n const sortedNodes = [...nodes].sort((a, b) => a.id.localeCompare(b.id));\n const knownNodeIds = new Set(sortedNodes.map((node) => node.id));\n\n const uniqueEdgeMap = new Map<string, EdgeRecord>();\n for (const edge of rawEdges) {\n if (edge.from === edge.to) {\n continue;\n }\n\n if (!knownNodeIds.has(edge.from) || !knownNodeIds.has(edge.to)) {\n continue;\n }\n\n uniqueEdgeMap.set(edgeKey(edge.from, edge.to), edge);\n }\n\n const sortedEdges = [...uniqueEdgeMap.values()].sort((a, b) => {\n const fromCompare = a.from.localeCompare(b.from);\n if (fromCompare !== 0) {\n return fromCompare;\n }\n\n return a.to.localeCompare(b.to);\n });\n\n const adjacency = new Map<string, string[]>();\n for (const node of sortedNodes) {\n adjacency.set(node.id, []);\n }\n\n for (const edge of sortedEdges) {\n adjacency.get(edge.from)?.push(edge.to);\n }\n\n const adjacencyById = new Map<string, readonly string[]>();\n for (const [nodeId, targets] of adjacency.entries()) {\n adjacencyById.set(nodeId, [...targets]);\n }\n\n return {\n nodes: sortedNodes,\n edges: sortedEdges,\n adjacencyById,\n };\n};\n","type TarjanResult = {\n components: readonly (readonly string[])[];\n};\n\nexport const runTarjanScc = (\n adjacencyById: ReadonlyMap<string, readonly string[]>,\n): TarjanResult => {\n // SCC = group of nodes where every node can reach every other node through directed edges.\n // In this codebase, SCCs are used to detect dependency cycles before computing graph depth.\n let index = 0;\n const indices = new Map<string, number>();\n const lowLink = new Map<string, number>();\n const stack: string[] = [];\n const onStack = new Set<string>();\n const components: string[][] = [];\n\n const strongConnect = (nodeId: string): void => {\n indices.set(nodeId, index);\n lowLink.set(nodeId, index);\n index += 1;\n\n stack.push(nodeId);\n onStack.add(nodeId);\n\n const neighbors = adjacencyById.get(nodeId) ?? [];\n for (const nextId of neighbors) {\n if (!indices.has(nextId)) {\n strongConnect(nextId);\n const nodeLowLink = lowLink.get(nodeId);\n const nextLowLink = lowLink.get(nextId);\n if (nodeLowLink !== undefined && nextLowLink !== undefined && nextLowLink < nodeLowLink) {\n lowLink.set(nodeId, nextLowLink);\n }\n continue;\n }\n\n if (onStack.has(nextId)) {\n const nodeLowLink = lowLink.get(nodeId);\n const nextIndex = indices.get(nextId);\n if (nodeLowLink !== undefined && nextIndex !== undefined && nextIndex < nodeLowLink) {\n lowLink.set(nodeId, nextIndex);\n }\n }\n }\n\n const nodeLowLink = lowLink.get(nodeId);\n const nodeIndex = indices.get(nodeId);\n if (nodeLowLink === undefined || nodeIndex === undefined || nodeLowLink !== nodeIndex) {\n return;\n }\n\n const component: string[] = [];\n for (;;) {\n const popped = stack.pop();\n if (popped === undefined) {\n break;\n }\n\n onStack.delete(popped);\n component.push(popped);\n if (popped === nodeId) {\n break;\n }\n }\n\n component.sort((a, b) => a.localeCompare(b));\n components.push(component);\n };\n\n const nodeIds = [...adjacencyById.keys()].sort((a, b) => a.localeCompare(b));\n for (const nodeId of nodeIds) {\n if (!indices.has(nodeId)) {\n strongConnect(nodeId);\n }\n }\n\n components.sort((a, b) => {\n const firstA = a[0] ?? \"\";\n const firstB = b[0] ?? \"\";\n return firstA.localeCompare(firstB);\n });\n\n return { components };\n};\n","import type {\n FileDependency,\n GraphAnalysisSummary,\n GraphCycle,\n GraphMetrics,\n} from \"@codesentinel/core\";\nimport type { GraphData } from \"./graph-model.js\";\nimport { runTarjanScc } from \"./tarjan.js\";\n\ntype DepthComputation = {\n depthByNodeId: ReadonlyMap<string, number>;\n graphDepth: number;\n cycles: readonly GraphCycle[];\n};\n\nconst hasSelfLoop = (\n nodeId: string,\n adjacencyById: ReadonlyMap<string, readonly string[]>,\n): boolean => {\n const targets = adjacencyById.get(nodeId) ?? [];\n return targets.includes(nodeId);\n};\n\nconst computeCyclesAndDepth = (graph: GraphData): DepthComputation => {\n const { components } = runTarjanScc(graph.adjacencyById);\n\n const cycles: GraphCycle[] = [];\n const componentByNodeId = new Map<string, number>();\n components.forEach((component, index) => {\n for (const nodeId of component) {\n componentByNodeId.set(nodeId, index);\n }\n\n if (component.length > 1) {\n cycles.push({ nodes: [...component] });\n return;\n }\n\n const onlyNode = component[0];\n if (onlyNode !== undefined && hasSelfLoop(onlyNode, graph.adjacencyById)) {\n cycles.push({ nodes: [...component] });\n }\n });\n\n const dagOutgoing = new Map<number, Set<number>>();\n const inDegree = new Map<number, number>();\n\n for (let i = 0; i < components.length; i += 1) {\n dagOutgoing.set(i, new Set());\n inDegree.set(i, 0);\n }\n\n for (const edge of graph.edges) {\n const fromComponent = componentByNodeId.get(edge.from);\n const toComponent = componentByNodeId.get(edge.to);\n\n if (fromComponent === undefined || toComponent === undefined || fromComponent === toComponent) {\n continue;\n }\n\n const outgoing = dagOutgoing.get(fromComponent);\n if (outgoing?.has(toComponent) === true) {\n continue;\n }\n\n outgoing?.add(toComponent);\n inDegree.set(toComponent, (inDegree.get(toComponent) ?? 0) + 1);\n }\n\n const queue: number[] = [];\n const depthByComponent = new Map<number, number>();\n\n for (let i = 0; i < components.length; i += 1) {\n if ((inDegree.get(i) ?? 0) === 0) {\n queue.push(i);\n depthByComponent.set(i, 0);\n }\n }\n\n let cursor = 0;\n while (cursor < queue.length) {\n const componentId = queue[cursor];\n cursor += 1;\n\n if (componentId === undefined) {\n continue;\n }\n\n const currentDepth = depthByComponent.get(componentId) ?? 0;\n const outgoing = dagOutgoing.get(componentId) ?? new Set<number>();\n\n for (const nextComponent of outgoing) {\n const nextDepth = depthByComponent.get(nextComponent) ?? 0;\n if (currentDepth + 1 > nextDepth) {\n depthByComponent.set(nextComponent, currentDepth + 1);\n }\n\n const remainingIncoming = (inDegree.get(nextComponent) ?? 0) - 1;\n inDegree.set(nextComponent, remainingIncoming);\n if (remainingIncoming === 0) {\n queue.push(nextComponent);\n }\n }\n }\n\n const depthByNodeId = new Map<string, number>();\n let graphDepth = 0;\n\n components.forEach((component, componentId) => {\n const componentDepth = depthByComponent.get(componentId) ?? 0;\n if (componentDepth > graphDepth) {\n graphDepth = componentDepth;\n }\n\n for (const nodeId of component) {\n depthByNodeId.set(nodeId, componentDepth);\n }\n });\n\n cycles.sort((a, b) => {\n const firstA = a.nodes[0] ?? \"\";\n const firstB = b.nodes[0] ?? \"\";\n return firstA.localeCompare(firstB);\n });\n\n return {\n depthByNodeId,\n graphDepth,\n cycles,\n };\n};\n\nexport const createGraphAnalysisSummary = (\n targetPath: string,\n graph: GraphData,\n): GraphAnalysisSummary => {\n const fanInById = new Map<string, number>();\n const fanOutById = new Map<string, number>();\n\n for (const node of graph.nodes) {\n fanInById.set(node.id, 0);\n fanOutById.set(node.id, graph.adjacencyById.get(node.id)?.length ?? 0);\n }\n\n for (const edge of graph.edges) {\n fanInById.set(edge.to, (fanInById.get(edge.to) ?? 0) + 1);\n }\n\n const { cycles, depthByNodeId, graphDepth } = computeCyclesAndDepth(graph);\n\n let maxFanIn = 0;\n let maxFanOut = 0;\n\n const files: FileDependency[] = graph.nodes.map((node) => {\n const fanIn = fanInById.get(node.id) ?? 0;\n const fanOut = fanOutById.get(node.id) ?? 0;\n\n if (fanIn > maxFanIn) {\n maxFanIn = fanIn;\n }\n\n if (fanOut > maxFanOut) {\n maxFanOut = fanOut;\n }\n\n return {\n id: node.id,\n relativePath: node.relativePath,\n directDependencies: graph.adjacencyById.get(node.id) ?? [],\n fanIn,\n fanOut,\n depth: depthByNodeId.get(node.id) ?? 0,\n };\n });\n\n const metrics: GraphMetrics = {\n nodeCount: graph.nodes.length,\n edgeCount: graph.edges.length,\n cycleCount: cycles.length,\n graphDepth,\n maxFanIn,\n maxFanOut,\n };\n\n return {\n targetPath,\n nodes: graph.nodes,\n edges: graph.edges,\n cycles,\n files,\n metrics,\n };\n};\n","import { extname, isAbsolute, relative, resolve } from \"node:path\";\nimport * as ts from \"typescript\";\nimport type { EdgeRecord, NodeRecord } from \"../domain/graph-model.js\";\n\ntype ParsedProject = {\n nodes: readonly NodeRecord[];\n edges: readonly EdgeRecord[];\n};\n\nexport type ParseTypescriptProjectProgressEvent =\n | { stage: \"config_resolved\"; tsconfigCount: number; usedFallbackScan: boolean }\n | { stage: \"files_discovered\"; totalSourceFiles: number }\n | { stage: \"program_created\"; totalSourceFiles: number }\n | { stage: \"file_processed\"; processed: number; total: number; filePath: string }\n | { stage: \"edges_resolved\"; totalEdges: number };\n\nconst SOURCE_EXTENSIONS = new Set([\".ts\", \".tsx\", \".mts\", \".cts\", \".js\", \".jsx\", \".mjs\", \".cjs\"]);\nconst SCAN_EXCLUDES = [\n \"**/node_modules/**\",\n \"**/.git/**\",\n \"**/dist/**\",\n \"**/build/**\",\n \"**/.next/**\",\n \"**/coverage/**\",\n \"**/.turbo/**\",\n \"**/.cache/**\",\n \"**/out/**\",\n];\nconst SCAN_INCLUDES = [\"**/*\"];\nconst IGNORED_SEGMENTS = new Set([\n \"node_modules\",\n \".git\",\n \"dist\",\n \"build\",\n \".next\",\n \"coverage\",\n \".turbo\",\n \".cache\",\n \"out\",\n]);\n\nconst normalizePath = (pathValue: string): string => pathValue.replaceAll(\"\\\\\", \"/\");\n\nconst isProjectSourceFile = (filePath: string, projectRoot: string): boolean => {\n const extension = extname(filePath);\n if (!SOURCE_EXTENSIONS.has(extension)) {\n return false;\n }\n\n const relativePath = relative(projectRoot, filePath);\n if (relativePath.startsWith(\"..\")) {\n return false;\n }\n\n const normalizedRelativePath = normalizePath(relativePath);\n const segments = normalizedRelativePath.split(\"/\");\n return !segments.some((segment) => IGNORED_SEGMENTS.has(segment));\n};\n\nconst discoverSourceFilesByScan = (projectRoot: string): readonly string[] => {\n const files = ts.sys.readDirectory(\n projectRoot,\n [...SOURCE_EXTENSIONS],\n SCAN_EXCLUDES,\n SCAN_INCLUDES,\n );\n return files.map((filePath) => resolve(filePath));\n};\n\nconst parseTsConfigFile = (configPath: string): ts.ParsedCommandLine => {\n const parsedCommandLine = ts.getParsedCommandLineOfConfigFile(\n configPath,\n {},\n {\n ...ts.sys,\n onUnRecoverableConfigFileDiagnostic: () => {\n throw new Error(`Failed to parse TypeScript configuration at ${configPath}`);\n },\n },\n );\n\n if (parsedCommandLine === undefined) {\n throw new Error(`Failed to parse TypeScript configuration at ${configPath}`);\n }\n\n return parsedCommandLine;\n};\n\ntype CollectedTsConfigData = {\n fileNames: readonly string[];\n rootOptions: ts.CompilerOptions;\n visitedConfigCount: number;\n};\n\nconst collectFilesFromTsConfigGraph = (projectRoot: string): CollectedTsConfigData | null => {\n const rootConfigPath = ts.findConfigFile(\n projectRoot,\n (filePath) => ts.sys.fileExists(filePath),\n \"tsconfig.json\",\n );\n if (rootConfigPath === undefined) {\n return null;\n }\n\n const visitedConfigPaths = new Set<string>();\n const collectedFiles = new Set<string>();\n let rootOptions: ts.CompilerOptions | null = null;\n\n const visitConfig = (configPath: string): void => {\n const absoluteConfigPath = resolve(configPath);\n if (visitedConfigPaths.has(absoluteConfigPath)) {\n return;\n }\n\n visitedConfigPaths.add(absoluteConfigPath);\n const parsed = parseTsConfigFile(absoluteConfigPath);\n if (rootOptions === null) {\n rootOptions = parsed.options;\n }\n\n for (const filePath of parsed.fileNames) {\n collectedFiles.add(resolve(filePath));\n }\n\n for (const reference of parsed.projectReferences ?? []) {\n const referencePath = resolve(reference.path);\n const referenceConfigPath = ts.sys.directoryExists(referencePath)\n ? ts.findConfigFile(\n referencePath,\n (filePath) => ts.sys.fileExists(filePath),\n \"tsconfig.json\",\n )\n : referencePath;\n\n if (referenceConfigPath !== undefined && ts.sys.fileExists(referenceConfigPath)) {\n visitConfig(referenceConfigPath);\n }\n }\n };\n\n visitConfig(rootConfigPath);\n\n return {\n fileNames: [...collectedFiles],\n rootOptions: rootOptions ?? {\n moduleResolution: ts.ModuleResolutionKind.NodeNext,\n },\n visitedConfigCount: visitedConfigPaths.size,\n };\n};\n\nconst createCompilerOptions = (base: ts.CompilerOptions | undefined): ts.CompilerOptions => ({\n ...base,\n allowJs: true,\n moduleResolution: base?.moduleResolution ?? ts.ModuleResolutionKind.NodeNext,\n});\n\nconst parseTsConfig = (\n projectRoot: string,\n): {\n fileNames: readonly string[];\n options: ts.CompilerOptions;\n tsconfigCount: number;\n usedFallbackScan: boolean;\n} => {\n const collected = collectFilesFromTsConfigGraph(projectRoot);\n if (collected === null) {\n return {\n fileNames: discoverSourceFilesByScan(projectRoot),\n options: createCompilerOptions(undefined),\n tsconfigCount: 0,\n usedFallbackScan: true,\n };\n }\n\n if (collected.fileNames.length === 0) {\n return {\n fileNames: discoverSourceFilesByScan(projectRoot),\n options: createCompilerOptions(collected.rootOptions),\n tsconfigCount: collected.visitedConfigCount,\n usedFallbackScan: true,\n };\n }\n\n return {\n fileNames: collected.fileNames,\n options: createCompilerOptions(collected.rootOptions),\n tsconfigCount: collected.visitedConfigCount,\n usedFallbackScan: false,\n };\n};\n\nconst getSpecifierFromExpression = (expression: ts.Expression): string | undefined => {\n if (ts.isStringLiteral(expression)) {\n return expression.text;\n }\n\n if (ts.isNoSubstitutionTemplateLiteral(expression)) {\n return expression.text;\n }\n\n return undefined;\n};\n\nconst hasRuntimeImport = (importDeclaration: ts.ImportDeclaration): boolean => {\n const importClause = importDeclaration.importClause;\n if (importClause === undefined) {\n return true;\n }\n\n if (importClause.isTypeOnly) {\n return false;\n }\n\n if (importClause.name !== undefined) {\n return true;\n }\n\n const namedBindings = importClause.namedBindings;\n if (namedBindings === undefined) {\n return false;\n }\n\n if (ts.isNamespaceImport(namedBindings)) {\n return true;\n }\n\n if (namedBindings.elements.length === 0) {\n return true;\n }\n\n return namedBindings.elements.some((element) => !element.isTypeOnly);\n};\n\nconst extractModuleSpecifiers = (sourceFile: ts.SourceFile): readonly string[] => {\n const specifiers = new Set<string>();\n\n const visit = (node: ts.Node): void => {\n if (ts.isImportDeclaration(node)) {\n if (hasRuntimeImport(node) && node.moduleSpecifier !== undefined) {\n const specifier = getSpecifierFromExpression(node.moduleSpecifier);\n if (specifier !== undefined) {\n specifiers.add(specifier);\n }\n }\n return;\n }\n\n if (ts.isExportDeclaration(node)) {\n if (!node.isTypeOnly && node.moduleSpecifier !== undefined) {\n const specifier = getSpecifierFromExpression(node.moduleSpecifier);\n if (specifier !== undefined) {\n specifiers.add(specifier);\n }\n }\n return;\n }\n\n if (ts.isCallExpression(node)) {\n if (node.expression.kind === ts.SyntaxKind.ImportKeyword && node.arguments.length > 0) {\n const firstArgument = node.arguments[0];\n if (firstArgument !== undefined) {\n const specifier = getSpecifierFromExpression(firstArgument);\n if (specifier !== undefined) {\n specifiers.add(specifier);\n }\n }\n }\n\n if (\n ts.isIdentifier(node.expression) &&\n node.expression.text === \"require\" &&\n node.arguments.length > 0\n ) {\n const firstArgument = node.arguments[0];\n if (firstArgument !== undefined) {\n const specifier = getSpecifierFromExpression(firstArgument);\n if (specifier !== undefined) {\n specifiers.add(specifier);\n }\n }\n }\n }\n\n ts.forEachChild(node, visit);\n };\n\n visit(sourceFile);\n return [...specifiers];\n};\n\nexport const parseTypescriptProject = (\n projectPath: string,\n onProgress?: (event: ParseTypescriptProjectProgressEvent) => void,\n): ParsedProject => {\n const projectRoot = isAbsolute(projectPath) ? projectPath : resolve(projectPath);\n const { fileNames, options, tsconfigCount, usedFallbackScan } = parseTsConfig(projectRoot);\n onProgress?.({ stage: \"config_resolved\", tsconfigCount, usedFallbackScan });\n\n const sourceFilePaths = fileNames\n .filter((filePath) => isProjectSourceFile(filePath, projectRoot))\n .map((filePath) => normalizePath(resolve(filePath)));\n\n const uniqueSourceFilePaths = [...new Set(sourceFilePaths)].sort((a, b) => a.localeCompare(b));\n const sourceFilePathSet = new Set(uniqueSourceFilePaths);\n onProgress?.({ stage: \"files_discovered\", totalSourceFiles: uniqueSourceFilePaths.length });\n\n const program = ts.createProgram({\n rootNames: uniqueSourceFilePaths,\n options,\n });\n onProgress?.({ stage: \"program_created\", totalSourceFiles: uniqueSourceFilePaths.length });\n\n const nodeByAbsolutePath = new Map<string, NodeRecord>();\n for (const sourcePath of uniqueSourceFilePaths) {\n const relativePath = normalizePath(relative(projectRoot, sourcePath));\n const nodeId = relativePath;\n nodeByAbsolutePath.set(sourcePath, {\n id: nodeId,\n absolutePath: sourcePath,\n relativePath,\n });\n }\n\n const resolverCache = new Map<string, string | undefined>();\n const edges: EdgeRecord[] = [];\n\n for (const [index, sourcePath] of uniqueSourceFilePaths.entries()) {\n const sourceFile = program.getSourceFile(sourcePath);\n if (sourceFile === undefined) {\n continue;\n }\n\n const fromNode = nodeByAbsolutePath.get(sourcePath);\n if (fromNode === undefined) {\n continue;\n }\n\n const moduleSpecifiers = extractModuleSpecifiers(sourceFile);\n for (const specifier of moduleSpecifiers) {\n const cacheKey = `${sourcePath}\\u0000${specifier}`;\n let resolvedPath = resolverCache.get(cacheKey);\n\n if (resolvedPath === undefined && !resolverCache.has(cacheKey)) {\n const resolved = ts.resolveModuleName(\n specifier,\n sourcePath,\n options,\n ts.sys,\n ).resolvedModule;\n if (resolved !== undefined) {\n resolvedPath = normalizePath(resolve(resolved.resolvedFileName));\n }\n resolverCache.set(cacheKey, resolvedPath);\n }\n\n if (resolvedPath === undefined || !sourceFilePathSet.has(resolvedPath)) {\n continue;\n }\n\n const toNode = nodeByAbsolutePath.get(resolvedPath);\n if (toNode === undefined) {\n continue;\n }\n\n edges.push({ from: fromNode.id, to: toNode.id });\n }\n\n const processed = index + 1;\n if (processed === 1 || processed === uniqueSourceFilePaths.length || processed % 50 === 0) {\n onProgress?.({\n stage: \"file_processed\",\n processed,\n total: uniqueSourceFilePaths.length,\n filePath: fromNode.id,\n });\n }\n }\n onProgress?.({ stage: \"edges_resolved\", totalEdges: edges.length });\n\n return {\n nodes: [...nodeByAbsolutePath.values()],\n edges,\n };\n};\n","import type { GraphAnalysisSummary } from \"@codesentinel/core\";\nimport { createGraphData } from \"../domain/graph-model.js\";\nimport { createGraphAnalysisSummary } from \"../domain/graph-metrics.js\";\nimport {\n parseTypescriptProject,\n type ParseTypescriptProjectProgressEvent,\n} from \"../infrastructure/typescript-project.js\";\n\nexport type BuildProjectGraphSummaryInput = {\n projectPath: string;\n onProgress?: (event: ParseTypescriptProjectProgressEvent) => void;\n};\n\nexport const buildProjectGraphSummary = (\n input: BuildProjectGraphSummaryInput,\n): GraphAnalysisSummary => {\n const parsedProject = parseTypescriptProject(input.projectPath, input.onProgress);\n const graphData = createGraphData(parsedProject.nodes, parsedProject.edges);\n return createGraphAnalysisSummary(input.projectPath, graphData);\n};\n","import type {\n CouplingMatrix,\n FileAuthorShare,\n FileAuthorChurnShare,\n FileCoupling,\n FileEvolutionMetrics,\n Hotspot,\n RepositoryEvolutionSummary,\n} from \"@codesentinel/core\";\nimport type { EvolutionComputationConfig, GitCommitRecord } from \"./evolution-types.js\";\n\ntype FileAccumulator = {\n commitCount: number;\n recentCommitCount: number;\n churnAdded: number;\n churnDeleted: number;\n authorsByCommits: Map<string, number>;\n authorsByChurn: Map<string, { churnAdded: number; churnDeleted: number }>;\n};\n\ntype AuthorProfile = {\n authorId: string;\n commitCount: number;\n primaryName: string;\n emailStem: string | null;\n isBot: boolean;\n};\n\nconst pairKey = (a: string, b: string): string => `${a}\\u0000${b}`;\n\nconst round4 = (value: number): number => Number(value.toFixed(4));\n\nconst normalizeName = (value: string): string =>\n value\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n\nconst extractEmailStem = (authorId: string): string | null => {\n const normalized = authorId.trim().toLowerCase();\n const githubNoReplyMatch = normalized.match(/^\\d+\\+([^@]+)@users\\.noreply\\.github\\.com$/);\n if (githubNoReplyMatch?.[1] !== undefined) {\n return githubNoReplyMatch[1].replace(/[._+-]/g, \"\");\n }\n\n const atIndex = normalized.indexOf(\"@\");\n if (atIndex <= 0) {\n return null;\n }\n\n return normalized.slice(0, atIndex).replace(/[._+-]/g, \"\");\n};\n\nconst areNamesCompatible = (left: string, right: string): boolean => {\n if (left.length === 0 || right.length === 0) {\n return false;\n }\n\n if (left === right) {\n return true;\n }\n\n if (left.startsWith(`${right} `) || right.startsWith(`${left} `)) {\n return true;\n }\n\n return false;\n};\n\nconst chooseCanonicalAuthorId = (profiles: readonly AuthorProfile[]): string => {\n const ordered = [...profiles].sort((a, b) => {\n const aIsNoReply = a.authorId.includes(\"@users.noreply.github.com\");\n const bIsNoReply = b.authorId.includes(\"@users.noreply.github.com\");\n if (aIsNoReply !== bIsNoReply) {\n return aIsNoReply ? 1 : -1;\n }\n\n if (a.commitCount !== b.commitCount) {\n return b.commitCount - a.commitCount;\n }\n\n return a.authorId.localeCompare(b.authorId);\n });\n\n return ordered[0]?.authorId ?? \"\";\n};\n\nconst buildAuthorAliasMap = (commits: readonly GitCommitRecord[]): ReadonlyMap<string, string> => {\n const nameCountsByAuthorId = new Map<string, Map<string, number>>();\n const commitCountByAuthorId = new Map<string, number>();\n\n for (const commit of commits) {\n commitCountByAuthorId.set(\n commit.authorId,\n (commitCountByAuthorId.get(commit.authorId) ?? 0) + 1,\n );\n\n const normalizedName = normalizeName(commit.authorName);\n const names = nameCountsByAuthorId.get(commit.authorId) ?? new Map<string, number>();\n if (normalizedName.length > 0) {\n names.set(normalizedName, (names.get(normalizedName) ?? 0) + 1);\n }\n nameCountsByAuthorId.set(commit.authorId, names);\n }\n\n const profiles: AuthorProfile[] = [...commitCountByAuthorId.entries()].map(\n ([authorId, commitCount]) => {\n const names = nameCountsByAuthorId.get(authorId);\n const primaryName =\n names === undefined\n ? \"\"\n : ([...names.entries()].sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))[0]?.[0] ??\n \"\");\n const normalizedAuthorId = authorId.toLowerCase();\n const isBot = normalizedAuthorId.includes(\"[bot]\");\n\n return {\n authorId,\n commitCount,\n primaryName,\n emailStem: isBot ? null : extractEmailStem(authorId),\n isBot,\n };\n },\n );\n\n const groupsByStem = new Map<string, AuthorProfile[]>();\n for (const profile of profiles) {\n if (profile.emailStem === null || profile.emailStem.length < 4) {\n continue;\n }\n\n const current = groupsByStem.get(profile.emailStem) ?? [];\n current.push(profile);\n groupsByStem.set(profile.emailStem, current);\n }\n\n const aliasMap = new Map<string, string>();\n for (const profile of profiles) {\n aliasMap.set(profile.authorId, profile.authorId);\n }\n\n for (const group of groupsByStem.values()) {\n if (group.length < 2) {\n continue;\n }\n\n const compatible: AuthorProfile[] = [];\n for (const profile of group) {\n if (profile.isBot || profile.primaryName.length === 0) {\n continue;\n }\n\n compatible.push(profile);\n }\n\n if (compatible.length < 2) {\n continue;\n }\n\n const canonical = chooseCanonicalAuthorId(compatible);\n const canonicalProfile = compatible.find((candidate) => candidate.authorId === canonical);\n if (canonicalProfile === undefined) {\n continue;\n }\n\n for (const profile of compatible) {\n if (areNamesCompatible(profile.primaryName, canonicalProfile.primaryName)) {\n aliasMap.set(profile.authorId, canonical);\n }\n }\n }\n\n return aliasMap;\n};\n\nconst computeBusFactor = (\n authorDistribution: readonly { share: number }[],\n threshold: number,\n): number => {\n if (authorDistribution.length === 0) {\n return 0;\n }\n\n let coveredShare = 0;\n for (let i = 0; i < authorDistribution.length; i += 1) {\n const entry = authorDistribution[i];\n if (entry === undefined) {\n continue;\n }\n\n coveredShare += entry.share;\n if (coveredShare >= threshold) {\n return i + 1;\n }\n }\n\n return authorDistribution.length;\n};\n\nconst finalizeAuthorDistribution = (\n authorCommits: ReadonlyMap<string, number>,\n): readonly FileAuthorShare[] => {\n const totalCommits = [...authorCommits.values()].reduce((sum, value) => sum + value, 0);\n if (totalCommits === 0) {\n return [];\n }\n\n return [...authorCommits.entries()]\n .map(([authorId, commits]) => ({\n authorId,\n commits,\n share: round4(commits / totalCommits),\n }))\n .sort((a, b) => b.commits - a.commits || a.authorId.localeCompare(b.authorId));\n};\n\nconst finalizeAuthorChurnDistribution = (\n authorChurn: ReadonlyMap<string, { churnAdded: number; churnDeleted: number }>,\n): readonly FileAuthorChurnShare[] => {\n const entries = [...authorChurn.entries()].map(([authorId, churn]) => {\n const churnAdded = churn.churnAdded;\n const churnDeleted = churn.churnDeleted;\n return {\n authorId,\n churnAdded,\n churnDeleted,\n churnTotal: churnAdded + churnDeleted,\n };\n });\n\n const totalChurn = entries.reduce((sum, entry) => sum + entry.churnTotal, 0);\n if (totalChurn === 0) {\n return [];\n }\n\n return entries\n .map((entry) => ({\n ...entry,\n share: round4(entry.churnTotal / totalChurn),\n }))\n .sort((a, b) => b.churnTotal - a.churnTotal || a.authorId.localeCompare(b.authorId));\n};\n\nconst buildCouplingMatrix = (\n coChangeByPair: ReadonlyMap<string, number>,\n fileCommitCount: ReadonlyMap<string, number>,\n consideredCommits: number,\n skippedLargeCommits: number,\n maxCouplingPairs: number,\n): CouplingMatrix => {\n const allPairs: FileCoupling[] = [];\n\n for (const [key, coChangeCommits] of coChangeByPair.entries()) {\n const [fileA, fileB] = key.split(\"\\u0000\");\n if (fileA === undefined || fileB === undefined) {\n continue;\n }\n\n const fileACommits = fileCommitCount.get(fileA) ?? 0;\n const fileBCommits = fileCommitCount.get(fileB) ?? 0;\n const denominator = fileACommits + fileBCommits - coChangeCommits;\n const couplingScore = denominator === 0 ? 0 : round4(coChangeCommits / denominator);\n\n allPairs.push({\n fileA,\n fileB,\n coChangeCommits,\n couplingScore,\n });\n }\n\n allPairs.sort(\n (a, b) =>\n b.coChangeCommits - a.coChangeCommits ||\n b.couplingScore - a.couplingScore ||\n a.fileA.localeCompare(b.fileA) ||\n a.fileB.localeCompare(b.fileB),\n );\n\n const truncated = allPairs.length > maxCouplingPairs;\n\n return {\n pairs: truncated ? allPairs.slice(0, maxCouplingPairs) : allPairs,\n totalPairCount: allPairs.length,\n consideredCommits,\n skippedLargeCommits,\n truncated,\n };\n};\n\nconst selectHotspots = (\n files: readonly FileEvolutionMetrics[],\n config: EvolutionComputationConfig,\n): { hotspots: readonly Hotspot[]; threshold: number } => {\n if (files.length === 0) {\n return { hotspots: [], threshold: 0 };\n }\n\n const sorted = [...files].sort(\n (a, b) =>\n b.commitCount - a.commitCount ||\n b.churnTotal - a.churnTotal ||\n a.filePath.localeCompare(b.filePath),\n );\n\n const hotspotCount = Math.max(\n config.hotspotMinFiles,\n Math.ceil(sorted.length * config.hotspotTopPercent),\n );\n const selected = sorted.slice(0, hotspotCount);\n\n const hotspots = selected.map((file, index) => ({\n filePath: file.filePath,\n rank: index + 1,\n commitCount: file.commitCount,\n churnTotal: file.churnTotal,\n }));\n\n const threshold = selected[selected.length - 1]?.commitCount ?? 0;\n return { hotspots, threshold };\n};\n\nexport const computeRepositoryEvolutionSummary = (\n targetPath: string,\n commits: readonly GitCommitRecord[],\n config: EvolutionComputationConfig,\n): RepositoryEvolutionSummary => {\n const authorAliasById =\n config.authorIdentityMode === \"likely_merge\"\n ? buildAuthorAliasMap(commits)\n : new Map<string, string>();\n const fileStats = new Map<string, FileAccumulator>();\n const coChangeByPair = new Map<string, number>();\n\n const headCommitTimestamp =\n commits.length === 0 ? null : (commits[commits.length - 1]?.authoredAtUnix ?? null);\n const recentWindowStart =\n headCommitTimestamp === null\n ? Number.NEGATIVE_INFINITY\n : headCommitTimestamp - config.recentWindowDays * 24 * 60 * 60;\n\n let consideredCommits = 0;\n let skippedLargeCommits = 0;\n\n for (const commit of commits) {\n const uniqueFiles = new Set<string>();\n\n for (const fileChange of commit.fileChanges) {\n uniqueFiles.add(fileChange.filePath);\n const current = fileStats.get(fileChange.filePath) ?? {\n commitCount: 0,\n recentCommitCount: 0,\n churnAdded: 0,\n churnDeleted: 0,\n authorsByCommits: new Map<string, number>(),\n authorsByChurn: new Map<string, { churnAdded: number; churnDeleted: number }>(),\n };\n\n current.churnAdded += fileChange.additions;\n current.churnDeleted += fileChange.deletions;\n\n const effectiveAuthorId = authorAliasById.get(commit.authorId) ?? commit.authorId;\n const authorChurn = current.authorsByChurn.get(effectiveAuthorId) ?? {\n churnAdded: 0,\n churnDeleted: 0,\n };\n authorChurn.churnAdded += fileChange.additions;\n authorChurn.churnDeleted += fileChange.deletions;\n current.authorsByChurn.set(effectiveAuthorId, authorChurn);\n\n fileStats.set(fileChange.filePath, current);\n }\n\n for (const filePath of uniqueFiles) {\n const current = fileStats.get(filePath);\n if (current === undefined) {\n continue;\n }\n\n current.commitCount += 1;\n if (commit.authoredAtUnix >= recentWindowStart) {\n current.recentCommitCount += 1;\n }\n\n const effectiveAuthorId = authorAliasById.get(commit.authorId) ?? commit.authorId;\n current.authorsByCommits.set(\n effectiveAuthorId,\n (current.authorsByCommits.get(effectiveAuthorId) ?? 0) + 1,\n );\n }\n\n const orderedFiles = [...uniqueFiles].sort((a, b) => a.localeCompare(b));\n if (orderedFiles.length > 1) {\n if (orderedFiles.length <= config.maxFilesPerCommitForCoupling) {\n consideredCommits += 1;\n for (let i = 0; i < orderedFiles.length - 1; i += 1) {\n for (let j = i + 1; j < orderedFiles.length; j += 1) {\n const fileA = orderedFiles[i];\n const fileB = orderedFiles[j];\n if (fileA === undefined || fileB === undefined) {\n continue;\n }\n\n const key = pairKey(fileA, fileB);\n coChangeByPair.set(key, (coChangeByPair.get(key) ?? 0) + 1);\n }\n }\n } else {\n skippedLargeCommits += 1;\n }\n }\n }\n\n const files: FileEvolutionMetrics[] = [...fileStats.entries()]\n .map(([filePath, stats]) => {\n const authorDistributionByCommits = finalizeAuthorDistribution(stats.authorsByCommits);\n const authorDistributionByChurn = finalizeAuthorChurnDistribution(stats.authorsByChurn);\n const topAuthorShareByCommits = authorDistributionByCommits[0]?.share ?? 0;\n const topAuthorShareByChurn = authorDistributionByChurn[0]?.share ?? 0;\n return {\n filePath,\n commitCount: stats.commitCount,\n frequencyPer100Commits:\n commits.length === 0 ? 0 : round4((stats.commitCount / commits.length) * 100),\n churnAdded: stats.churnAdded,\n churnDeleted: stats.churnDeleted,\n churnTotal: stats.churnAdded + stats.churnDeleted,\n recentCommitCount: stats.recentCommitCount,\n recentVolatility:\n stats.commitCount === 0 ? 0 : round4(stats.recentCommitCount / stats.commitCount),\n topAuthorShareByCommits,\n busFactorByCommits: computeBusFactor(\n authorDistributionByCommits,\n config.busFactorCoverageThreshold,\n ),\n authorDistributionByCommits,\n topAuthorShareByChurn,\n busFactorByChurn: computeBusFactor(\n authorDistributionByChurn,\n config.busFactorCoverageThreshold,\n ),\n authorDistributionByChurn,\n };\n })\n .sort((a, b) => a.filePath.localeCompare(b.filePath));\n\n const fileCommitCount = new Map(files.map((file) => [file.filePath, file.commitCount]));\n const coupling = buildCouplingMatrix(\n coChangeByPair,\n fileCommitCount,\n consideredCommits,\n skippedLargeCommits,\n config.maxCouplingPairs,\n );\n\n const { hotspots, threshold } = selectHotspots(files, config);\n\n return {\n targetPath,\n available: true,\n files,\n hotspots,\n coupling,\n metrics: {\n totalCommits: commits.length,\n totalFiles: files.length,\n headCommitTimestamp,\n recentWindowDays: config.recentWindowDays,\n hotspotTopPercent: config.hotspotTopPercent,\n hotspotThresholdCommitCount: threshold,\n },\n };\n};\n","export type GitFileChange = {\n filePath: string;\n additions: number;\n deletions: number;\n};\n\nexport type GitCommitRecord = {\n hash: string;\n authorId: string;\n authorName: string;\n authoredAtUnix: number;\n fileChanges: readonly GitFileChange[];\n};\n\nexport type EvolutionComputationConfig = {\n authorIdentityMode: \"likely_merge\" | \"strict_email\";\n recentWindowDays: number;\n hotspotTopPercent: number;\n hotspotMinFiles: number;\n maxFilesPerCommitForCoupling: number;\n maxCouplingPairs: number;\n busFactorCoverageThreshold: number;\n};\n\nexport const DEFAULT_EVOLUTION_CONFIG: EvolutionComputationConfig = {\n authorIdentityMode: \"likely_merge\",\n recentWindowDays: 30,\n hotspotTopPercent: 0.1,\n hotspotMinFiles: 1,\n maxFilesPerCommitForCoupling: 200,\n maxCouplingPairs: 500,\n busFactorCoverageThreshold: 0.6,\n};\n","import type { RepositoryEvolutionSummary } from \"@codesentinel/core\";\nimport { computeRepositoryEvolutionSummary } from \"../domain/evolution-metrics.js\";\nimport {\n DEFAULT_EVOLUTION_CONFIG,\n type EvolutionComputationConfig,\n} from \"../domain/evolution-types.js\";\nimport type { GitHistoryProvider, GitHistoryProgressEvent } from \"./git-history-provider.js\";\n\nexport type AnalyzeRepositoryEvolutionInput = {\n repositoryPath: string;\n config?: Partial<EvolutionComputationConfig>;\n};\n\nexport type EvolutionAnalysisProgressEvent =\n | { stage: \"checking_git_repository\" }\n | { stage: \"not_git_repository\" }\n | { stage: \"loading_commit_history\" }\n | { stage: \"computing_metrics\" }\n | { stage: \"analysis_completed\"; available: boolean }\n | { stage: \"history\"; event: GitHistoryProgressEvent };\n\nconst createEffectiveConfig = (\n overrides: Partial<EvolutionComputationConfig> | undefined,\n): EvolutionComputationConfig => ({\n ...DEFAULT_EVOLUTION_CONFIG,\n ...overrides,\n});\n\nexport const analyzeRepositoryEvolution = (\n input: AnalyzeRepositoryEvolutionInput,\n historyProvider: GitHistoryProvider,\n onProgress?: (event: EvolutionAnalysisProgressEvent) => void,\n): RepositoryEvolutionSummary => {\n onProgress?.({ stage: \"checking_git_repository\" });\n if (!historyProvider.isGitRepository(input.repositoryPath)) {\n onProgress?.({ stage: \"not_git_repository\" });\n return {\n targetPath: input.repositoryPath,\n available: false,\n reason: \"not_git_repository\",\n };\n }\n\n onProgress?.({ stage: \"loading_commit_history\" });\n const commits = historyProvider.getCommitHistory(input.repositoryPath, (event) =>\n onProgress?.({ stage: \"history\", event }),\n );\n const config = createEffectiveConfig(input.config);\n onProgress?.({ stage: \"computing_metrics\" });\n\n const summary = computeRepositoryEvolutionSummary(input.repositoryPath, commits, config);\n onProgress?.({ stage: \"analysis_completed\", available: summary.available });\n return summary;\n};\n","import { execFileSync } from \"node:child_process\";\n\nexport class GitCommandError extends Error {\n readonly args: readonly string[];\n\n constructor(message: string, args: readonly string[]) {\n super(message);\n this.name = \"GitCommandError\";\n this.args = args;\n }\n}\n\nexport interface GitCommandClient {\n run(repositoryPath: string, args: readonly string[]): string;\n}\n\nexport class ExecGitCommandClient implements GitCommandClient {\n run(repositoryPath: string, args: readonly string[]): string {\n try {\n return execFileSync(\"git\", [\"-C\", repositoryPath, ...args], {\n encoding: \"utf8\",\n maxBuffer: 1024 * 1024 * 64,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown git execution error\";\n throw new GitCommandError(message, args);\n }\n }\n}\n","export const COMMIT_RECORD_SEPARATOR = \"\\u001e\";\nexport const COMMIT_FIELD_SEPARATOR = \"\\u001f\";\n\nexport const GIT_LOG_FORMAT = `%x1e%H%x1f%at%x1f%an%x1f%ae`;\n","import type { GitCommitRecord } from \"../domain/evolution-types.js\";\nimport type { ParseGitLogProgressEvent } from \"../parsing/git-log-parser.js\";\n\nexport type GitHistoryProgressEvent =\n | { stage: \"git_log_received\"; bytes: number }\n | { stage: \"git_log_parsed\"; commits: number }\n | { stage: \"git_log_parse_progress\"; parsedRecords: number; totalRecords: number };\n\nexport interface GitHistoryProvider {\n isGitRepository(repositoryPath: string): boolean;\n getCommitHistory(\n repositoryPath: string,\n onProgress?: (event: GitHistoryProgressEvent) => void,\n ): readonly GitCommitRecord[];\n}\n\nexport const mapParseProgressToHistoryProgress = (\n event: ParseGitLogProgressEvent,\n): GitHistoryProgressEvent => ({\n stage: \"git_log_parse_progress\",\n parsedRecords: event.parsedRecords,\n totalRecords: event.totalRecords,\n});\n","import { COMMIT_FIELD_SEPARATOR, COMMIT_RECORD_SEPARATOR } from \"../domain/git-log-format.js\";\nimport type { GitCommitRecord, GitFileChange } from \"../domain/evolution-types.js\";\n\nexport type ParseGitLogProgressEvent = {\n parsedRecords: number;\n totalRecords: number;\n};\n\nconst parseInteger = (value: string): number | null => {\n if (value.length === 0) {\n return null;\n }\n\n const parsed = Number.parseInt(value, 10);\n if (Number.isNaN(parsed)) {\n return null;\n }\n\n return parsed;\n};\n\nconst normalizeAuthorIdentity = (authorName: string, authorEmail: string): string => {\n const normalizedName = authorName.trim().replace(/\\s+/g, \" \").toLowerCase();\n const normalizedEmail = authorEmail.trim().toLowerCase();\n\n if (/\\[bot\\]/i.test(normalizedName) || /\\[bot\\]/i.test(normalizedEmail)) {\n return normalizedEmail.length > 0 ? normalizedEmail : normalizedName;\n }\n\n const githubNoReplyMatch = normalizedEmail.match(/^\\d+\\+([^@]+)@users\\.noreply\\.github\\.com$/);\n const githubHandle = githubNoReplyMatch?.[1]?.trim().toLowerCase();\n if (githubHandle !== undefined && githubHandle.length > 0) {\n return `${githubHandle}@users.noreply.github.com`;\n }\n\n if (normalizedEmail.length > 0) {\n return normalizedEmail;\n }\n\n return normalizedName;\n};\n\nconst parseRenamedPath = (pathSpec: string): string => {\n if (!pathSpec.includes(\" => \")) {\n return pathSpec;\n }\n\n const braceRenameMatch = pathSpec.match(/^(.*)\\{(.+) => (.+)\\}(.*)$/);\n if (braceRenameMatch !== null) {\n const [, prefix, , renamedTo, suffix] = braceRenameMatch;\n return `${prefix}${renamedTo}${suffix}`;\n }\n\n const parts = pathSpec.split(\" => \");\n const finalPart = parts[parts.length - 1];\n return finalPart ?? pathSpec;\n};\n\nconst parseNumstatLine = (line: string): GitFileChange | null => {\n const parts = line.split(\"\\t\");\n if (parts.length < 3) {\n return null;\n }\n\n const additionsRaw = parts[0];\n const deletionsRaw = parts[1];\n const pathRaw = parts.slice(2).join(\"\\t\");\n\n if (additionsRaw === undefined || deletionsRaw === undefined) {\n return null;\n }\n\n const additions = additionsRaw === \"-\" ? 0 : parseInteger(additionsRaw);\n const deletions = deletionsRaw === \"-\" ? 0 : parseInteger(deletionsRaw);\n\n if (additions === null || deletions === null) {\n return null;\n }\n\n const filePath = parseRenamedPath(pathRaw);\n return {\n filePath,\n additions,\n deletions,\n };\n};\n\nexport const parseGitLog = (\n rawLog: string,\n onProgress?: (event: ParseGitLogProgressEvent) => void,\n): readonly GitCommitRecord[] => {\n const records = rawLog\n .split(COMMIT_RECORD_SEPARATOR)\n .map((record) => record.trim())\n .filter((record) => record.length > 0);\n\n const commits: GitCommitRecord[] = [];\n\n for (const [index, record] of records.entries()) {\n const lines = record\n .split(\"\\n\")\n .map((line) => line.trimEnd())\n .filter((line) => line.length > 0);\n\n if (lines.length === 0) {\n continue;\n }\n\n const headerParts = lines[0]?.split(COMMIT_FIELD_SEPARATOR) ?? [];\n if (headerParts.length !== 4) {\n continue;\n }\n\n const [hash, authoredAtRaw, authorName, authorEmail] = headerParts;\n if (\n hash === undefined ||\n authoredAtRaw === undefined ||\n authorName === undefined ||\n authorEmail === undefined\n ) {\n continue;\n }\n\n const authoredAtUnix = parseInteger(authoredAtRaw);\n if (authoredAtUnix === null) {\n continue;\n }\n\n const fileChanges: GitFileChange[] = [];\n for (const line of lines.slice(1)) {\n const parsedLine = parseNumstatLine(line);\n if (parsedLine !== null) {\n fileChanges.push(parsedLine);\n }\n }\n\n commits.push({\n hash,\n authorId: normalizeAuthorIdentity(authorName, authorEmail),\n authorName,\n authoredAtUnix,\n fileChanges,\n });\n\n const parsedRecords = index + 1;\n if (parsedRecords === 1 || parsedRecords === records.length || parsedRecords % 500 === 0) {\n onProgress?.({ parsedRecords, totalRecords: records.length });\n }\n }\n\n commits.sort((a, b) => a.authoredAtUnix - b.authoredAtUnix || a.hash.localeCompare(b.hash));\n return commits;\n};\n","import { GIT_LOG_FORMAT } from \"../domain/git-log-format.js\";\nimport type { GitCommitRecord } from \"../domain/evolution-types.js\";\nimport {\n mapParseProgressToHistoryProgress,\n type GitHistoryProvider,\n type GitHistoryProgressEvent,\n} from \"../application/git-history-provider.js\";\nimport { GitCommandError, type GitCommandClient } from \"./git-command-client.js\";\nimport { parseGitLog } from \"../parsing/git-log-parser.js\";\n\nconst NON_GIT_CODES = [\"not a git repository\", \"not in a git directory\"];\n\nconst isNotGitError = (error: GitCommandError): boolean => {\n const lower = error.message.toLowerCase();\n return NON_GIT_CODES.some((code) => lower.includes(code));\n};\n\nexport class GitCliHistoryProvider implements GitHistoryProvider {\n constructor(private readonly gitClient: GitCommandClient) {}\n\n isGitRepository(repositoryPath: string): boolean {\n try {\n const output = this.gitClient.run(repositoryPath, [\"rev-parse\", \"--is-inside-work-tree\"]);\n return output.trim() === \"true\";\n } catch (error) {\n if (error instanceof GitCommandError && isNotGitError(error)) {\n return false;\n }\n\n throw error;\n }\n }\n\n getCommitHistory(\n repositoryPath: string,\n onProgress?: (event: GitHistoryProgressEvent) => void,\n ): readonly GitCommitRecord[] {\n const output = this.gitClient.run(repositoryPath, [\n \"-c\",\n \"core.quotepath=false\",\n \"log\",\n \"--use-mailmap\",\n \"--no-merges\",\n \"--date=unix\",\n `--pretty=format:${GIT_LOG_FORMAT}`,\n \"--numstat\",\n \"--find-renames\",\n ]);\n onProgress?.({ stage: \"git_log_received\", bytes: Buffer.byteLength(output, \"utf8\") });\n const commits = parseGitLog(output, (event) =>\n onProgress?.(mapParseProgressToHistoryProgress(event)),\n );\n onProgress?.({ stage: \"git_log_parsed\", commits: commits.length });\n return commits;\n }\n}\n","import type { RepositoryEvolutionSummary } from \"@codesentinel/core\";\nimport {\n analyzeRepositoryEvolution,\n type EvolutionAnalysisProgressEvent,\n type AnalyzeRepositoryEvolutionInput,\n} from \"./application/analyze-repository-evolution.js\";\nimport { ExecGitCommandClient } from \"./infrastructure/git-command-client.js\";\nimport { GitCliHistoryProvider } from \"./infrastructure/git-history-provider.js\";\n\nexport type { AnalyzeRepositoryEvolutionInput } from \"./application/analyze-repository-evolution.js\";\nexport type { EvolutionAnalysisProgressEvent } from \"./application/analyze-repository-evolution.js\";\n\nexport const analyzeRepositoryEvolutionFromGit = (\n input: AnalyzeRepositoryEvolutionInput,\n onProgress?: (event: EvolutionAnalysisProgressEvent) => void,\n): RepositoryEvolutionSummary => {\n const historyProvider = new GitCliHistoryProvider(new ExecGitCommandClient());\n return analyzeRepositoryEvolution(input, historyProvider, onProgress);\n};\n","export const clamp01 = (value: number): number => {\n if (!Number.isFinite(value)) {\n return 0;\n }\n if (value <= 0) {\n return 0;\n }\n if (value >= 1) {\n return 1;\n }\n return value;\n};\n\nexport const round4 = (value: number): number => Number(value.toFixed(4));\n\nexport const average = (values: readonly number[]): number => {\n if (values.length === 0) {\n return 0;\n }\n\n const total = values.reduce((sum, value) => sum + value, 0);\n return total / values.length;\n};\n\nexport const concentration = (rawValues: readonly number[]): number => {\n const values = rawValues.filter((value) => value > 0);\n const count = values.length;\n if (count <= 1) {\n return 0;\n }\n\n const total = values.reduce((sum, value) => sum + value, 0);\n if (total <= 0) {\n return 0;\n }\n\n const hhi = values.reduce((sum, value) => {\n const share = value / total;\n return sum + share * share;\n }, 0);\n\n const minHhi = 1 / count;\n const normalized = (hhi - minHhi) / (1 - minHhi);\n return clamp01(normalized);\n};\n","import type {\n GraphAnalysisSummary,\n HealthDimension,\n HealthDimensionTrace,\n HealthEvidenceRef,\n HealthFactorTrace,\n HealthIssue,\n RepositoryEvolutionSummary,\n RepositoryHealthSummary,\n} from \"@codesentinel/core\";\nimport { average, clamp01, concentration, round4 } from \"../domain/math.js\";\n\nexport type ComputeRepositoryHealthSummaryInput = {\n structural: GraphAnalysisSummary;\n evolution: RepositoryEvolutionSummary;\n config?: HealthEngineConfig;\n};\n\nexport type HealthEngineConfig = {\n ownershipPenaltyMultiplier?: number;\n};\n\ntype HealthIssueWithImpact = HealthIssue & {\n impact: number;\n};\n\ntype FactorSpec = {\n factorId: string;\n penalty: number;\n rawMetrics: Readonly<Record<string, number | null>>;\n normalizedMetrics: Readonly<Record<string, number | null>>;\n weight: number;\n evidence: readonly HealthEvidenceRef[];\n};\n\nconst DIMENSION_WEIGHTS: Readonly<Record<HealthDimension, number>> = {\n modularity: 0.35,\n changeHygiene: 0.3,\n testHealth: 0.2,\n ownershipDistribution: 0.15,\n};\n\nconst HEALTH_TRACE_VERSION = \"1\" as const;\n\nconst toPercentage = (normalizedHealth: number): number => round4(clamp01(normalizedHealth) * 100);\n\nconst dampenForSmallSamples = (\n penalty: number,\n sampleSize: number,\n warmupSize: number,\n minimumWeight = 0.35,\n): number => {\n const reliability = clamp01(sampleSize / Math.max(1, warmupSize));\n const dampeningWeight = minimumWeight + (1 - minimumWeight) * reliability;\n return clamp01(penalty) * dampeningWeight;\n};\n\nconst topPercentShare = (values: readonly number[], fraction: number): number => {\n const positive = values.filter((value) => value > 0).sort((a, b) => b - a);\n if (positive.length === 0) {\n return 0;\n }\n\n const topCount = Math.max(1, Math.ceil(positive.length * clamp01(fraction)));\n const total = positive.reduce((sum, value) => sum + value, 0);\n const topTotal = positive.slice(0, topCount).reduce((sum, value) => sum + value, 0);\n if (total <= 0) {\n return 0;\n }\n\n return clamp01(topTotal / total);\n};\n\nconst normalizedEntropy = (weights: readonly number[]): number => {\n const positive = weights.filter((value) => value > 0);\n if (positive.length <= 1) {\n return 0;\n }\n\n const total = positive.reduce((sum, value) => sum + value, 0);\n if (total <= 0) {\n return 0;\n }\n\n const entropy = positive.reduce((sum, value) => {\n const p = value / total;\n return sum - p * Math.log(p);\n }, 0);\n return clamp01(entropy / Math.log(positive.length));\n};\n\nconst toFactorTrace = (spec: FactorSpec): HealthFactorTrace => ({\n factorId: spec.factorId,\n contribution: round4(spec.penalty * spec.weight * 100),\n penalty: round4(spec.penalty),\n rawMetrics: spec.rawMetrics,\n normalizedMetrics: spec.normalizedMetrics,\n weight: round4(spec.weight),\n evidence: spec.evidence,\n});\n\nconst createDimensionTrace = (\n dimension: HealthDimension,\n health: number,\n factors: readonly FactorSpec[],\n): HealthDimensionTrace => ({\n dimension,\n normalizedScore: round4(clamp01(health)),\n score: toPercentage(health),\n factors: factors.map((factor) => toFactorTrace(factor)),\n});\n\nconst filePaths = (structural: GraphAnalysisSummary): readonly string[] =>\n structural.files.map((file) => file.relativePath);\n\nconst normalizePath = (value: string): string => value.replaceAll(\"\\\\\", \"/\").toLowerCase();\n\nconst isTestPath = (path: string): boolean => {\n const normalized = normalizePath(path);\n return (\n normalized.includes(\"/__tests__/\") ||\n normalized.includes(\"/tests/\") ||\n normalized.includes(\"/test/\") ||\n normalized.includes(\".test.\") ||\n normalized.includes(\".spec.\")\n );\n};\n\nconst isSourcePath = (path: string): boolean => {\n if (path.endsWith(\".d.ts\")) {\n return false;\n }\n return !isTestPath(path);\n};\n\nconst hasTestDirectory = (paths: readonly string[]): boolean =>\n paths.some((path) => {\n const normalized = normalizePath(path);\n return (\n normalized.includes(\"/__tests__/\") ||\n normalized.includes(\"/tests/\") ||\n normalized.includes(\"/test/\")\n );\n });\n\nconst moduleNameFromPath = (path: string): string => {\n const normalized = path.replaceAll(\"\\\\\", \"/\");\n const firstSegment = normalized.split(\"/\")[0] ?? normalized;\n return firstSegment.length === 0 ? normalized : firstSegment;\n};\n\nconst pushIssue = (\n issues: HealthIssueWithImpact[],\n issue: Omit<HealthIssueWithImpact, \"severity\"> & { severity?: HealthIssue[\"severity\"] },\n): void => {\n issues.push({\n ...issue,\n severity: issue.severity ?? \"warn\",\n });\n};\n\nconst weightedPenalty = (factors: readonly FactorSpec[]): number =>\n clamp01(factors.reduce((sum, factor) => sum + factor.penalty * factor.weight, 0));\n\nexport const computeRepositoryHealthSummary = (\n input: ComputeRepositoryHealthSummaryInput,\n): RepositoryHealthSummary => {\n const ownershipPenaltyMultiplier = clamp01(input.config?.ownershipPenaltyMultiplier ?? 1);\n const issues: HealthIssueWithImpact[] = [];\n const sourceFileSet = new Set(input.structural.files.map((file) => file.relativePath));\n\n const sourceFileCount = Math.max(1, input.structural.files.length);\n const structuralEdges = input.structural.edges;\n\n const cycleSets = input.structural.cycles\n .map((cycle) => new Set(cycle.nodes))\n .filter((set) => set.size >= 2);\n\n const cycleNodeSet = new Set<string>();\n for (const cycleSet of cycleSets) {\n for (const node of cycleSet) {\n cycleNodeSet.add(node);\n }\n }\n\n const edgesInsideCycles = structuralEdges.filter((edge) =>\n cycleSets.some((cycleSet) => cycleSet.has(edge.from) && cycleSet.has(edge.to)),\n ).length;\n\n const cycleEdgeRatio =\n structuralEdges.length === 0 ? 0 : clamp01(edgesInsideCycles / structuralEdges.length);\n const cycleNodeRatio = clamp01(cycleNodeSet.size / sourceFileCount);\n const cycleDensityPenalty = clamp01(\n clamp01(cycleEdgeRatio / 0.2) * 0.75 + clamp01(cycleNodeRatio / 0.35) * 0.25,\n );\n\n const fanInConcentration = concentration(input.structural.files.map((file) => file.fanIn));\n const fanOutConcentration = concentration(input.structural.files.map((file) => file.fanOut));\n const fanConcentration = average([fanInConcentration, fanOutConcentration]);\n\n const centralityPressure = input.structural.files.map((file) => file.fanIn + file.fanOut);\n const centralityConcentration = concentration(centralityPressure);\n\n let structuralHotspotOverlap = 0;\n if (input.evolution.available) {\n const evolutionSourceFiles = input.evolution.files.filter((file) =>\n sourceFileSet.has(file.filePath),\n );\n const topStructuralCount = Math.max(1, Math.ceil(sourceFileCount * 0.1));\n const topChangeCount = Math.max(1, Math.ceil(Math.max(1, evolutionSourceFiles.length) * 0.1));\n\n const topStructural = new Set(\n [...input.structural.files]\n .map((file) => ({\n filePath: file.relativePath,\n pressure: file.fanIn + file.fanOut,\n }))\n .sort((a, b) => b.pressure - a.pressure || a.filePath.localeCompare(b.filePath))\n .slice(0, topStructuralCount)\n .map((item) => item.filePath),\n );\n\n const topChange = new Set(\n [...evolutionSourceFiles]\n .sort((a, b) => b.churnTotal - a.churnTotal || a.filePath.localeCompare(b.filePath))\n .slice(0, topChangeCount)\n .map((item) => item.filePath),\n );\n\n const overlapCount = [...topStructural].filter((filePath) => topChange.has(filePath)).length;\n structuralHotspotOverlap =\n topStructural.size === 0 || topChange.size === 0\n ? 0\n : clamp01(overlapCount / Math.min(topStructural.size, topChange.size));\n }\n\n const modularityFactors: readonly FactorSpec[] = [\n {\n factorId: \"health.modularity.cycle_density\",\n penalty: cycleDensityPenalty,\n rawMetrics: {\n cycleCount: input.structural.metrics.cycleCount,\n cycleEdgeRatio: round4(cycleEdgeRatio),\n cycleNodeRatio: round4(cycleNodeRatio),\n },\n normalizedMetrics: {\n cycleDensityPenalty: round4(cycleDensityPenalty),\n },\n weight: 0.4,\n evidence: [{ kind: \"repository_metric\", metric: \"structural.cycleEdgeRatio\" }],\n },\n {\n factorId: \"health.modularity.fan_concentration\",\n penalty: fanConcentration,\n rawMetrics: {\n fanInConcentration: round4(fanInConcentration),\n fanOutConcentration: round4(fanOutConcentration),\n },\n normalizedMetrics: {\n fanConcentration: round4(fanConcentration),\n },\n weight: 0.25,\n evidence: [{ kind: \"repository_metric\", metric: \"structural.files.fanIn/fanOut\" }],\n },\n {\n factorId: \"health.modularity.centrality_concentration\",\n penalty: centralityConcentration,\n rawMetrics: {\n centralityConcentration: round4(centralityConcentration),\n },\n normalizedMetrics: {\n centralityConcentration: round4(centralityConcentration),\n },\n weight: 0.2,\n evidence: [{ kind: \"repository_metric\", metric: \"structural.centralityPressure\" }],\n },\n {\n factorId: \"health.modularity.hotspot_overlap\",\n penalty: structuralHotspotOverlap,\n rawMetrics: {\n structuralHotspotOverlap: round4(structuralHotspotOverlap),\n },\n normalizedMetrics: {\n structuralHotspotOverlap: round4(structuralHotspotOverlap),\n },\n weight: 0.15,\n evidence: [{ kind: \"repository_metric\", metric: \"structural.evolution.hotspotOverlap\" }],\n },\n ];\n\n const modularityPenalty = dampenForSmallSamples(\n weightedPenalty(modularityFactors),\n sourceFileCount,\n 8,\n 0.45,\n );\n\n if (cycleDensityPenalty >= 0.35) {\n const firstCycle = input.structural.cycles[0];\n pushIssue(issues, {\n id: \"health.modularity.cycle_density\",\n ruleId: \"graph.cycle_density\",\n signal: \"structural.cycleEdgeRatio\",\n dimension: \"modularity\",\n target:\n firstCycle?.nodes\n .slice()\n .sort((a, b) => a.localeCompare(b))\n .join(\" -> \") ?? input.structural.targetPath,\n message:\n \"Dependencies inside cycles consume a high share of graph edges, reducing refactor flexibility.\",\n severity: cycleDensityPenalty >= 0.7 ? \"error\" : \"warn\",\n evidenceMetrics: {\n cycleCount: input.structural.metrics.cycleCount,\n cycleEdgeRatio: round4(cycleEdgeRatio),\n cycleNodeRatio: round4(cycleNodeRatio),\n },\n impact: round4(modularityPenalty * 0.35),\n });\n }\n\n if (centralityConcentration >= 0.5) {\n const hottest = [...input.structural.files]\n .map((file) => ({\n path: file.relativePath,\n pressure: file.fanIn + file.fanOut,\n }))\n .sort((a, b) => b.pressure - a.pressure || a.path.localeCompare(b.path))[0];\n\n pushIssue(issues, {\n id: \"health.modularity.centrality_concentration\",\n ruleId: \"graph.centrality_concentration\",\n signal: \"structural.centralityPressure\",\n dimension: \"modularity\",\n target: hottest?.path ?? input.structural.targetPath,\n message:\n \"Dependency flow is concentrated in a narrow set of files, creating architectural bottlenecks.\",\n evidenceMetrics: {\n fanConcentration: round4(fanConcentration),\n centralityConcentration: round4(centralityConcentration),\n },\n impact: round4(modularityPenalty * 0.25),\n });\n }\n\n if (structuralHotspotOverlap >= 0.5) {\n pushIssue(issues, {\n id: \"health.modularity.hotspot_overlap\",\n ruleId: \"graph.hotspot_overlap\",\n signal: \"structural.evolution.hotspotOverlap\",\n dimension: \"modularity\",\n target: input.structural.targetPath,\n message:\n \"Structural hubs overlap with top churn hotspots, making change pressure harder to isolate.\",\n evidenceMetrics: {\n structuralHotspotOverlap: round4(structuralHotspotOverlap),\n },\n impact: round4(modularityPenalty * 0.2),\n });\n }\n\n let churnConcentrationPenalty = 0;\n let volatilityConcentrationPenalty = 0;\n let coChangeClusterPenalty = 0;\n let top10PercentFilesChurnShare = 0;\n let top10PercentFilesVolatilityShare = 0;\n let denseCoChangePairRatio = 0;\n\n if (input.evolution.available) {\n const evolutionSourceFiles = input.evolution.files.filter((file) =>\n sourceFileSet.has(file.filePath),\n );\n const evolutionFileCount = evolutionSourceFiles.length;\n\n top10PercentFilesChurnShare = topPercentShare(\n evolutionSourceFiles.map((file) => file.churnTotal),\n 0.1,\n );\n top10PercentFilesVolatilityShare = topPercentShare(\n evolutionSourceFiles.map((file) => file.recentVolatility),\n 0.1,\n );\n\n const sourcePairs = input.evolution.coupling.pairs.filter(\n (pair) => sourceFileSet.has(pair.fileA) && sourceFileSet.has(pair.fileB),\n );\n const maxPairs = (evolutionFileCount * (evolutionFileCount - 1)) / 2;\n const densePairs = sourcePairs.filter((pair) => pair.couplingScore >= 0.55);\n denseCoChangePairRatio = maxPairs <= 0 ? 0 : clamp01(densePairs.length / maxPairs);\n const couplingScoreConcentration = concentration(sourcePairs.map((pair) => pair.couplingScore));\n\n churnConcentrationPenalty = dampenForSmallSamples(\n clamp01((top10PercentFilesChurnShare - 0.35) / 0.55),\n evolutionFileCount,\n 12,\n 0.3,\n );\n volatilityConcentrationPenalty = dampenForSmallSamples(\n clamp01((top10PercentFilesVolatilityShare - 0.35) / 0.55),\n evolutionFileCount,\n 12,\n 0.3,\n );\n\n const coChangeRaw = average([\n clamp01(denseCoChangePairRatio / 0.2),\n couplingScoreConcentration,\n ]);\n coChangeClusterPenalty = dampenForSmallSamples(coChangeRaw, sourcePairs.length, 20, 0.35);\n\n if (churnConcentrationPenalty >= 0.35) {\n const mostChurn = [...evolutionSourceFiles].sort(\n (a, b) => b.churnTotal - a.churnTotal || a.filePath.localeCompare(b.filePath),\n )[0];\n pushIssue(issues, {\n id: \"health.change_hygiene.churn_concentration\",\n ruleId: \"git.churn_distribution\",\n signal: \"evolution.top10PercentFilesChurnShare\",\n dimension: \"changeHygiene\",\n target: mostChurn?.filePath ?? input.structural.targetPath,\n message: \"A small slice of files carries most churn, reducing change predictability.\",\n evidenceMetrics: {\n top10PercentFilesChurnShare: round4(top10PercentFilesChurnShare),\n },\n impact: round4(churnConcentrationPenalty * 0.4),\n });\n }\n\n if (volatilityConcentrationPenalty >= 0.35) {\n const volatileFile = [...evolutionSourceFiles].sort(\n (a, b) => b.recentVolatility - a.recentVolatility || a.filePath.localeCompare(b.filePath),\n )[0];\n pushIssue(issues, {\n id: \"health.change_hygiene.volatility_concentration\",\n ruleId: \"git.volatility_distribution\",\n signal: \"evolution.top10PercentFilesVolatilityShare\",\n dimension: \"changeHygiene\",\n target: volatileFile?.filePath ?? input.structural.targetPath,\n message: \"Recent volatility is concentrated, increasing review and release uncertainty.\",\n evidenceMetrics: {\n top10PercentFilesVolatilityShare: round4(top10PercentFilesVolatilityShare),\n },\n impact: round4(volatilityConcentrationPenalty * 0.3),\n });\n }\n\n if (coChangeClusterPenalty >= 0.35) {\n const strongestPair = [...sourcePairs].sort(\n (a, b) =>\n b.couplingScore - a.couplingScore ||\n `${a.fileA}|${a.fileB}`.localeCompare(`${b.fileA}|${b.fileB}`),\n )[0];\n\n pushIssue(issues, {\n id: \"health.change_hygiene.dense_co_change_clusters\",\n ruleId: \"git.co_change_clusters\",\n signal: \"evolution.denseCoChangePairRatio\",\n dimension: \"changeHygiene\",\n target:\n strongestPair === undefined\n ? input.structural.targetPath\n : `${strongestPair.fileA}<->${strongestPair.fileB}`,\n message: \"Dense co-change clusters suggest wider coordination scope per change.\",\n evidenceMetrics: {\n denseCoChangePairRatio: round4(denseCoChangePairRatio),\n },\n impact: round4(coChangeClusterPenalty * 0.3),\n });\n }\n }\n\n const changeHygieneFactors: readonly FactorSpec[] = [\n {\n factorId: \"health.change_hygiene.churn_concentration\",\n penalty: churnConcentrationPenalty,\n rawMetrics: {\n top10PercentFilesChurnShare: round4(top10PercentFilesChurnShare),\n },\n normalizedMetrics: {\n churnConcentrationPenalty: round4(churnConcentrationPenalty),\n },\n weight: 0.4,\n evidence: [{ kind: \"repository_metric\", metric: \"evolution.top10PercentFilesChurnShare\" }],\n },\n {\n factorId: \"health.change_hygiene.volatility_concentration\",\n penalty: volatilityConcentrationPenalty,\n rawMetrics: {\n top10PercentFilesVolatilityShare: round4(top10PercentFilesVolatilityShare),\n },\n normalizedMetrics: {\n volatilityConcentrationPenalty: round4(volatilityConcentrationPenalty),\n },\n weight: 0.3,\n evidence: [\n {\n kind: \"repository_metric\",\n metric: \"evolution.top10PercentFilesVolatilityShare\",\n },\n ],\n },\n {\n factorId: \"health.change_hygiene.dense_co_change_clusters\",\n penalty: coChangeClusterPenalty,\n rawMetrics: {\n denseCoChangePairRatio: round4(denseCoChangePairRatio),\n },\n normalizedMetrics: {\n coChangeClusterPenalty: round4(coChangeClusterPenalty),\n },\n weight: 0.3,\n evidence: [{ kind: \"repository_metric\", metric: \"evolution.denseCoChangePairRatio\" }],\n },\n ];\n\n const changeHygienePenalty = input.evolution.available\n ? weightedPenalty(changeHygieneFactors)\n : 0.12;\n\n const paths = filePaths(input.structural);\n const testFiles = paths.filter((path) => isTestPath(path)).length;\n const sourceFiles = paths.filter((path) => isSourcePath(path)).length;\n const testRatio = sourceFiles <= 0 ? 1 : testFiles / sourceFiles;\n const testingDirectoryPresent = hasTestDirectory(paths);\n\n const testPresencePenalty = sourceFiles <= 0 ? 0 : testFiles === 0 ? 1 : 0;\n const testRatioPenalty = sourceFiles <= 0 ? 0 : 1 - clamp01(testRatio / 0.25);\n const testingDirectoryPenalty = sourceFiles <= 0 ? 0 : testingDirectoryPresent ? 0 : 0.35;\n\n const testHealthFactors: readonly FactorSpec[] = [\n {\n factorId: \"health.test_health.test_file_presence\",\n penalty: testPresencePenalty,\n rawMetrics: {\n sourceFiles,\n testFiles,\n },\n normalizedMetrics: {\n testPresencePenalty: round4(testPresencePenalty),\n },\n weight: 0.4,\n evidence: [{ kind: \"repository_metric\", metric: \"tests.filePresence\" }],\n },\n {\n factorId: \"health.test_health.test_to_source_ratio\",\n penalty: testRatioPenalty,\n rawMetrics: {\n testToSourceRatio: round4(testRatio),\n },\n normalizedMetrics: {\n testRatioPenalty: round4(testRatioPenalty),\n },\n weight: 0.45,\n evidence: [{ kind: \"repository_metric\", metric: \"tests.testToSourceRatio\" }],\n },\n {\n factorId: \"health.test_health.testing_directory_presence\",\n penalty: testingDirectoryPenalty,\n rawMetrics: {\n testingDirectoryPresent: testingDirectoryPresent ? 1 : 0,\n },\n normalizedMetrics: {\n testingDirectoryPenalty: round4(testingDirectoryPenalty),\n },\n weight: 0.15,\n evidence: [{ kind: \"repository_metric\", metric: \"tests.directoryPresence\" }],\n },\n ];\n\n const testHealthPenalty = dampenForSmallSamples(\n weightedPenalty(testHealthFactors),\n sourceFiles,\n 10,\n 0.3,\n );\n\n if (sourceFiles > 0 && testFiles === 0) {\n pushIssue(issues, {\n id: \"health.test_health.low_test_presence\",\n ruleId: \"tests.file_presence\",\n signal: \"tests.filePresence\",\n dimension: \"testHealth\",\n target: input.structural.targetPath,\n message: `No test files detected for ${sourceFiles} source file(s).`,\n severity: sourceFiles >= 12 ? \"error\" : \"warn\",\n evidenceMetrics: {\n sourceFiles,\n testFiles,\n testToSourceRatio: round4(testRatio),\n },\n impact: round4(testHealthPenalty * 0.45),\n });\n }\n\n if (sourceFiles > 0 && testRatio < 0.12) {\n pushIssue(issues, {\n id: \"health.test_health.low_test_ratio\",\n ruleId: \"tests.ratio\",\n signal: \"tests.testToSourceRatio\",\n dimension: \"testHealth\",\n target: input.structural.targetPath,\n message: \"Test-to-source ratio is low; long-term change confidence may degrade.\",\n evidenceMetrics: {\n sourceFiles,\n testFiles,\n testToSourceRatio: round4(testRatio),\n },\n impact: round4(testHealthPenalty * 0.35),\n });\n }\n\n if (input.evolution.available) {\n const evolutionSourceFiles = input.evolution.files.filter((file) =>\n sourceFileSet.has(file.filePath),\n );\n const authorTotals = new Map<string, number>();\n const moduleTotals = new Map<string, number>();\n const moduleAuthors = new Map<string, Map<string, number>>();\n\n let singleContributorFiles = 0;\n let trackedFiles = 0;\n\n for (const file of evolutionSourceFiles) {\n if (file.commitCount <= 0 || file.authorDistributionByCommits.length === 0) {\n continue;\n }\n\n trackedFiles += 1;\n const dominantShare = clamp01(file.authorDistributionByCommits[0]?.share ?? 0);\n if (file.authorDistributionByCommits.length === 1 || dominantShare >= 0.9) {\n singleContributorFiles += 1;\n }\n\n for (const author of file.authorDistributionByCommits) {\n const commits = Math.max(0, author.commits);\n if (commits <= 0) {\n continue;\n }\n\n const moduleName = moduleNameFromPath(file.filePath);\n const moduleAuthorTotals = moduleAuthors.get(moduleName) ?? new Map<string, number>();\n if (moduleAuthors.has(moduleName) === false) {\n moduleAuthors.set(moduleName, moduleAuthorTotals);\n }\n\n authorTotals.set(author.authorId, (authorTotals.get(author.authorId) ?? 0) + commits);\n moduleTotals.set(moduleName, (moduleTotals.get(moduleName) ?? 0) + commits);\n moduleAuthorTotals.set(\n author.authorId,\n (moduleAuthorTotals.get(author.authorId) ?? 0) + commits,\n );\n }\n }\n\n const totalAuthorCommits = [...authorTotals.values()].reduce((sum, value) => sum + value, 0);\n const highestAuthorCommits = [...authorTotals.values()].sort((a, b) => b - a)[0] ?? 0;\n const topAuthorCommitShare =\n totalAuthorCommits <= 0 ? 0 : clamp01(highestAuthorCommits / totalAuthorCommits);\n\n const filesWithSingleContributorRatio =\n trackedFiles === 0 ? 0 : clamp01(singleContributorFiles / trackedFiles);\n\n const authorEntropy = normalizedEntropy([...authorTotals.values()]);\n\n let dominatedModules = 0;\n let trackedModules = 0;\n for (const [moduleName, moduleCommitTotal] of moduleTotals.entries()) {\n if (moduleCommitTotal < 5) {\n continue;\n }\n\n const perModuleAuthors = moduleAuthors.get(moduleName);\n if (perModuleAuthors === undefined) {\n continue;\n }\n\n trackedModules += 1;\n const topAuthorModuleCommits = [...perModuleAuthors.values()].sort((a, b) => b - a)[0] ?? 0;\n const moduleTopShare =\n moduleCommitTotal <= 0 ? 0 : topAuthorModuleCommits / moduleCommitTotal;\n if (moduleTopShare >= 0.8) {\n dominatedModules += 1;\n }\n }\n\n const modulesDominatedBySingleContributorRatio =\n trackedModules === 0 ? 0 : clamp01(dominatedModules / trackedModules);\n\n const ownershipSampleSize = trackedFiles;\n const ownershipCommitVolume = totalAuthorCommits;\n\n const ownershipReliability = average([\n clamp01(ownershipSampleSize / 12),\n clamp01(ownershipCommitVolume / 180),\n ]);\n\n const topAuthorPenalty = clamp01((topAuthorCommitShare - 0.55) / 0.4);\n const singleContributorPenalty = clamp01((filesWithSingleContributorRatio - 0.35) / 0.6);\n const entropyPenalty = clamp01((0.75 - authorEntropy) / 0.75);\n const moduleDominancePenalty = clamp01((modulesDominatedBySingleContributorRatio - 0.4) / 0.6);\n\n const ownershipBasePenalty = weightedPenalty([\n {\n factorId: \"health.ownership.top_author_commit_share\",\n penalty: topAuthorPenalty,\n rawMetrics: {\n topAuthorCommitShare: round4(topAuthorCommitShare),\n },\n normalizedMetrics: {\n topAuthorPenalty: round4(topAuthorPenalty),\n },\n weight: 0.35,\n evidence: [{ kind: \"repository_metric\", metric: \"ownership.topAuthorCommitShare\" }],\n },\n {\n factorId: \"health.ownership.files_with_single_contributor_ratio\",\n penalty: singleContributorPenalty,\n rawMetrics: {\n filesWithSingleContributorRatio: round4(filesWithSingleContributorRatio),\n },\n normalizedMetrics: {\n singleContributorPenalty: round4(singleContributorPenalty),\n },\n weight: 0.25,\n evidence: [\n {\n kind: \"repository_metric\",\n metric: \"ownership.filesWithSingleContributorRatio\",\n },\n ],\n },\n {\n factorId: \"health.ownership.author_entropy\",\n penalty: entropyPenalty,\n rawMetrics: {\n authorEntropy: round4(authorEntropy),\n },\n normalizedMetrics: {\n authorEntropyPenalty: round4(entropyPenalty),\n },\n weight: 0.25,\n evidence: [{ kind: \"repository_metric\", metric: \"ownership.authorEntropy\" }],\n },\n {\n factorId: \"health.ownership.module_single_author_dominance\",\n penalty: moduleDominancePenalty,\n rawMetrics: {\n modulesDominatedBySingleContributorRatio: round4(\n modulesDominatedBySingleContributorRatio,\n ),\n },\n normalizedMetrics: {\n moduleDominancePenalty: round4(moduleDominancePenalty),\n },\n weight: 0.15,\n evidence: [{ kind: \"repository_metric\", metric: \"ownership.moduleDominance\" }],\n },\n ]);\n\n const ownershipDistributionPenalty = clamp01(\n ownershipBasePenalty * (0.3 + 0.7 * ownershipReliability) * ownershipPenaltyMultiplier,\n );\n\n const ownershipDistributionFactors: readonly FactorSpec[] = [\n {\n factorId: \"health.ownership.top_author_commit_share\",\n penalty: topAuthorPenalty,\n rawMetrics: {\n topAuthorCommitShare: round4(topAuthorCommitShare),\n },\n normalizedMetrics: {\n topAuthorPenalty: round4(topAuthorPenalty),\n ownershipPenaltyMultiplier: round4(ownershipPenaltyMultiplier),\n ownershipReliability: round4(ownershipReliability),\n },\n weight: 0.35,\n evidence: [{ kind: \"repository_metric\", metric: \"ownership.topAuthorCommitShare\" }],\n },\n {\n factorId: \"health.ownership.files_with_single_contributor_ratio\",\n penalty: singleContributorPenalty,\n rawMetrics: {\n filesWithSingleContributorRatio: round4(filesWithSingleContributorRatio),\n },\n normalizedMetrics: {\n singleContributorPenalty: round4(singleContributorPenalty),\n },\n weight: 0.25,\n evidence: [\n {\n kind: \"repository_metric\",\n metric: \"ownership.filesWithSingleContributorRatio\",\n },\n ],\n },\n {\n factorId: \"health.ownership.author_entropy\",\n penalty: entropyPenalty,\n rawMetrics: {\n authorEntropy: round4(authorEntropy),\n },\n normalizedMetrics: {\n authorEntropyPenalty: round4(entropyPenalty),\n },\n weight: 0.25,\n evidence: [{ kind: \"repository_metric\", metric: \"ownership.authorEntropy\" }],\n },\n {\n factorId: \"health.ownership.module_single_author_dominance\",\n penalty: moduleDominancePenalty,\n rawMetrics: {\n modulesDominatedBySingleContributorRatio: round4(\n modulesDominatedBySingleContributorRatio,\n ),\n },\n normalizedMetrics: {\n moduleDominancePenalty: round4(moduleDominancePenalty),\n },\n weight: 0.15,\n evidence: [{ kind: \"repository_metric\", metric: \"ownership.moduleDominance\" }],\n },\n ];\n\n if (topAuthorPenalty >= 0.35) {\n pushIssue(issues, {\n id: \"health.ownership.top_author_commit_share\",\n ruleId: \"ownership.top_author_share\",\n signal: \"ownership.topAuthorCommitShare\",\n dimension: \"ownershipDistribution\",\n target: input.structural.targetPath,\n message: \"A single contributor owns most commits, concentrating repository knowledge.\",\n severity: topAuthorPenalty >= 0.75 ? \"error\" : \"warn\",\n evidenceMetrics: {\n topAuthorCommitShare: round4(topAuthorCommitShare),\n authorEntropy: round4(authorEntropy),\n },\n impact: round4(ownershipDistributionPenalty * 0.4),\n });\n }\n\n if (singleContributorPenalty >= 0.35) {\n pushIssue(issues, {\n id: \"health.ownership.single_author_dominance\",\n ruleId: \"ownership.file_dominance\",\n signal: \"ownership.filesWithSingleContributorRatio\",\n dimension: \"ownershipDistribution\",\n target: input.structural.targetPath,\n message: \"Many files are dominated by a single contributor, reducing change resilience.\",\n evidenceMetrics: {\n filesWithSingleContributorRatio: round4(filesWithSingleContributorRatio),\n modulesDominatedBySingleContributorRatio: round4(\n modulesDominatedBySingleContributorRatio,\n ),\n },\n impact: round4(ownershipDistributionPenalty * 0.35),\n });\n }\n\n if (entropyPenalty >= 0.35) {\n pushIssue(issues, {\n id: \"health.ownership.low_author_entropy\",\n ruleId: \"ownership.author_entropy\",\n signal: \"ownership.authorEntropy\",\n dimension: \"ownershipDistribution\",\n target: input.structural.targetPath,\n message: \"Contributor distribution is narrow across the repository.\",\n evidenceMetrics: {\n authorEntropy: round4(authorEntropy),\n topAuthorCommitShare: round4(topAuthorCommitShare),\n },\n impact: round4(ownershipDistributionPenalty * 0.25),\n });\n }\n\n const modularityHealth = clamp01(1 - modularityPenalty);\n const changeHygieneHealth = clamp01(1 - changeHygienePenalty);\n const testHealthScore = clamp01(1 - testHealthPenalty);\n const ownershipDistributionHealth = clamp01(1 - ownershipDistributionPenalty);\n\n const normalizedScore = clamp01(\n modularityHealth * DIMENSION_WEIGHTS.modularity +\n changeHygieneHealth * DIMENSION_WEIGHTS.changeHygiene +\n testHealthScore * DIMENSION_WEIGHTS.testHealth +\n ownershipDistributionHealth * DIMENSION_WEIGHTS.ownershipDistribution,\n );\n\n const topIssues = [...issues]\n .sort(\n (a, b) =>\n b.impact - a.impact || a.id.localeCompare(b.id) || a.target.localeCompare(b.target),\n )\n .slice(0, 12)\n .map(({ impact: _impact, ...issue }) => issue);\n\n return {\n healthScore: toPercentage(normalizedScore),\n normalizedScore: round4(normalizedScore),\n dimensions: {\n modularity: toPercentage(modularityHealth),\n changeHygiene: toPercentage(changeHygieneHealth),\n testHealth: toPercentage(testHealthScore),\n ownershipDistribution: toPercentage(ownershipDistributionHealth),\n },\n topIssues,\n trace: {\n schemaVersion: HEALTH_TRACE_VERSION,\n dimensions: [\n createDimensionTrace(\"modularity\", modularityHealth, modularityFactors),\n createDimensionTrace(\"changeHygiene\", changeHygieneHealth, changeHygieneFactors),\n createDimensionTrace(\"testHealth\", testHealthScore, testHealthFactors),\n createDimensionTrace(\n \"ownershipDistribution\",\n ownershipDistributionHealth,\n ownershipDistributionFactors,\n ),\n ],\n },\n };\n }\n\n const ownershipDistributionPenalty = clamp01(0.12 * ownershipPenaltyMultiplier);\n const ownershipDistributionFactors: readonly FactorSpec[] = [\n {\n factorId: \"health.ownership.missing_git_history\",\n penalty: ownershipDistributionPenalty,\n rawMetrics: {\n gitHistoryAvailable: 0,\n },\n normalizedMetrics: {\n ownershipDistributionPenalty: round4(ownershipDistributionPenalty),\n },\n weight: 1,\n evidence: [{ kind: \"repository_metric\", metric: \"evolution.available\" }],\n },\n ];\n\n const modularityHealth = clamp01(1 - modularityPenalty);\n const changeHygieneHealth = clamp01(1 - changeHygienePenalty);\n const testHealthScore = clamp01(1 - testHealthPenalty);\n const ownershipDistributionHealth = clamp01(1 - ownershipDistributionPenalty);\n\n const normalizedScore = clamp01(\n modularityHealth * DIMENSION_WEIGHTS.modularity +\n changeHygieneHealth * DIMENSION_WEIGHTS.changeHygiene +\n testHealthScore * DIMENSION_WEIGHTS.testHealth +\n ownershipDistributionHealth * DIMENSION_WEIGHTS.ownershipDistribution,\n );\n\n const topIssues = [...issues]\n .sort(\n (a, b) => b.impact - a.impact || a.id.localeCompare(b.id) || a.target.localeCompare(b.target),\n )\n .slice(0, 12)\n .map(({ impact: _impact, ...issue }) => issue);\n\n return {\n healthScore: toPercentage(normalizedScore),\n normalizedScore: round4(normalizedScore),\n dimensions: {\n modularity: toPercentage(modularityHealth),\n changeHygiene: toPercentage(changeHygieneHealth),\n testHealth: toPercentage(testHealthScore),\n ownershipDistribution: toPercentage(ownershipDistributionHealth),\n },\n topIssues,\n trace: {\n schemaVersion: HEALTH_TRACE_VERSION,\n dimensions: [\n createDimensionTrace(\"modularity\", modularityHealth, modularityFactors),\n createDimensionTrace(\"changeHygiene\", changeHygieneHealth, changeHygieneFactors),\n createDimensionTrace(\"testHealth\", testHealthScore, testHealthFactors),\n createDimensionTrace(\n \"ownershipDistribution\",\n ownershipDistributionHealth,\n ownershipDistributionFactors,\n ),\n ],\n },\n };\n};\n","export type DimensionWeights = {\n structural: number;\n evolution: number;\n external: number;\n};\n\nexport type InteractionWeights = {\n structuralEvolution: number;\n centralInstability: number;\n dependencyAmplification: number;\n};\n\nexport type StructuralFactorWeights = {\n fanIn: number;\n fanOut: number;\n depth: number;\n cycleParticipation: number;\n};\n\nexport type EvolutionFactorWeights = {\n frequency: number;\n churn: number;\n recentVolatility: number;\n ownershipConcentration: number;\n busFactorRisk: number;\n};\n\nexport type DependencyFactorWeights = {\n signals: number;\n staleness: number;\n maintainerConcentration: number;\n transitiveBurden: number;\n centrality: number;\n chainDepth: number;\n busFactorRisk: number;\n};\n\nexport type RiskEngineConfig = {\n dimensionWeights: DimensionWeights;\n interactionWeights: InteractionWeights;\n structuralFactorWeights: StructuralFactorWeights;\n evolutionFactorWeights: EvolutionFactorWeights;\n dependencyFactorWeights: DependencyFactorWeights;\n quantileClamp: {\n lower: number;\n upper: number;\n };\n hotspotTopPercent: number;\n hotspotMinFiles: number;\n hotspotMaxFiles: number;\n couplingCluster: {\n minCoChangeCommits: number;\n percentileThreshold: number;\n floorScore: number;\n };\n amplificationZone: {\n pressureFloor: number;\n percentileThreshold: number;\n maxZones: number;\n };\n module: {\n maxPrefixSegments: number;\n rootLabel: string;\n commonSourceRoots: readonly string[];\n };\n dependencySignals: {\n inheritedSignalMultiplier: number;\n abandonedHalfLifeDays: number;\n missingMetadataPenalty: number;\n popularityHalfLifeDownloads: number;\n popularityMaxDampening: number;\n };\n externalDimension: {\n topDependencyPercentile: number;\n dependencyDepthHalfLife: number;\n };\n aggregatorAttenuation: {\n enabled: boolean;\n minFanIn: number;\n minFanOut: number;\n minCommitCount: number;\n maxChurnPerCommit: number;\n maxChurnPerDependency: number;\n maxStructuralReduction: number;\n };\n};\n\nexport const DEFAULT_RISK_ENGINE_CONFIG: RiskEngineConfig = {\n // Base dimensional influence. Risk is never dominated by a single dimension by default.\n dimensionWeights: {\n structural: 0.44,\n evolution: 0.36,\n external: 0.2,\n },\n // Interaction terms activate only when both related dimensions are high.\n interactionWeights: {\n structuralEvolution: 0.35,\n centralInstability: 0.25,\n dependencyAmplification: 0.2,\n },\n structuralFactorWeights: {\n fanIn: 0.3,\n fanOut: 0.25,\n depth: 0.2,\n cycleParticipation: 0.25,\n },\n evolutionFactorWeights: {\n frequency: 0.26,\n churn: 0.24,\n recentVolatility: 0.2,\n ownershipConcentration: 0.18,\n busFactorRisk: 0.12,\n },\n dependencyFactorWeights: {\n signals: 0.38,\n staleness: 0.16,\n maintainerConcentration: 0.16,\n transitiveBurden: 0.1,\n centrality: 0.08,\n chainDepth: 0.06,\n busFactorRisk: 0.06,\n },\n quantileClamp: {\n lower: 0.05,\n upper: 0.95,\n },\n hotspotTopPercent: 0.12,\n hotspotMinFiles: 3,\n hotspotMaxFiles: 30,\n couplingCluster: {\n minCoChangeCommits: 2,\n percentileThreshold: 0.9,\n floorScore: 0.35,\n },\n amplificationZone: {\n pressureFloor: 0.2,\n percentileThreshold: 0.85,\n maxZones: 20,\n },\n module: {\n maxPrefixSegments: 2,\n rootLabel: \"(root)\",\n commonSourceRoots: [\"src\", \"lib\", \"app\", \"packages\"],\n },\n dependencySignals: {\n inheritedSignalMultiplier: 0.45,\n // At this age, staleness reaches 50% risk.\n abandonedHalfLifeDays: 540,\n missingMetadataPenalty: 0.5,\n // At this download volume, popularity reaches 50% of its dampening effect.\n popularityHalfLifeDownloads: 100000,\n // Popularity can only reduce dependency risk by this fraction.\n popularityMaxDampening: 0.12,\n },\n externalDimension: {\n topDependencyPercentile: 0.85,\n dependencyDepthHalfLife: 6,\n },\n // Reduce false positives for thin aggregation hubs (for example, barrel/index re-export files)\n // that are structurally central but have low churn density and no cycle participation.\n aggregatorAttenuation: {\n enabled: true,\n minFanIn: 6,\n minFanOut: 4,\n minCommitCount: 4,\n maxChurnPerCommit: 24,\n maxChurnPerDependency: 10,\n maxStructuralReduction: 0.3,\n },\n};\n","export const toUnitInterval = (value: number): number =>\n Number.isFinite(value) ? Math.min(1, Math.max(0, value)) : 0;\n\nexport const round4 = (value: number): number => Number(value.toFixed(4));\n\nexport const average = (values: readonly number[]): number => {\n if (values.length === 0) {\n return 0;\n }\n\n const total = values.reduce((sum, current) => sum + current, 0);\n return total / values.length;\n};\n\nexport const percentile = (values: readonly number[], p: number): number => {\n if (values.length === 0) {\n return 0;\n }\n\n if (values.length === 1) {\n return values[0] ?? 0;\n }\n\n const sorted = [...values].sort((a, b) => a - b);\n const position = toUnitInterval(p) * (sorted.length - 1);\n const lowerIndex = Math.floor(position);\n const upperIndex = Math.ceil(position);\n\n const lower = sorted[lowerIndex] ?? 0;\n const upper = sorted[upperIndex] ?? lower;\n\n if (lowerIndex === upperIndex) {\n return lower;\n }\n\n const ratio = position - lowerIndex;\n return lower + (upper - lower) * ratio;\n};\n\nexport const saturatingComposite = (\n baseline: number,\n amplifications: readonly number[],\n): number => {\n let value = toUnitInterval(baseline);\n\n for (const amplification of amplifications) {\n const boundedAmplification = toUnitInterval(amplification);\n value += (1 - value) * boundedAmplification;\n }\n\n return toUnitInterval(value);\n};\n\nexport const halfLifeRisk = (value: number, halfLife: number): number => {\n if (value <= 0 || halfLife <= 0) {\n return 0;\n }\n\n return toUnitInterval(value / (value + halfLife));\n};\n\nexport const normalizeWeights = <T extends string>(\n weights: Readonly<Record<T, number>>,\n enabled: Readonly<Record<T, boolean>>,\n): Readonly<Record<T, number>> => {\n let total = 0;\n const result: Record<T, number> = { ...weights };\n\n for (const key of Object.keys(result) as T[]) {\n const enabledValue = enabled[key];\n if (!enabledValue) {\n result[key] = 0;\n continue;\n }\n\n const value = Math.max(0, result[key]);\n result[key] = value;\n total += value;\n }\n\n if (total === 0) {\n const activeKeys = (Object.keys(result) as T[]).filter((key) => enabled[key]);\n if (activeKeys.length === 0) {\n return result;\n }\n\n const uniform = 1 / activeKeys.length;\n for (const key of activeKeys) {\n result[key] = uniform;\n }\n\n return result;\n }\n\n for (const key of Object.keys(result) as T[]) {\n if (enabled[key]) {\n result[key] = result[key] / total;\n }\n }\n\n return result;\n};\n","import { toUnitInterval, percentile } from \"./math.js\";\n\nexport type QuantileScale = {\n lower: number;\n upper: number;\n};\n\nexport const logScale = (value: number): number => Math.log1p(Math.max(0, value));\n\nexport const buildQuantileScale = (\n values: readonly number[],\n lowerPercentile: number,\n upperPercentile: number,\n): QuantileScale => {\n if (values.length === 0) {\n return { lower: 0, upper: 0 };\n }\n\n return {\n lower: percentile(values, lowerPercentile),\n upper: percentile(values, upperPercentile),\n };\n};\n\nexport const normalizeWithScale = (value: number, scale: QuantileScale): number => {\n if (scale.upper <= scale.lower) {\n return value > 0 ? 1 : 0;\n }\n\n return toUnitInterval((value - scale.lower) / (scale.upper - scale.lower));\n};\n","import type {\n DependencyRiskScore,\n DependencyRiskSignal,\n EvidenceRef,\n ExternalAnalysisSummary,\n FileEvolutionMetrics,\n FileRiskScore,\n FragileCluster,\n GraphAnalysisSummary,\n ModuleRiskScore,\n RepositoryEvolutionSummary,\n RepositoryRiskSummary,\n RiskFactors,\n RiskFactorFamily,\n RiskFactorTrace,\n TargetTrace,\n} from \"@codesentinel/core\";\nimport type { RiskEngineConfig } from \"../config.js\";\nimport {\n average,\n toUnitInterval,\n halfLifeRisk,\n normalizeWeights,\n percentile,\n round4,\n saturatingComposite,\n} from \"./math.js\";\nimport { buildQuantileScale, logScale, normalizeWithScale } from \"./normalization.js\";\nimport type { TraceCollector } from \"./trace-collector.js\";\n\ntype DependencyScoreComputation = {\n dependencyScores: readonly DependencyRiskScore[];\n repositoryExternalPressure: number;\n dependencyContexts: ReadonlyMap<\n string,\n {\n signalScore: number;\n stalenessRisk: number;\n maintainerConcentrationRisk: number;\n transitiveBurdenRisk: number;\n centralityRisk: number;\n chainDepthRisk: number;\n busFactorRisk: number;\n popularityDampener: number;\n rawMetrics: {\n daysSinceLastRelease: number | null;\n maintainerCount: number | null;\n transitiveCount: number;\n dependents: number;\n dependencyDepth: number;\n busFactor: number | null;\n weeklyDownloads: number | null;\n };\n confidence: number;\n }\n >;\n};\n\ntype FileRiskContext = {\n file: string;\n score: number;\n normalizedScore: number;\n factors: RiskFactors;\n structuralCentrality: number;\n traceTerms: {\n structuralBase: number;\n evolutionBase: number;\n externalBase: number;\n interactionStructuralEvolution: number;\n interactionCentralInstability: number;\n interactionDependencyAmplification: number;\n };\n rawMetrics: {\n fanIn: number;\n fanOut: number;\n depth: number;\n cycleParticipation: number;\n commitCount: number | null;\n churnTotal: number | null;\n recentVolatility: number | null;\n topAuthorShareByCommits: number | null;\n busFactorByCommits: number | null;\n dependencyAffinity: number;\n repositoryExternalPressure: number;\n structuralAttenuation: number;\n };\n normalizedMetrics: {\n fanInRisk: number;\n fanOutRisk: number;\n depthRisk: number;\n frequencyRisk: number;\n churnRisk: number;\n volatilityRisk: number;\n ownershipConcentrationRisk: number;\n busFactorRisk: number;\n };\n};\n\ntype MetricScales = {\n commitCount: ReturnType<typeof buildQuantileScale>;\n churnTotal: ReturnType<typeof buildQuantileScale>;\n busFactor: ReturnType<typeof buildQuantileScale>;\n};\n\ntype FactorTraceInput = {\n factorId: string;\n family: RiskFactorFamily;\n strength: number;\n rawMetrics: Readonly<Record<string, number | null>>;\n normalizedMetrics: Readonly<Record<string, number | null>>;\n weight: number | null;\n amplification: number | null;\n evidence: readonly EvidenceRef[];\n confidence: number;\n};\n\nconst normalizePath = (path: string): string => path.replaceAll(\"\\\\\", \"/\");\n\nconst computeAggregatorAttenuation = (input: {\n fanIn: number;\n fanOut: number;\n inCycle: number;\n evolutionMetrics: FileEvolutionMetrics | undefined;\n config: RiskEngineConfig[\"aggregatorAttenuation\"];\n}): number => {\n const { fanIn, fanOut, inCycle, evolutionMetrics, config } = input;\n if (!config.enabled || inCycle > 0) {\n return 1;\n }\n\n if (fanIn < config.minFanIn || fanOut < config.minFanOut) {\n return 1;\n }\n\n if (evolutionMetrics === undefined || evolutionMetrics.commitCount < config.minCommitCount) {\n return 1;\n }\n\n const churnPerCommit = evolutionMetrics.churnTotal / Math.max(1, evolutionMetrics.commitCount);\n const churnPerDependency = evolutionMetrics.churnTotal / Math.max(1, fanOut);\n\n if (\n churnPerCommit > config.maxChurnPerCommit ||\n churnPerDependency > config.maxChurnPerDependency\n ) {\n return 1;\n }\n\n const fanInSignal = toUnitInterval((fanIn - config.minFanIn) / Math.max(1, config.minFanIn));\n const fanOutSignal = toUnitInterval((fanOut - config.minFanOut) / Math.max(1, config.minFanOut));\n const lowChurnPerCommitSignal = 1 - toUnitInterval(churnPerCommit / config.maxChurnPerCommit);\n const lowChurnPerDependencySignal =\n 1 - toUnitInterval(churnPerDependency / config.maxChurnPerDependency);\n const attenuationConfidence = average([\n fanInSignal,\n fanOutSignal,\n lowChurnPerCommitSignal,\n lowChurnPerDependencySignal,\n ]);\n\n const reduction = toUnitInterval(config.maxStructuralReduction) * attenuationConfidence;\n return round4(toUnitInterval(1 - reduction));\n};\n\nconst dependencySignalWeights: Readonly<Record<DependencyRiskSignal, number>> = {\n single_maintainer: 0.3,\n abandoned: 0.3,\n high_centrality: 0.16,\n deep_chain: 0.14,\n high_fanout: 0.06,\n metadata_unavailable: 0.04,\n};\n\nconst dependencySignalWeightBudget = Object.values(dependencySignalWeights).reduce(\n (sum, value) => sum + value,\n 0,\n);\n\nconst computeDependencySignalScore = (\n ownSignals: readonly DependencyRiskSignal[],\n inheritedSignals: readonly DependencyRiskSignal[],\n inheritedSignalMultiplier: number,\n): number => {\n const ownWeight = ownSignals.reduce(\n (sum, signal) => sum + (dependencySignalWeights[signal] ?? 0),\n 0,\n );\n const inheritedWeight = inheritedSignals.reduce(\n (sum, signal) => sum + (dependencySignalWeights[signal] ?? 0),\n 0,\n );\n\n const weightedTotal = ownWeight + inheritedWeight * inheritedSignalMultiplier;\n const maxWeightedTotal = dependencySignalWeightBudget * (1 + inheritedSignalMultiplier);\n\n if (maxWeightedTotal <= 0) {\n return 0;\n }\n\n return toUnitInterval(weightedTotal / maxWeightedTotal);\n};\n\nconst clampConfidence = (value: number): number => round4(toUnitInterval(value));\n\nconst computeExternalMetadataConfidence = (external: ExternalAnalysisSummary): number => {\n if (!external.available) {\n return 0;\n }\n\n // Topology signals still exist without registry metadata, so keep a non-zero floor.\n return round4(toUnitInterval(0.35 + external.metrics.metadataCoverage * 0.65));\n};\n\nconst computeEvolutionHistoryConfidence = (\n structural: GraphAnalysisSummary,\n evolution: RepositoryEvolutionSummary,\n evolutionByFile: ReadonlyMap<string, FileEvolutionMetrics>,\n): number => {\n if (!evolution.available) {\n return 0;\n }\n\n const totalFiles = structural.files.length;\n if (totalFiles === 0) {\n return 1;\n }\n\n let coveredFiles = 0;\n for (const file of structural.files) {\n if (evolutionByFile.has(normalizePath(file.id))) {\n coveredFiles += 1;\n }\n }\n\n const coverage = coveredFiles / totalFiles;\n // Partial commit history still carries value, but confidence scales with coverage.\n return round4(toUnitInterval(0.3 + coverage * 0.7));\n};\n\nconst buildFactorTraces = (\n totalScore: number,\n inputs: readonly FactorTraceInput[],\n): readonly RiskFactorTrace[] => {\n const positiveInputs = inputs.filter((input) => input.strength > 0);\n const strengthTotal = positiveInputs.reduce((sum, input) => sum + input.strength, 0);\n\n const traces = inputs.map<RiskFactorTrace>((input) => ({\n factorId: input.factorId,\n family: input.family,\n contribution: 0,\n rawMetrics: input.rawMetrics,\n normalizedMetrics: input.normalizedMetrics,\n weight: input.weight,\n amplification: input.amplification,\n evidence: input.evidence,\n confidence: clampConfidence(input.confidence),\n }));\n\n if (strengthTotal <= 0 || totalScore <= 0) {\n return traces;\n }\n\n const scored = positiveInputs.map((input) => ({\n factorId: input.factorId,\n contribution: (totalScore * input.strength) / strengthTotal,\n }));\n\n let distributed = 0;\n for (let index = 0; index < scored.length; index += 1) {\n const current = scored[index];\n if (current === undefined) {\n continue;\n }\n\n const traceIndex = traces.findIndex((trace) => trace.factorId === current.factorId);\n if (traceIndex < 0) {\n continue;\n }\n const existing = traces[traceIndex];\n if (existing === undefined) {\n continue;\n }\n\n if (index === scored.length - 1) {\n const remaining = round4(totalScore - distributed);\n traces[traceIndex] = {\n ...existing,\n contribution: Math.max(0, remaining),\n };\n distributed += Math.max(0, remaining);\n continue;\n }\n\n const rounded = round4(current.contribution);\n traces[traceIndex] = {\n ...existing,\n contribution: rounded,\n };\n distributed += rounded;\n }\n\n return traces;\n};\n\nconst buildReductionLevers = (\n factors: readonly RiskFactorTrace[],\n): readonly { factorId: string; estimatedImpact: number }[] =>\n factors\n .filter((factor) => factor.contribution > 0)\n .sort((a, b) => b.contribution - a.contribution || a.factorId.localeCompare(b.factorId))\n .slice(0, 3)\n .map((factor) => ({\n factorId: factor.factorId,\n estimatedImpact: round4(factor.contribution),\n }));\n\nconst buildTargetTrace = (\n targetType: TargetTrace[\"targetType\"],\n targetId: string,\n totalScore: number,\n normalizedScore: number,\n factors: readonly RiskFactorTrace[],\n): TargetTrace => {\n const dominantFactors = [...factors]\n .filter((factor) => factor.contribution > 0)\n .sort((a, b) => b.contribution - a.contribution || a.factorId.localeCompare(b.factorId))\n .slice(0, 3)\n .map((factor) => factor.factorId);\n\n return {\n targetType,\n targetId,\n totalScore: round4(totalScore),\n normalizedScore: round4(normalizedScore),\n factors,\n dominantFactors,\n reductionLevers: buildReductionLevers(factors),\n };\n};\n\nconst computeDependencyScores = (\n external: ExternalAnalysisSummary,\n config: RiskEngineConfig,\n): DependencyScoreComputation => {\n if (!external.available) {\n return {\n dependencyScores: [],\n repositoryExternalPressure: 0,\n dependencyContexts: new Map(),\n };\n }\n\n const transitiveCounts = external.dependencies.map((dependency) =>\n logScale(dependency.transitiveDependencies.length),\n );\n const dependentCounts = external.dependencies.map((dependency) =>\n logScale(dependency.dependents),\n );\n const chainDepths = external.dependencies.map((dependency) => dependency.dependencyDepth);\n\n const transitiveScale = buildQuantileScale(\n transitiveCounts,\n config.quantileClamp.lower,\n config.quantileClamp.upper,\n );\n const dependentScale = buildQuantileScale(\n dependentCounts,\n config.quantileClamp.lower,\n config.quantileClamp.upper,\n );\n const chainDepthScale = buildQuantileScale(\n chainDepths,\n config.quantileClamp.lower,\n config.quantileClamp.upper,\n );\n\n const dependencyContexts = new Map<\n string,\n {\n signalScore: number;\n stalenessRisk: number;\n maintainerConcentrationRisk: number;\n transitiveBurdenRisk: number;\n centralityRisk: number;\n chainDepthRisk: number;\n busFactorRisk: number;\n popularityDampener: number;\n rawMetrics: {\n daysSinceLastRelease: number | null;\n maintainerCount: number | null;\n transitiveCount: number;\n dependents: number;\n dependencyDepth: number;\n busFactor: number | null;\n weeklyDownloads: number | null;\n };\n confidence: number;\n }\n >();\n\n const metadataConfidence = computeExternalMetadataConfidence(external);\n const dependencyScores = external.dependencies\n .map<DependencyRiskScore>((dependency) => {\n const signalScore = computeDependencySignalScore(\n dependency.ownRiskSignals,\n dependency.inheritedRiskSignals,\n config.dependencySignals.inheritedSignalMultiplier,\n );\n\n const maintainerConcentrationRisk =\n dependency.maintainerCount === null\n ? config.dependencySignals.missingMetadataPenalty\n : toUnitInterval(1 / Math.max(1, dependency.maintainerCount));\n\n const stalenessRisk =\n dependency.daysSinceLastRelease === null\n ? config.dependencySignals.missingMetadataPenalty\n : halfLifeRisk(\n dependency.daysSinceLastRelease,\n config.dependencySignals.abandonedHalfLifeDays,\n );\n\n const transitiveBurdenRisk = normalizeWithScale(\n logScale(dependency.transitiveDependencies.length),\n transitiveScale,\n );\n\n const centralityRisk = normalizeWithScale(logScale(dependency.dependents), dependentScale);\n const chainDepthRisk = normalizeWithScale(dependency.dependencyDepth, chainDepthScale);\n\n const busFactorRisk =\n dependency.busFactor === null\n ? config.dependencySignals.missingMetadataPenalty\n : toUnitInterval(1 / Math.max(1, dependency.busFactor));\n\n const weights = config.dependencyFactorWeights;\n const baseScore = toUnitInterval(\n signalScore * weights.signals +\n stalenessRisk * weights.staleness +\n maintainerConcentrationRisk * weights.maintainerConcentration +\n transitiveBurdenRisk * weights.transitiveBurden +\n centralityRisk * weights.centrality +\n chainDepthRisk * weights.chainDepth +\n busFactorRisk * weights.busFactorRisk,\n );\n\n const hasHardRiskSignal =\n dependency.ownRiskSignals.includes(\"abandoned\") ||\n dependency.ownRiskSignals.includes(\"metadata_unavailable\") ||\n dependency.ownRiskSignals.includes(\"single_maintainer\");\n\n const popularityDampener =\n dependency.weeklyDownloads === null || hasHardRiskSignal\n ? 1\n : 1 -\n halfLifeRisk(\n dependency.weeklyDownloads,\n config.dependencySignals.popularityHalfLifeDownloads,\n ) *\n config.dependencySignals.popularityMaxDampening;\n const normalizedScore = toUnitInterval(baseScore * popularityDampener);\n\n const availableMetricCount = [\n dependency.daysSinceLastRelease,\n dependency.maintainerCount,\n dependency.busFactor,\n dependency.weeklyDownloads,\n ].filter((value) => value !== null).length;\n const confidence = toUnitInterval((0.5 + availableMetricCount * 0.125) * metadataConfidence);\n\n dependencyContexts.set(dependency.name, {\n signalScore: round4(signalScore),\n stalenessRisk: round4(stalenessRisk),\n maintainerConcentrationRisk: round4(maintainerConcentrationRisk),\n transitiveBurdenRisk: round4(transitiveBurdenRisk),\n centralityRisk: round4(centralityRisk),\n chainDepthRisk: round4(chainDepthRisk),\n busFactorRisk: round4(busFactorRisk),\n popularityDampener: round4(popularityDampener),\n rawMetrics: {\n daysSinceLastRelease: dependency.daysSinceLastRelease,\n maintainerCount: dependency.maintainerCount,\n transitiveCount: dependency.transitiveDependencies.length,\n dependents: dependency.dependents,\n dependencyDepth: dependency.dependencyDepth,\n busFactor: dependency.busFactor,\n weeklyDownloads: dependency.weeklyDownloads,\n },\n confidence: round4(confidence),\n });\n\n return {\n dependency: dependency.name,\n score: round4(normalizedScore * 100),\n normalizedScore: round4(normalizedScore),\n ownRiskSignals: dependency.ownRiskSignals,\n inheritedRiskSignals: dependency.inheritedRiskSignals,\n };\n })\n .sort(\n (a, b) => b.normalizedScore - a.normalizedScore || a.dependency.localeCompare(b.dependency),\n );\n\n const normalizedValues = dependencyScores.map((score) => score.normalizedScore);\n const highDependencyRisk =\n dependencyScores.length === 0\n ? 0\n : percentile(normalizedValues, config.externalDimension.topDependencyPercentile);\n const averageDependencyRisk = average(normalizedValues);\n const depthRisk = halfLifeRisk(\n external.metrics.dependencyDepth,\n config.externalDimension.dependencyDepthHalfLife,\n );\n\n const repositoryExternalPressure = toUnitInterval(\n highDependencyRisk * 0.5 + averageDependencyRisk * 0.3 + depthRisk * 0.2,\n );\n\n return {\n dependencyScores,\n repositoryExternalPressure: round4(repositoryExternalPressure),\n dependencyContexts,\n };\n};\n\nconst mapEvolutionByFile = (\n evolution: RepositoryEvolutionSummary,\n): ReadonlyMap<string, FileEvolutionMetrics> => {\n if (!evolution.available) {\n return new Map<string, FileEvolutionMetrics>();\n }\n\n return new Map(\n evolution.files.map((fileMetrics) => [normalizePath(fileMetrics.filePath), fileMetrics]),\n );\n};\n\nconst computeEvolutionScales = (\n evolutionByFile: ReadonlyMap<string, FileEvolutionMetrics>,\n config: RiskEngineConfig,\n): MetricScales => {\n const evolutionFiles = [...evolutionByFile.values()];\n\n return {\n commitCount: buildQuantileScale(\n evolutionFiles.map((metrics) => logScale(metrics.commitCount)),\n config.quantileClamp.lower,\n config.quantileClamp.upper,\n ),\n churnTotal: buildQuantileScale(\n evolutionFiles.map((metrics) => logScale(metrics.churnTotal)),\n config.quantileClamp.lower,\n config.quantileClamp.upper,\n ),\n busFactor: buildQuantileScale(\n evolutionFiles.map((metrics) => metrics.busFactorByCommits),\n config.quantileClamp.lower,\n config.quantileClamp.upper,\n ),\n };\n};\n\nconst inferModuleName = (filePath: string, config: RiskEngineConfig): string => {\n const normalized = normalizePath(filePath);\n const parts = normalized.split(\"/\").filter((part) => part.length > 0);\n\n if (parts.length <= 1) {\n return config.module.rootLabel;\n }\n\n const first = parts[0];\n if (first === undefined) {\n return config.module.rootLabel;\n }\n\n if (!config.module.commonSourceRoots.includes(first)) {\n return first;\n }\n\n if (parts.length <= config.module.maxPrefixSegments) {\n return first;\n }\n\n return parts.slice(0, config.module.maxPrefixSegments).join(\"/\");\n};\n\nconst buildFragileClusters = (\n structural: GraphAnalysisSummary,\n evolution: RepositoryEvolutionSummary,\n fileScoresByFile: ReadonlyMap<string, FileRiskScore>,\n config: RiskEngineConfig,\n): readonly FragileCluster[] => {\n const clusters: FragileCluster[] = [];\n\n let cycleClusterCount = 0;\n for (const cycle of structural.cycles) {\n const files = [...new Set(cycle.nodes.map((node) => normalizePath(node)))].filter((filePath) =>\n fileScoresByFile.has(filePath),\n );\n\n if (files.length < 2) {\n continue;\n }\n\n files.sort((a, b) => a.localeCompare(b));\n\n const averageRisk = average(\n files.map((filePath) => fileScoresByFile.get(filePath)?.normalizedScore ?? 0),\n );\n\n const cycleSizeRisk = toUnitInterval((files.length - 1) / 5);\n const score = round4(toUnitInterval(averageRisk * 0.75 + cycleSizeRisk * 0.25) * 100);\n\n cycleClusterCount += 1;\n clusters.push({\n id: `cycle:${cycleClusterCount}`,\n kind: \"structural_cycle\",\n files,\n score,\n });\n }\n\n if (evolution.available && evolution.coupling.pairs.length > 0) {\n const candidates = evolution.coupling.pairs.filter(\n (pair) => pair.coChangeCommits >= config.couplingCluster.minCoChangeCommits,\n );\n\n const threshold = Math.max(\n config.couplingCluster.floorScore,\n percentile(\n candidates.map((pair) => pair.couplingScore),\n config.couplingCluster.percentileThreshold,\n ),\n );\n\n const selectedPairs = candidates\n .filter((pair) => pair.couplingScore >= threshold)\n .map((pair) => ({\n fileA: normalizePath(pair.fileA),\n fileB: normalizePath(pair.fileB),\n couplingScore: pair.couplingScore,\n }))\n .filter(\n (pair) =>\n pair.fileA !== pair.fileB &&\n fileScoresByFile.has(pair.fileA) &&\n fileScoresByFile.has(pair.fileB),\n );\n\n const adjacency = new Map<string, Set<string>>();\n for (const pair of selectedPairs) {\n const aNeighbors = adjacency.get(pair.fileA) ?? new Set<string>();\n aNeighbors.add(pair.fileB);\n adjacency.set(pair.fileA, aNeighbors);\n\n const bNeighbors = adjacency.get(pair.fileB) ?? new Set<string>();\n bNeighbors.add(pair.fileA);\n adjacency.set(pair.fileB, bNeighbors);\n }\n\n const visited = new Set<string>();\n let couplingClusterCount = 0;\n\n const orderedStarts = [...adjacency.keys()].sort((a, b) => a.localeCompare(b));\n for (const start of orderedStarts) {\n if (visited.has(start)) {\n continue;\n }\n\n const stack = [start];\n const files: string[] = [];\n\n while (stack.length > 0) {\n const current = stack.pop();\n if (current === undefined || visited.has(current)) {\n continue;\n }\n\n visited.add(current);\n files.push(current);\n\n const neighbors = adjacency.get(current);\n if (neighbors === undefined) {\n continue;\n }\n\n for (const neighbor of neighbors) {\n if (!visited.has(neighbor)) {\n stack.push(neighbor);\n }\n }\n }\n\n if (files.length < 2) {\n continue;\n }\n\n files.sort((a, b) => a.localeCompare(b));\n const fileSet = new Set(files);\n const componentPairs = selectedPairs.filter(\n (pair) => fileSet.has(pair.fileA) && fileSet.has(pair.fileB),\n );\n\n const meanFileRisk = average(\n files.map((filePath) => fileScoresByFile.get(filePath)?.normalizedScore ?? 0),\n );\n const meanCoupling = average(componentPairs.map((pair) => pair.couplingScore));\n\n const score = round4(toUnitInterval(meanFileRisk * 0.65 + meanCoupling * 0.35) * 100);\n\n couplingClusterCount += 1;\n clusters.push({\n id: `coupling:${couplingClusterCount}`,\n kind: \"change_coupling\",\n files,\n score,\n });\n }\n }\n\n return clusters.sort(\n (a, b) => b.score - a.score || a.kind.localeCompare(b.kind) || a.id.localeCompare(b.id),\n );\n};\n\nexport const computeRiskSummary = (\n structural: GraphAnalysisSummary,\n evolution: RepositoryEvolutionSummary,\n external: ExternalAnalysisSummary,\n config: RiskEngineConfig,\n traceCollector?: TraceCollector,\n): RepositoryRiskSummary => {\n const collector = traceCollector;\n const dependencyComputation = computeDependencyScores(external, config);\n const externalMetadataConfidence = computeExternalMetadataConfidence(external);\n const evolutionByFile = mapEvolutionByFile(evolution);\n const evolutionHistoryConfidence = computeEvolutionHistoryConfidence(\n structural,\n evolution,\n evolutionByFile,\n );\n const evolutionScales = computeEvolutionScales(evolutionByFile, config);\n\n const cycleFileSet = new Set(\n structural.cycles.flatMap((cycle) => cycle.nodes.map((node) => normalizePath(node))),\n );\n\n const fanInScale = buildQuantileScale(\n structural.files.map((file) => logScale(file.fanIn)),\n config.quantileClamp.lower,\n config.quantileClamp.upper,\n );\n const fanOutScale = buildQuantileScale(\n structural.files.map((file) => logScale(file.fanOut)),\n config.quantileClamp.lower,\n config.quantileClamp.upper,\n );\n const depthScale = buildQuantileScale(\n structural.files.map((file) => file.depth),\n config.quantileClamp.lower,\n config.quantileClamp.upper,\n );\n\n const dimensionWeights = normalizeWeights(config.dimensionWeights, {\n structural: true,\n evolution: evolution.available,\n external: external.available,\n });\n\n const fileRiskContexts = structural.files\n .map<FileRiskContext>((file) => {\n const filePath = normalizePath(file.id);\n const inCycle = cycleFileSet.has(filePath) ? 1 : 0;\n\n const fanInRisk = normalizeWithScale(logScale(file.fanIn), fanInScale);\n const fanOutRisk = normalizeWithScale(logScale(file.fanOut), fanOutScale);\n const depthRisk = normalizeWithScale(file.depth, depthScale);\n\n const structuralWeights = config.structuralFactorWeights;\n const structuralFactorRaw = toUnitInterval(\n fanInRisk * structuralWeights.fanIn +\n fanOutRisk * structuralWeights.fanOut +\n depthRisk * structuralWeights.depth +\n inCycle * structuralWeights.cycleParticipation,\n );\n\n const structuralCentralityRaw = toUnitInterval((fanInRisk + fanOutRisk) / 2);\n\n let evolutionFactor = 0;\n let frequencyRisk = 0;\n let churnRisk = 0;\n let volatilityRisk = 0;\n let ownershipConcentrationRisk = 0;\n let busFactorRisk = 0;\n const evolutionMetrics = evolutionByFile.get(filePath);\n if (evolution.available && evolutionMetrics !== undefined) {\n frequencyRisk = normalizeWithScale(\n logScale(evolutionMetrics.commitCount),\n evolutionScales.commitCount,\n );\n churnRisk = normalizeWithScale(\n logScale(evolutionMetrics.churnTotal),\n evolutionScales.churnTotal,\n );\n volatilityRisk = toUnitInterval(evolutionMetrics.recentVolatility);\n ownershipConcentrationRisk = toUnitInterval(evolutionMetrics.topAuthorShareByCommits);\n busFactorRisk = toUnitInterval(\n 1 - normalizeWithScale(evolutionMetrics.busFactorByCommits, evolutionScales.busFactor),\n );\n\n const evolutionWeights = config.evolutionFactorWeights;\n evolutionFactor = toUnitInterval(\n frequencyRisk * evolutionWeights.frequency +\n churnRisk * evolutionWeights.churn +\n volatilityRisk * evolutionWeights.recentVolatility +\n ownershipConcentrationRisk * evolutionWeights.ownershipConcentration +\n busFactorRisk * evolutionWeights.busFactorRisk,\n );\n }\n\n const structuralAttenuation = computeAggregatorAttenuation({\n fanIn: file.fanIn,\n fanOut: file.fanOut,\n inCycle,\n evolutionMetrics,\n config: config.aggregatorAttenuation,\n });\n const structuralFactor = toUnitInterval(structuralFactorRaw * structuralAttenuation);\n const structuralCentrality = toUnitInterval(structuralCentralityRaw * structuralAttenuation);\n\n const dependencyAffinity = toUnitInterval(structuralCentrality * 0.6 + evolutionFactor * 0.4);\n const externalFactor = external.available\n ? toUnitInterval(dependencyComputation.repositoryExternalPressure * dependencyAffinity)\n : 0;\n\n const structuralBase = structuralFactor * dimensionWeights.structural;\n const evolutionBase = evolutionFactor * dimensionWeights.evolution;\n const externalBase = externalFactor * dimensionWeights.external;\n const baseline = structuralBase + evolutionBase + externalBase;\n\n const interactionStructuralEvolution =\n structuralFactor * evolutionFactor * config.interactionWeights.structuralEvolution;\n const interactionCentralInstability =\n structuralCentrality * evolutionFactor * config.interactionWeights.centralInstability;\n const interactionDependencyAmplification =\n externalFactor *\n Math.max(structuralFactor, evolutionFactor) *\n config.interactionWeights.dependencyAmplification;\n\n const interactions = [\n interactionStructuralEvolution,\n interactionCentralInstability,\n interactionDependencyAmplification,\n ];\n\n const normalizedScore = saturatingComposite(baseline, interactions);\n\n return {\n file: filePath,\n score: round4(normalizedScore * 100),\n normalizedScore: round4(normalizedScore),\n factors: {\n structural: round4(structuralFactor),\n evolution: round4(evolutionFactor),\n external: round4(externalFactor),\n },\n structuralCentrality: round4(structuralCentrality),\n traceTerms: {\n structuralBase: round4(structuralBase),\n evolutionBase: round4(evolutionBase),\n externalBase: round4(externalBase),\n interactionStructuralEvolution: round4(interactionStructuralEvolution),\n interactionCentralInstability: round4(interactionCentralInstability),\n interactionDependencyAmplification: round4(interactionDependencyAmplification),\n },\n rawMetrics: {\n fanIn: file.fanIn,\n fanOut: file.fanOut,\n depth: file.depth,\n cycleParticipation: inCycle,\n commitCount: evolutionMetrics?.commitCount ?? null,\n churnTotal: evolutionMetrics?.churnTotal ?? null,\n recentVolatility: evolutionMetrics?.recentVolatility ?? null,\n topAuthorShareByCommits: evolutionMetrics?.topAuthorShareByCommits ?? null,\n busFactorByCommits: evolutionMetrics?.busFactorByCommits ?? null,\n dependencyAffinity: round4(dependencyAffinity),\n repositoryExternalPressure: round4(dependencyComputation.repositoryExternalPressure),\n structuralAttenuation: round4(structuralAttenuation),\n },\n normalizedMetrics: {\n fanInRisk: round4(fanInRisk),\n fanOutRisk: round4(fanOutRisk),\n depthRisk: round4(depthRisk),\n frequencyRisk: round4(frequencyRisk),\n churnRisk: round4(churnRisk),\n volatilityRisk: round4(volatilityRisk),\n ownershipConcentrationRisk: round4(ownershipConcentrationRisk),\n busFactorRisk: round4(busFactorRisk),\n },\n };\n })\n .sort((a, b) => b.score - a.score || a.file.localeCompare(b.file));\n\n const fileScores: FileRiskScore[] = fileRiskContexts.map((context) => ({\n file: context.file,\n score: context.score,\n normalizedScore: context.normalizedScore,\n factors: context.factors,\n }));\n\n if (collector !== undefined) {\n for (const context of fileRiskContexts) {\n const evidence: EvidenceRef[] = [\n { kind: \"file_metric\", target: context.file, metric: \"fanIn\" },\n { kind: \"file_metric\", target: context.file, metric: \"fanOut\" },\n { kind: \"file_metric\", target: context.file, metric: \"depth\" },\n ];\n\n if (context.rawMetrics.cycleParticipation > 0) {\n evidence.push({\n kind: \"graph_cycle\",\n cycleId: `file:${context.file}`,\n files: [context.file],\n });\n }\n\n const fileFactors = buildFactorTraces(context.score, [\n {\n factorId: \"file.structural\",\n family: \"structural\",\n strength: context.traceTerms.structuralBase,\n rawMetrics: {\n fanIn: context.rawMetrics.fanIn,\n fanOut: context.rawMetrics.fanOut,\n depth: context.rawMetrics.depth,\n cycleParticipation: context.rawMetrics.cycleParticipation,\n structuralAttenuation: context.rawMetrics.structuralAttenuation,\n },\n normalizedMetrics: {\n fanInRisk: context.normalizedMetrics.fanInRisk,\n fanOutRisk: context.normalizedMetrics.fanOutRisk,\n depthRisk: context.normalizedMetrics.depthRisk,\n structuralFactor: context.factors.structural,\n },\n weight: dimensionWeights.structural,\n amplification: null,\n evidence,\n confidence: 1,\n },\n {\n factorId: \"file.evolution\",\n family: \"evolution\",\n strength: context.traceTerms.evolutionBase,\n rawMetrics: {\n commitCount: context.rawMetrics.commitCount,\n churnTotal: context.rawMetrics.churnTotal,\n recentVolatility: context.rawMetrics.recentVolatility,\n topAuthorShareByCommits: context.rawMetrics.topAuthorShareByCommits,\n busFactorByCommits: context.rawMetrics.busFactorByCommits,\n },\n normalizedMetrics: {\n frequencyRisk: context.normalizedMetrics.frequencyRisk,\n churnRisk: context.normalizedMetrics.churnRisk,\n volatilityRisk: context.normalizedMetrics.volatilityRisk,\n ownershipConcentrationRisk: context.normalizedMetrics.ownershipConcentrationRisk,\n busFactorRisk: context.normalizedMetrics.busFactorRisk,\n evolutionFactor: context.factors.evolution,\n },\n weight: dimensionWeights.evolution,\n amplification: null,\n evidence: [{ kind: \"file_metric\", target: context.file, metric: \"commitCount\" }],\n confidence: evolution.available\n ? evolutionHistoryConfidence * (context.rawMetrics.commitCount === null ? 0.5 : 1)\n : 0,\n },\n {\n factorId: \"file.external\",\n family: \"external\",\n strength: context.traceTerms.externalBase,\n rawMetrics: {\n repositoryExternalPressure: context.rawMetrics.repositoryExternalPressure,\n dependencyAffinity: context.rawMetrics.dependencyAffinity,\n },\n normalizedMetrics: {\n externalFactor: context.factors.external,\n },\n weight: dimensionWeights.external,\n amplification: null,\n evidence: [{ kind: \"repository_metric\", metric: \"repositoryExternalPressure\" }],\n confidence: external.available ? 0.7 * externalMetadataConfidence : 0,\n },\n {\n factorId: \"file.composite.interactions\",\n family: \"composite\",\n strength:\n context.traceTerms.interactionStructuralEvolution +\n context.traceTerms.interactionCentralInstability +\n context.traceTerms.interactionDependencyAmplification,\n rawMetrics: {\n structuralEvolutionInteraction: context.traceTerms.interactionStructuralEvolution,\n centralInstabilityInteraction: context.traceTerms.interactionCentralInstability,\n dependencyAmplificationInteraction:\n context.traceTerms.interactionDependencyAmplification,\n },\n normalizedMetrics: {},\n weight: null,\n amplification:\n config.interactionWeights.structuralEvolution +\n config.interactionWeights.centralInstability +\n config.interactionWeights.dependencyAmplification,\n evidence: [{ kind: \"repository_metric\", metric: \"interactionWeights\" }],\n confidence: 0.9,\n },\n ]);\n\n collector.record(\n buildTargetTrace(\"file\", context.file, context.score, context.normalizedScore, fileFactors),\n );\n }\n }\n\n const fileScoresByFile = new Map(fileScores.map((fileScore) => [fileScore.file, fileScore]));\n\n const hotspotsCount = Math.min(\n config.hotspotMaxFiles,\n Math.max(config.hotspotMinFiles, Math.ceil(fileScores.length * config.hotspotTopPercent)),\n );\n\n const hotspots = fileScores.slice(0, hotspotsCount).map((fileScore) => ({\n file: fileScore.file,\n score: fileScore.score,\n factors: fileScore.factors,\n }));\n\n const moduleFiles = new Map<string, number[]>();\n for (const fileScore of fileScores) {\n const moduleName = inferModuleName(fileScore.file, config);\n const values = moduleFiles.get(moduleName) ?? [];\n values.push(fileScore.normalizedScore);\n moduleFiles.set(moduleName, values);\n }\n\n const moduleScores: ModuleRiskScore[] = [...moduleFiles.entries()]\n .map(([module, values]) => {\n const averageScore = average(values);\n const peakScore = values.reduce((max, value) => Math.max(max, value), 0);\n const normalizedScore = toUnitInterval(averageScore * 0.65 + peakScore * 0.35);\n\n return {\n module,\n score: round4(normalizedScore * 100),\n normalizedScore: round4(normalizedScore),\n fileCount: values.length,\n };\n })\n .sort((a, b) => b.score - a.score || a.module.localeCompare(b.module));\n\n if (collector !== undefined) {\n for (const [module, values] of moduleFiles.entries()) {\n const averageScore = average(values);\n const peakScore = values.reduce((max, value) => Math.max(max, value), 0);\n const normalizedScore = toUnitInterval(averageScore * 0.65 + peakScore * 0.35);\n const totalScore = round4(normalizedScore * 100);\n const factors = buildFactorTraces(totalScore, [\n {\n factorId: \"module.average_file_risk\",\n family: \"composite\",\n strength: averageScore * 0.65,\n rawMetrics: { averageFileRisk: round4(averageScore), fileCount: values.length },\n normalizedMetrics: { normalizedModuleRisk: round4(normalizedScore) },\n weight: 0.65,\n amplification: null,\n evidence: [{ kind: \"repository_metric\", metric: \"moduleAggregation.average\" }],\n confidence: 1,\n },\n {\n factorId: \"module.peak_file_risk\",\n family: \"composite\",\n strength: peakScore * 0.35,\n rawMetrics: { peakFileRisk: round4(peakScore), fileCount: values.length },\n normalizedMetrics: { normalizedModuleRisk: round4(normalizedScore) },\n weight: 0.35,\n amplification: null,\n evidence: [{ kind: \"repository_metric\", metric: \"moduleAggregation.peak\" }],\n confidence: 1,\n },\n ]);\n\n collector.record(buildTargetTrace(\"module\", module, totalScore, normalizedScore, factors));\n }\n }\n\n const fragileClusters = buildFragileClusters(structural, evolution, fileScoresByFile, config);\n\n const externalPressures = fileScores.map((fileScore) => fileScore.factors.external);\n const pressureThreshold = Math.max(\n config.amplificationZone.pressureFloor,\n percentile(externalPressures, config.amplificationZone.percentileThreshold),\n );\n\n const dependencyAmplificationZones = fileScores\n .map((fileScore) => {\n const intensity = toUnitInterval(\n fileScore.factors.external *\n Math.max(fileScore.factors.structural, fileScore.factors.evolution),\n );\n const normalizedZoneScore = toUnitInterval(intensity * 0.7 + fileScore.normalizedScore * 0.3);\n\n return {\n file: fileScore.file,\n score: round4(normalizedZoneScore * 100),\n externalPressure: fileScore.factors.external,\n };\n })\n .filter((zone) => external.available && zone.externalPressure >= pressureThreshold)\n .sort((a, b) => b.score - a.score || a.file.localeCompare(b.file))\n .slice(0, config.amplificationZone.maxZones)\n .map((zone) => ({\n ...zone,\n externalPressure: round4(zone.externalPressure),\n }));\n\n if (collector !== undefined && external.available) {\n const dependencyByName = new Map(\n external.dependencies.map((dependency) => [dependency.name, dependency]),\n );\n for (const dependencyScore of dependencyComputation.dependencyScores) {\n const dependency = dependencyByName.get(dependencyScore.dependency);\n const context = dependencyComputation.dependencyContexts.get(dependencyScore.dependency);\n if (dependency === undefined || context === undefined) {\n continue;\n }\n\n const hasMetadata =\n context.rawMetrics.daysSinceLastRelease !== null &&\n context.rawMetrics.maintainerCount !== null;\n const factors = buildFactorTraces(dependencyScore.score, [\n {\n factorId: \"dependency.signals\",\n family: \"external\",\n strength: context.signalScore * config.dependencyFactorWeights.signals,\n rawMetrics: {\n ownSignals: dependency.ownRiskSignals.length,\n inheritedSignals: dependency.inheritedRiskSignals.length,\n },\n normalizedMetrics: { signalScore: context.signalScore },\n weight: config.dependencyFactorWeights.signals,\n amplification: config.dependencySignals.inheritedSignalMultiplier,\n evidence: [{ kind: \"dependency_metric\", target: dependency.name, metric: \"riskSignals\" }],\n confidence: 0.95 * externalMetadataConfidence,\n },\n {\n factorId: \"dependency.staleness\",\n family: \"external\",\n strength: context.stalenessRisk * config.dependencyFactorWeights.staleness,\n rawMetrics: { daysSinceLastRelease: context.rawMetrics.daysSinceLastRelease },\n normalizedMetrics: { stalenessRisk: context.stalenessRisk },\n weight: config.dependencyFactorWeights.staleness,\n amplification: null,\n evidence: [\n { kind: \"dependency_metric\", target: dependency.name, metric: \"daysSinceLastRelease\" },\n ],\n confidence: (hasMetadata ? 0.9 : 0.5) * externalMetadataConfidence,\n },\n {\n factorId: \"dependency.maintainer_concentration\",\n family: \"external\",\n strength:\n context.maintainerConcentrationRisk *\n config.dependencyFactorWeights.maintainerConcentration,\n rawMetrics: { maintainerCount: context.rawMetrics.maintainerCount },\n normalizedMetrics: {\n maintainerConcentrationRisk: context.maintainerConcentrationRisk,\n },\n weight: config.dependencyFactorWeights.maintainerConcentration,\n amplification: null,\n evidence: [\n { kind: \"dependency_metric\", target: dependency.name, metric: \"maintainerCount\" },\n ],\n confidence: (hasMetadata ? 0.9 : 0.5) * externalMetadataConfidence,\n },\n {\n factorId: \"dependency.topology\",\n family: \"external\",\n strength:\n context.transitiveBurdenRisk * config.dependencyFactorWeights.transitiveBurden +\n context.centralityRisk * config.dependencyFactorWeights.centrality +\n context.chainDepthRisk * config.dependencyFactorWeights.chainDepth,\n rawMetrics: {\n transitiveCount: context.rawMetrics.transitiveCount,\n dependents: context.rawMetrics.dependents,\n dependencyDepth: context.rawMetrics.dependencyDepth,\n },\n normalizedMetrics: {\n transitiveBurdenRisk: context.transitiveBurdenRisk,\n centralityRisk: context.centralityRisk,\n chainDepthRisk: context.chainDepthRisk,\n },\n weight:\n config.dependencyFactorWeights.transitiveBurden +\n config.dependencyFactorWeights.centrality +\n config.dependencyFactorWeights.chainDepth,\n amplification: null,\n evidence: [\n { kind: \"dependency_metric\", target: dependency.name, metric: \"dependencyDepth\" },\n ],\n confidence: 1 * externalMetadataConfidence,\n },\n {\n factorId: \"dependency.bus_factor\",\n family: \"external\",\n strength: context.busFactorRisk * config.dependencyFactorWeights.busFactorRisk,\n rawMetrics: { busFactor: context.rawMetrics.busFactor },\n normalizedMetrics: { busFactorRisk: context.busFactorRisk },\n weight: config.dependencyFactorWeights.busFactorRisk,\n amplification: null,\n evidence: [{ kind: \"dependency_metric\", target: dependency.name, metric: \"busFactor\" }],\n confidence:\n (context.rawMetrics.busFactor === null ? 0.5 : 0.85) * externalMetadataConfidence,\n },\n {\n factorId: \"dependency.popularity_dampening\",\n family: \"composite\",\n strength: 1 - context.popularityDampener,\n rawMetrics: { weeklyDownloads: context.rawMetrics.weeklyDownloads },\n normalizedMetrics: { popularityDampener: context.popularityDampener },\n weight: config.dependencySignals.popularityMaxDampening,\n amplification: null,\n evidence: [\n { kind: \"dependency_metric\", target: dependency.name, metric: \"weeklyDownloads\" },\n ],\n confidence:\n (context.rawMetrics.weeklyDownloads === null ? 0.4 : 0.9) * externalMetadataConfidence,\n },\n ]);\n\n collector.record(\n buildTargetTrace(\n \"dependency\",\n dependencyScore.dependency,\n dependencyScore.score,\n dependencyScore.normalizedScore,\n factors,\n ),\n );\n }\n }\n\n const structuralDimension = average(fileScores.map((fileScore) => fileScore.factors.structural));\n const evolutionDimension = average(fileScores.map((fileScore) => fileScore.factors.evolution));\n const externalDimension = dependencyComputation.repositoryExternalPressure;\n\n const topCentralSlice = Math.max(1, Math.ceil(fileRiskContexts.length * 0.1));\n const criticalInstability = average(\n [...fileRiskContexts]\n .sort(\n (a, b) =>\n b.structuralCentrality * b.factors.evolution -\n a.structuralCentrality * a.factors.evolution || a.file.localeCompare(b.file),\n )\n .slice(0, topCentralSlice)\n .map((context) => context.structuralCentrality * context.factors.evolution),\n );\n\n const dependencyAmplification = average(\n dependencyAmplificationZones.map((zone) =>\n toUnitInterval((zone.externalPressure * zone.score) / 100),\n ),\n );\n\n const repositoryBaseline =\n structuralDimension * dimensionWeights.structural +\n evolutionDimension * dimensionWeights.evolution +\n externalDimension * dimensionWeights.external;\n\n const repositoryNormalizedScore = saturatingComposite(repositoryBaseline, [\n structuralDimension * evolutionDimension * config.interactionWeights.structuralEvolution,\n criticalInstability * config.interactionWeights.centralInstability,\n dependencyAmplification * config.interactionWeights.dependencyAmplification,\n ]);\n\n const riskScore = round4(repositoryNormalizedScore * 100);\n\n if (collector !== undefined) {\n const repositoryFactors = buildFactorTraces(riskScore, [\n {\n factorId: \"repository.structural\",\n family: \"structural\",\n strength: structuralDimension * dimensionWeights.structural,\n rawMetrics: { structuralDimension: round4(structuralDimension) },\n normalizedMetrics: { dimensionWeight: round4(dimensionWeights.structural) },\n weight: dimensionWeights.structural,\n amplification: null,\n evidence: [{ kind: \"repository_metric\", metric: \"structuralDimension\" }],\n confidence: 1,\n },\n {\n factorId: \"repository.evolution\",\n family: \"evolution\",\n strength: evolutionDimension * dimensionWeights.evolution,\n rawMetrics: { evolutionDimension: round4(evolutionDimension) },\n normalizedMetrics: { dimensionWeight: round4(dimensionWeights.evolution) },\n weight: dimensionWeights.evolution,\n amplification: null,\n evidence: [{ kind: \"repository_metric\", metric: \"evolutionDimension\" }],\n confidence: evolution.available ? evolutionHistoryConfidence : 0,\n },\n {\n factorId: \"repository.external\",\n family: \"external\",\n strength: externalDimension * dimensionWeights.external,\n rawMetrics: { externalDimension: round4(externalDimension) },\n normalizedMetrics: { dimensionWeight: round4(dimensionWeights.external) },\n weight: dimensionWeights.external,\n amplification: null,\n evidence: [{ kind: \"repository_metric\", metric: \"externalDimension\" }],\n confidence: external.available ? 0.8 * externalMetadataConfidence : 0,\n },\n {\n factorId: \"repository.composite.interactions\",\n family: \"composite\",\n strength:\n structuralDimension * evolutionDimension * config.interactionWeights.structuralEvolution +\n criticalInstability * config.interactionWeights.centralInstability +\n dependencyAmplification * config.interactionWeights.dependencyAmplification,\n rawMetrics: {\n structuralEvolution: round4(\n structuralDimension *\n evolutionDimension *\n config.interactionWeights.structuralEvolution,\n ),\n centralInstability: round4(\n criticalInstability * config.interactionWeights.centralInstability,\n ),\n dependencyAmplification: round4(\n dependencyAmplification * config.interactionWeights.dependencyAmplification,\n ),\n },\n normalizedMetrics: {\n criticalInstability: round4(criticalInstability),\n dependencyAmplification: round4(dependencyAmplification),\n },\n weight: null,\n amplification:\n config.interactionWeights.structuralEvolution +\n config.interactionWeights.centralInstability +\n config.interactionWeights.dependencyAmplification,\n evidence: [{ kind: \"repository_metric\", metric: \"interactionTerms\" }],\n confidence: 0.9,\n },\n ]);\n\n collector.record(\n buildTargetTrace(\n \"repository\",\n structural.targetPath,\n riskScore,\n repositoryNormalizedScore,\n repositoryFactors,\n ),\n );\n }\n\n return {\n riskScore,\n normalizedScore: round4(repositoryNormalizedScore),\n hotspots,\n fragileClusters,\n dependencyAmplificationZones,\n fileScores,\n moduleScores,\n dependencyScores: dependencyComputation.dependencyScores,\n };\n};\n","import type { RiskTrace, TargetTrace } from \"@codesentinel/core\";\n\nexport interface TraceCollector {\n record(target: TargetTrace): void;\n build(): RiskTrace | undefined;\n}\n\nclass NoopTraceCollector implements TraceCollector {\n record(_target: TargetTrace): void {}\n\n build(): undefined {\n return undefined;\n }\n}\n\nclass RecordingTraceCollector implements TraceCollector {\n private readonly targets: TargetTrace[] = [];\n\n record(target: TargetTrace): void {\n this.targets.push(target);\n }\n\n build(): RiskTrace {\n const orderedTargets = [...this.targets].sort((a, b) => {\n if (a.targetType !== b.targetType) {\n return a.targetType.localeCompare(b.targetType);\n }\n\n if (b.totalScore !== a.totalScore) {\n return b.totalScore - a.totalScore;\n }\n\n return a.targetId.localeCompare(b.targetId);\n });\n\n return {\n schemaVersion: \"1\",\n contributionTolerance: 0.0001,\n targets: orderedTargets,\n };\n }\n}\n\nconst noopCollectorSingleton = new NoopTraceCollector();\n\nexport const createTraceCollector = (enabled: boolean): TraceCollector =>\n enabled ? new RecordingTraceCollector() : noopCollectorSingleton;\n","import type {\n ExternalAnalysisSummary,\n GraphAnalysisSummary,\n RepositoryRiskEvaluation,\n RepositoryEvolutionSummary,\n RepositoryRiskSummary,\n} from \"@codesentinel/core\";\nimport { DEFAULT_RISK_ENGINE_CONFIG, type RiskEngineConfig } from \"../config.js\";\nimport { computeRiskSummary } from \"../domain/risk-model.js\";\nimport { createTraceCollector } from \"../domain/trace-collector.js\";\n\ntype DeepPartial<T> = {\n [K in keyof T]?: T[K] extends readonly unknown[]\n ? T[K]\n : T[K] extends object\n ? DeepPartial<T[K]>\n : T[K];\n};\n\nexport type ComputeRepositoryRiskSummaryInput = {\n structural: GraphAnalysisSummary;\n evolution: RepositoryEvolutionSummary;\n external: ExternalAnalysisSummary;\n config?: DeepPartial<RiskEngineConfig>;\n};\n\nexport type EvaluateRepositoryRiskOptions = {\n explain?: boolean;\n};\n\nconst mergeConfig = (overrides: DeepPartial<RiskEngineConfig> | undefined): RiskEngineConfig => {\n if (overrides === undefined) {\n return DEFAULT_RISK_ENGINE_CONFIG;\n }\n\n return {\n ...DEFAULT_RISK_ENGINE_CONFIG,\n ...overrides,\n dimensionWeights: {\n ...DEFAULT_RISK_ENGINE_CONFIG.dimensionWeights,\n ...overrides.dimensionWeights,\n },\n interactionWeights: {\n ...DEFAULT_RISK_ENGINE_CONFIG.interactionWeights,\n ...overrides.interactionWeights,\n },\n structuralFactorWeights: {\n ...DEFAULT_RISK_ENGINE_CONFIG.structuralFactorWeights,\n ...overrides.structuralFactorWeights,\n },\n evolutionFactorWeights: {\n ...DEFAULT_RISK_ENGINE_CONFIG.evolutionFactorWeights,\n ...overrides.evolutionFactorWeights,\n },\n dependencyFactorWeights: {\n ...DEFAULT_RISK_ENGINE_CONFIG.dependencyFactorWeights,\n ...overrides.dependencyFactorWeights,\n },\n quantileClamp: {\n ...DEFAULT_RISK_ENGINE_CONFIG.quantileClamp,\n ...overrides.quantileClamp,\n },\n couplingCluster: {\n ...DEFAULT_RISK_ENGINE_CONFIG.couplingCluster,\n ...overrides.couplingCluster,\n },\n amplificationZone: {\n ...DEFAULT_RISK_ENGINE_CONFIG.amplificationZone,\n ...overrides.amplificationZone,\n },\n module: {\n ...DEFAULT_RISK_ENGINE_CONFIG.module,\n ...overrides.module,\n },\n dependencySignals: {\n ...DEFAULT_RISK_ENGINE_CONFIG.dependencySignals,\n ...overrides.dependencySignals,\n },\n externalDimension: {\n ...DEFAULT_RISK_ENGINE_CONFIG.externalDimension,\n ...overrides.externalDimension,\n },\n aggregatorAttenuation: {\n ...DEFAULT_RISK_ENGINE_CONFIG.aggregatorAttenuation,\n ...overrides.aggregatorAttenuation,\n },\n };\n};\n\nexport const computeRepositoryRiskSummary = (\n input: ComputeRepositoryRiskSummaryInput,\n): RepositoryRiskSummary => {\n return evaluateRepositoryRisk(input, { explain: false }).summary;\n};\n\nexport const evaluateRepositoryRisk = (\n input: ComputeRepositoryRiskSummaryInput,\n options: EvaluateRepositoryRiskOptions = {},\n): RepositoryRiskEvaluation => {\n const config = mergeConfig(input.config);\n const collector = createTraceCollector(options.explain === true);\n const summary = computeRiskSummary(\n input.structural,\n input.evolution,\n input.external,\n config,\n collector,\n );\n\n const trace = collector.build();\n if (options.explain !== true) {\n return { summary };\n }\n\n if (trace === undefined) {\n return { summary };\n }\n\n return {\n summary,\n trace,\n };\n};\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport {\n GovernanceConfigurationError,\n evaluateGates,\n renderCheckMarkdown,\n renderCheckText,\n type GateConfig,\n type GateEvaluationResult,\n} from \"@codesentinel/governance\";\nimport { compareSnapshots, parseSnapshot, type CodeSentinelSnapshot } from \"@codesentinel/reporter\";\nimport { buildAnalysisSnapshot } from \"./build-analysis-snapshot.js\";\nimport { createSilentLogger, type Logger } from \"./logger.js\";\nimport type { AuthorIdentityCliMode, ScoringProfileCliMode } from \"./run-analyze-command.js\";\n\nexport type CheckOutputFormat = \"json\" | \"text\" | \"md\";\n\nexport type RunCheckCommandOptions = {\n baselinePath?: string;\n includeTrace: boolean;\n recentWindowDays?: number;\n scoringProfile?: ScoringProfileCliMode;\n gateConfig: GateConfig;\n outputFormat: CheckOutputFormat;\n outputPath?: string;\n};\n\nexport type CheckCommandResult = {\n current: CodeSentinelSnapshot;\n baseline?: CodeSentinelSnapshot;\n diff?: ReturnType<typeof compareSnapshots>;\n gateResult: GateEvaluationResult;\n rendered: string;\n};\n\nconst formatCheckResult = (result: CheckCommandResult, format: CheckOutputFormat): string => {\n if (format === \"json\") {\n return JSON.stringify(\n {\n current: result.current,\n ...(result.baseline === undefined ? {} : { baseline: result.baseline }),\n ...(result.diff === undefined ? {} : { diff: result.diff }),\n violations: result.gateResult.violations,\n evaluatedGates: result.gateResult.evaluatedGates,\n highestSeverity: result.gateResult.highestSeverity,\n exitCode: result.gateResult.exitCode,\n },\n null,\n 2,\n );\n }\n\n if (format === \"md\") {\n return renderCheckMarkdown(result.current, result.gateResult);\n }\n\n return renderCheckText(result.current, result.gateResult);\n};\n\nexport const runCheckCommand = async (\n inputPath: string | undefined,\n authorIdentityMode: AuthorIdentityCliMode,\n options: RunCheckCommandOptions,\n logger: Logger = createSilentLogger(),\n): Promise<CheckCommandResult> => {\n logger.info(\"building current snapshot for check\");\n const current = await buildAnalysisSnapshot(\n inputPath,\n authorIdentityMode,\n {\n includeTrace: options.includeTrace,\n ...(options.scoringProfile === undefined ? {} : { scoringProfile: options.scoringProfile }),\n ...(options.recentWindowDays === undefined\n ? {}\n : { recentWindowDays: options.recentWindowDays }),\n },\n logger,\n );\n\n let baseline: CodeSentinelSnapshot | undefined;\n let diff: ReturnType<typeof compareSnapshots> | undefined;\n\n if (options.baselinePath !== undefined) {\n logger.info(`loading baseline snapshot: ${options.baselinePath}`);\n const baselineRaw = await readFile(options.baselinePath, \"utf8\");\n try {\n baseline = parseSnapshot(baselineRaw);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"invalid baseline snapshot\";\n throw new GovernanceConfigurationError(`invalid baseline snapshot: ${message}`);\n }\n diff = compareSnapshots(current, baseline);\n }\n\n const gateResult = evaluateGates({\n current,\n ...(baseline === undefined ? {} : { baseline }),\n ...(diff === undefined ? {} : { diff }),\n gateConfig: options.gateConfig,\n });\n\n const rendered = formatCheckResult(\n {\n current,\n ...(baseline === undefined ? {} : { baseline }),\n ...(diff === undefined ? {} : { diff }),\n gateResult,\n rendered: \"\",\n },\n options.outputFormat,\n );\n\n if (options.outputPath !== undefined) {\n await writeFile(options.outputPath, rendered, \"utf8\");\n logger.info(`check output written: ${options.outputPath}`);\n }\n\n return {\n current,\n ...(baseline === undefined ? {} : { baseline }),\n ...(diff === undefined ? {} : { diff }),\n gateResult,\n rendered,\n };\n};\n\nexport { GovernanceConfigurationError };\n","import type { AnalyzeSummary } from \"@codesentinel/core\";\nimport { computeRepositoryHealthSummary } from \"@codesentinel/health-engine\";\nimport { evaluateRepositoryRisk } from \"@codesentinel/risk-engine\";\nimport { createSnapshot, type CodeSentinelSnapshot } from \"@codesentinel/reporter\";\nimport {\n collectAnalysisInputs,\n resolveHealthConfigForProfile,\n resolveRiskConfigForProfile,\n type AuthorIdentityCliMode,\n type ScoringProfileCliMode,\n} from \"./run-analyze-command.js\";\nimport type { Logger } from \"./logger.js\";\n\nexport type BuildAnalysisSnapshotOptions = {\n includeTrace: boolean;\n recentWindowDays?: number;\n scoringProfile?: ScoringProfileCliMode;\n};\n\nexport const buildAnalysisSnapshot = async (\n inputPath: string | undefined,\n authorIdentityMode: AuthorIdentityCliMode,\n options: BuildAnalysisSnapshotOptions,\n logger: Logger,\n): Promise<CodeSentinelSnapshot> => {\n const analysisInputs = await collectAnalysisInputs(\n inputPath,\n authorIdentityMode,\n {\n ...(options.recentWindowDays === undefined\n ? {}\n : { recentWindowDays: options.recentWindowDays }),\n },\n logger,\n );\n const riskConfig = resolveRiskConfigForProfile(options.scoringProfile);\n const healthConfig = resolveHealthConfigForProfile(options.scoringProfile);\n const evaluation = evaluateRepositoryRisk(\n {\n structural: analysisInputs.structural,\n evolution: analysisInputs.evolution,\n external: analysisInputs.external,\n ...(riskConfig === undefined ? {} : { config: riskConfig }),\n },\n { explain: options.includeTrace },\n );\n\n const summary: AnalyzeSummary = {\n structural: analysisInputs.structural,\n evolution: analysisInputs.evolution,\n external: analysisInputs.external,\n risk: evaluation.summary,\n health: computeRepositoryHealthSummary({\n structural: analysisInputs.structural,\n evolution: analysisInputs.evolution,\n ...(healthConfig === undefined ? {} : { config: healthConfig }),\n }),\n };\n\n return createSnapshot({\n analysis: summary,\n ...(evaluation.trace === undefined ? {} : { trace: evaluation.trace }),\n analysisConfig: {\n authorIdentityMode,\n includeTrace: options.includeTrace,\n scoringProfile: options.scoringProfile ?? \"default\",\n recentWindowDays: analysisInputs.evolution.available\n ? analysisInputs.evolution.metrics.recentWindowDays\n : (options.recentWindowDays ?? null),\n },\n });\n};\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport {\n BaselineRefResolutionError,\n GovernanceConfigurationError,\n evaluateGates,\n renderCheckMarkdown,\n resolveAutoBaselineRef,\n resolveBaselineSnapshotFromRef,\n type GateConfig,\n type GateEvaluationResult,\n} from \"@codesentinel/governance\";\nimport { relative, resolve } from \"node:path\";\nimport {\n compareSnapshots,\n createReport,\n formatReport,\n parseSnapshot,\n type CodeSentinelSnapshot,\n} from \"@codesentinel/reporter\";\nimport { buildAnalysisSnapshot } from \"./build-analysis-snapshot.js\";\nimport { createSilentLogger, type Logger } from \"./logger.js\";\nimport type { AuthorIdentityCliMode, ScoringProfileCliMode } from \"./run-analyze-command.js\";\n\nexport type RunCiCommandOptions = {\n baselinePath?: string;\n baselineRef?: string;\n baselineSha?: string;\n mainBranchCandidates?: readonly string[];\n snapshotPath?: string;\n reportPath?: string;\n jsonOutputPath?: string;\n includeTrace: boolean;\n recentWindowDays?: number;\n scoringProfile?: ScoringProfileCliMode;\n gateConfig: GateConfig;\n};\n\nexport type CiCommandResult = {\n current: CodeSentinelSnapshot;\n baseline?: CodeSentinelSnapshot;\n diff?: ReturnType<typeof compareSnapshots>;\n gateResult: GateEvaluationResult;\n markdownSummary: string;\n machineReadable: {\n current: CodeSentinelSnapshot;\n baseline?: CodeSentinelSnapshot;\n diff?: ReturnType<typeof compareSnapshots>;\n violations: GateEvaluationResult[\"violations\"];\n highestSeverity: GateEvaluationResult[\"highestSeverity\"];\n exitCode: GateEvaluationResult[\"exitCode\"];\n };\n};\n\nconst isPathOutsideBase = (value: string): boolean => {\n return value === \"..\" || value.startsWith(\"../\") || value.startsWith(\"..\\\\\");\n};\n\nexport const runCiCommand = async (\n inputPath: string | undefined,\n authorIdentityMode: AuthorIdentityCliMode,\n options: RunCiCommandOptions,\n logger: Logger = createSilentLogger(),\n): Promise<CiCommandResult> => {\n if (options.baselinePath !== undefined && options.baselineRef !== undefined) {\n throw new GovernanceConfigurationError(\n \"baseline configuration is ambiguous: use either --baseline or --baseline-ref\",\n );\n }\n if (options.baselineSha !== undefined && options.baselineRef !== \"auto\") {\n throw new GovernanceConfigurationError(\"baseline-sha requires --baseline-ref auto\");\n }\n\n const resolvedTargetPath = resolve(inputPath ?? process.cwd());\n\n logger.info(\"building current snapshot\");\n const current = await buildAnalysisSnapshot(\n inputPath,\n authorIdentityMode,\n {\n includeTrace: options.includeTrace,\n ...(options.scoringProfile === undefined ? {} : { scoringProfile: options.scoringProfile }),\n ...(options.recentWindowDays === undefined\n ? {}\n : { recentWindowDays: options.recentWindowDays }),\n },\n logger,\n );\n\n if (options.snapshotPath !== undefined) {\n await writeFile(options.snapshotPath, JSON.stringify(current, null, 2), \"utf8\");\n logger.info(`snapshot written: ${options.snapshotPath}`);\n }\n\n let baseline: CodeSentinelSnapshot | undefined;\n let diff: ReturnType<typeof compareSnapshots> | undefined;\n\n if (options.baselineRef !== undefined) {\n let baselineRef = options.baselineRef;\n if (options.baselineRef === \"auto\") {\n logger.info(\"resolving baseline ref using auto strategy\");\n try {\n const autoResolved = await resolveAutoBaselineRef({\n repositoryPath: resolvedTargetPath,\n ...(options.baselineSha === undefined ? {} : { baselineSha: options.baselineSha }),\n ...(options.mainBranchCandidates === undefined\n ? {}\n : { mainBranchCandidates: options.mainBranchCandidates }),\n environment: process.env,\n });\n logger.info(\n `baseline auto strategy selected: ${autoResolved.strategy} (${autoResolved.resolvedRef} -> ${autoResolved.resolvedSha})`,\n );\n for (const attempt of autoResolved.attempts) {\n const detail = attempt.detail === undefined ? \"\" : ` (${attempt.detail})`;\n logger.debug(\n `baseline auto attempt: ${attempt.step} ${attempt.candidate} => ${attempt.outcome}${detail}`,\n );\n }\n baselineRef = autoResolved.resolvedRef;\n } catch (error) {\n if (error instanceof BaselineRefResolutionError) {\n throw new GovernanceConfigurationError(\n `unable to resolve baseline ref 'auto': ${error.message}`,\n );\n }\n throw error;\n }\n }\n\n logger.info(`resolving baseline from git ref: ${baselineRef}`);\n try {\n const resolved = await resolveBaselineSnapshotFromRef({\n repositoryPath: resolvedTargetPath,\n baselineRef,\n analyzeWorktree: async (worktreePath, repositoryRoot) => {\n const relativeTargetPath = relative(repositoryRoot, resolvedTargetPath);\n if (isPathOutsideBase(relativeTargetPath)) {\n throw new GovernanceConfigurationError(\n `target path is outside git repository root: ${resolvedTargetPath}`,\n );\n }\n\n const baselineTargetPath =\n relativeTargetPath.length === 0 || relativeTargetPath === \".\"\n ? worktreePath\n : resolve(worktreePath, relativeTargetPath);\n\n return buildAnalysisSnapshot(\n baselineTargetPath,\n authorIdentityMode,\n {\n includeTrace: options.includeTrace,\n ...(options.scoringProfile === undefined\n ? {}\n : { scoringProfile: options.scoringProfile }),\n ...(options.recentWindowDays === undefined\n ? {}\n : { recentWindowDays: options.recentWindowDays }),\n },\n logger,\n );\n },\n });\n baseline = resolved.baselineSnapshot;\n logger.info(`baseline ref resolved to ${resolved.resolvedSha}`);\n } catch (error) {\n if (error instanceof BaselineRefResolutionError) {\n throw new GovernanceConfigurationError(\n `unable to resolve baseline ref '${baselineRef}': ${error.message}`,\n );\n }\n throw error;\n }\n diff = compareSnapshots(current, baseline);\n } else if (options.baselinePath !== undefined) {\n logger.info(`loading baseline snapshot: ${options.baselinePath}`);\n const baselineRaw = await readFile(options.baselinePath, \"utf8\");\n try {\n baseline = parseSnapshot(baselineRaw);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"invalid baseline snapshot\";\n throw new GovernanceConfigurationError(`invalid baseline snapshot: ${message}`);\n }\n diff = compareSnapshots(current, baseline);\n }\n\n const gateResult = evaluateGates({\n current,\n ...(baseline === undefined ? {} : { baseline }),\n ...(diff === undefined ? {} : { diff }),\n gateConfig: options.gateConfig,\n });\n\n const report = createReport(current, diff);\n const reportMarkdown = formatReport(report, \"md\");\n const ciMarkdown = renderCheckMarkdown(current, gateResult);\n const markdownSummary = `${reportMarkdown}\\n\\n${ciMarkdown}`;\n\n if (options.reportPath !== undefined) {\n await writeFile(options.reportPath, markdownSummary, \"utf8\");\n logger.info(`report written: ${options.reportPath}`);\n }\n\n const machineReadable = {\n current,\n ...(baseline === undefined ? {} : { baseline }),\n ...(diff === undefined ? {} : { diff }),\n violations: gateResult.violations,\n highestSeverity: gateResult.highestSeverity,\n exitCode: gateResult.exitCode,\n };\n\n if (options.jsonOutputPath !== undefined) {\n await writeFile(options.jsonOutputPath, JSON.stringify(machineReadable, null, 2), \"utf8\");\n logger.info(`ci machine output written: ${options.jsonOutputPath}`);\n }\n\n return {\n current,\n ...(baseline === undefined ? {} : { baseline }),\n ...(diff === undefined ? {} : { diff }),\n gateResult,\n markdownSummary,\n machineReadable,\n };\n};\n\nexport { GovernanceConfigurationError };\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport {\n compareSnapshots,\n createReport,\n formatReport,\n parseSnapshot,\n type CodeSentinelReport,\n type ReportFormat,\n} from \"@codesentinel/reporter\";\nimport { type AuthorIdentityCliMode, type ScoringProfileCliMode } from \"./run-analyze-command.js\";\nimport { createSilentLogger, type Logger } from \"./logger.js\";\nimport { buildAnalysisSnapshot } from \"./build-analysis-snapshot.js\";\n\nexport type ReportCommandOptions = {\n format: ReportFormat;\n comparePath?: string;\n outputPath?: string;\n snapshotPath?: string;\n includeTrace: boolean;\n recentWindowDays?: number;\n scoringProfile?: ScoringProfileCliMode;\n};\n\nexport const runReportCommand = async (\n inputPath: string | undefined,\n authorIdentityMode: AuthorIdentityCliMode,\n options: ReportCommandOptions,\n logger: Logger = createSilentLogger(),\n): Promise<{ report: CodeSentinelReport; rendered: string }> => {\n logger.info(\"building analysis snapshot\");\n const current = await buildAnalysisSnapshot(\n inputPath,\n authorIdentityMode,\n {\n includeTrace: options.includeTrace,\n ...(options.scoringProfile === undefined ? {} : { scoringProfile: options.scoringProfile }),\n ...(options.recentWindowDays === undefined\n ? {}\n : { recentWindowDays: options.recentWindowDays }),\n },\n logger,\n );\n\n if (options.snapshotPath !== undefined) {\n await writeFile(options.snapshotPath, JSON.stringify(current, null, 2), \"utf8\");\n logger.info(`snapshot written: ${options.snapshotPath}`);\n }\n\n let report: CodeSentinelReport;\n if (options.comparePath === undefined) {\n report = createReport(current);\n } else {\n logger.info(`loading baseline snapshot: ${options.comparePath}`);\n const baselineRaw = await readFile(options.comparePath, \"utf8\");\n const baseline = parseSnapshot(baselineRaw);\n const diff = compareSnapshots(current, baseline);\n report = createReport(current, diff);\n }\n\n const rendered = formatReport(report, options.format);\n\n if (options.outputPath !== undefined) {\n await writeFile(options.outputPath, rendered, \"utf8\");\n logger.info(`report written: ${options.outputPath}`);\n }\n\n return { report, rendered };\n};\n","import type { AnalyzeSummary, RiskTrace, TargetTrace } from \"@codesentinel/core\";\nimport { computeRepositoryHealthSummary } from \"@codesentinel/health-engine\";\nimport { evaluateRepositoryRisk } from \"@codesentinel/risk-engine\";\nimport {\n collectAnalysisInputs,\n resolveHealthConfigForProfile,\n resolveRiskConfigForProfile,\n type AuthorIdentityCliMode,\n type ScoringProfileCliMode,\n} from \"./run-analyze-command.js\";\nimport { createSilentLogger, type Logger } from \"./logger.js\";\n\nexport type ExplainFormat = \"text\" | \"json\" | \"md\";\n\nexport type ExplainCommandOptions = {\n file?: string;\n module?: string;\n top: number;\n format: ExplainFormat;\n recentWindowDays?: number;\n scoringProfile?: ScoringProfileCliMode;\n};\n\nexport type ExplainResult = {\n summary: AnalyzeSummary;\n trace: RiskTrace;\n selectedTargets: readonly TargetTrace[];\n};\n\nconst selectTargets = (\n trace: RiskTrace,\n summary: AnalyzeSummary,\n options: ExplainCommandOptions,\n): readonly TargetTrace[] => {\n if (options.file !== undefined) {\n const normalized = options.file.replaceAll(\"\\\\\", \"/\");\n return trace.targets.filter(\n (target) => target.targetType === \"file\" && target.targetId === normalized,\n );\n }\n\n if (options.module !== undefined) {\n return trace.targets.filter(\n (target) => target.targetType === \"module\" && target.targetId === options.module,\n );\n }\n\n const top = Math.max(1, options.top);\n const topFiles = summary.risk.hotspots.slice(0, top).map((entry) => entry.file);\n const fileSet = new Set(topFiles);\n return trace.targets.filter(\n (target) =>\n target.targetType === \"repository\" ||\n (target.targetType === \"file\" && fileSet.has(target.targetId)),\n );\n};\n\nexport const runExplainCommand = async (\n inputPath: string | undefined,\n authorIdentityMode: AuthorIdentityCliMode,\n options: ExplainCommandOptions,\n logger: Logger = createSilentLogger(),\n): Promise<ExplainResult> => {\n const analysisInputs = await collectAnalysisInputs(\n inputPath,\n authorIdentityMode,\n {\n ...(options.recentWindowDays === undefined\n ? {}\n : { recentWindowDays: options.recentWindowDays }),\n },\n logger,\n );\n logger.info(\"computing explainable risk summary\");\n\n const riskConfig = resolveRiskConfigForProfile(options.scoringProfile);\n const healthConfig = resolveHealthConfigForProfile(options.scoringProfile);\n const evaluation = evaluateRepositoryRisk(\n {\n structural: analysisInputs.structural,\n evolution: analysisInputs.evolution,\n external: analysisInputs.external,\n ...(riskConfig === undefined ? {} : { config: riskConfig }),\n },\n { explain: true },\n );\n if (evaluation.trace === undefined) {\n throw new Error(\"risk trace unavailable\");\n }\n\n const summary: AnalyzeSummary = {\n structural: analysisInputs.structural,\n evolution: analysisInputs.evolution,\n external: analysisInputs.external,\n risk: evaluation.summary,\n health: computeRepositoryHealthSummary({\n structural: analysisInputs.structural,\n evolution: analysisInputs.evolution,\n ...(healthConfig === undefined ? {} : { config: healthConfig }),\n }),\n };\n logger.info(\n `explanation completed (riskScore=${summary.risk.riskScore}, healthScore=${summary.health.healthScore})`,\n );\n\n return {\n summary,\n trace: evaluation.trace,\n selectedTargets: selectTargets(evaluation.trace, summary, options),\n };\n};\n"],"mappings":"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","names":["join","packageJsonPath","version","deletedAny","withDefaults","splitIndex","name","requested","mapWithConcurrency","ONE_DAY_MS","MAX_RETRIES","RETRY_BASE_DELAY_MS","round4","round4","join","stdout","readFileSync","readFile","writeFile","dirname","resolve","toHealthTier","factorLabelById","repositoryDimensionScores","createSummaryShape","mkdir","readFile","writeFile","homedir","join","parseSemver","resolve","spawn","stderr","stdin","clearScreenDown","cursorTo","emitKeypressEvents","ANSI","ANSI","stderr","cursorTo","clearScreenDown","hideCursor","showCursor","stdin","resolve","emitKeypressEvents","scriptPath","spawn","resolve","resolve","nodeLowLink","program","round4","round4","normalizePath","ownershipDistributionPenalty","ownershipDistributionFactors","modularityHealth","changeHygieneHealth","testHealthScore","ownershipDistributionHealth","normalizedScore","topIssues","round4","average","normalizePath","resolve","readFile","writeFile","readFile","writeFile","readFile","writeFile","relative","resolve","resolve","writeFile","relative","readFile","readFile","writeFile","writeFile","readFile","resolve","dirname","readFileSync","writeFile","readFile"]}
|