yowtf 0.1.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/LICENSE +21 -0
- package/README.md +1605 -0
- package/dist/chunk-2PCP3AKH.js +5976 -0
- package/dist/chunk-2PCP3AKH.js.map +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +14 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +1337 -0
- package/dist/index.js +286 -0
- package/dist/index.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/errors.ts","../src/domain/category.ts","../src/platform/command.ts","../src/platform/linux.ts","../src/platform/macos.ts","../src/platform/unsupported.ts","../src/platform/windows.ts","../src/platform/detector.ts","../src/scoring/index.ts","../src/reporting/model.ts","../src/domain/confidence.ts","../src/domain/rule-id.ts","../src/domain/severity.ts","../src/domain/status.ts","../src/domain/findings/finding.ts","../src/detection/engine.ts","../src/detection/rules/utils.ts","../src/detection/rules/system/index.ts","../src/detection/rules/disk/index.ts","../src/detection/rules/processes/index.ts","../src/detection/rules/ports/index.ts","../src/detection/rules/network/index.ts","../src/detection/rules/environment/index.ts","../src/detection/rules/runtimes/index.ts","../src/detection/rules/tools/index.ts","../src/detection/rules/paths/index.ts","../src/detection/rules/versions/index.ts","../src/detection/rules/project/index.ts","../src/detection/rules/dependencies/index.ts","../src/detection/rules/git/index.ts","../src/detection/rules/configuration/index.ts","../src/detection/rules/caches/index.ts","../src/detection/rules/all.ts","../src/detection/registry.ts","../src/application/services/detection.service.ts","../src/cli/path.ts","../src/collection/project/discovery.ts","../src/collection/project/project-collector.ts","../src/application/services/project-collection.service.ts","../src/collection/system/system-collector.ts","../src/application/services/system-collection.service.ts","../src/application/services/scan-orchestrator.service.ts","../src/application/index.ts","../src/reporting/json.ts","../src/reporting/terminal.ts","../src/cli/dispatch.ts","../src/cli/options.ts","../src/cli/cli.ts","../src/cli/commands/core.ts","../src/cli/commands/workstation.ts","../src/cli/commands/environment.ts","../src/cli/commands/project.ts","../src/cli/commands/storage.ts","../src/cli/commands/index.ts"],"sourcesContent":["/**\n * CLI Error types and exit codes.\n * Adheres to docs/CLI-SPEC.md Section 48 & Section 55.\n */\n\nexport const EXIT_SUCCESS = 0;\nexport const EXIT_APPLICATION_ERROR = 1;\nexport const EXIT_USAGE_ERROR = 2;\n\nexport class CliError extends Error {\n public readonly exitCode: number;\n\n constructor(message: string, exitCode = EXIT_APPLICATION_ERROR) {\n super(message);\n this.name = 'CliError';\n this.exitCode = exitCode;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class CliUsageError extends CliError {\n constructor(message: string) {\n super(message, EXIT_USAGE_ERROR);\n this.name = 'CliUsageError';\n }\n}\n\n/**\n * Formats an error into a clean, human-readable message without exposing raw stack traces or secrets.\n */\nexport function formatCliError(error: unknown): string {\n if (error instanceof CliError) {\n return `error: ${error.message}`;\n }\n\n if (error instanceof Error) {\n return `error: ${error.message}`;\n }\n\n return `error: ${String(error)}`;\n}\n","/**\n * Authoritative diagnostic categories.\n * Adheres to docs/RULE-CATALOGUE.md Section 12 and docs/DETECTION-ENGINE.md Section 12.\n */\n\nexport const DIAGNOSTIC_CATEGORIES = [\n 'system',\n 'disk',\n 'process',\n 'port',\n 'network',\n 'environment',\n 'runtime',\n 'tool',\n 'path',\n 'version',\n 'project',\n 'dependency',\n 'git',\n 'config',\n 'cache',\n] as const;\n\nexport type DiagnosticCategory = (typeof DIAGNOSTIC_CATEGORIES)[number];\n\n// Canonical aliases for compatibility\nexport const CANONICAL_DIAGNOSTIC_CATEGORIES = DIAGNOSTIC_CATEGORIES;\nexport type CanonicalDiagnosticCategory = DiagnosticCategory;\n\nconst CATEGORY_SET: ReadonlySet<string> = new Set(DIAGNOSTIC_CATEGORIES);\n\n/**\n * Type guard for DiagnosticCategory.\n * Strictly verifies against the 15 authoritative diagnostic categories.\n */\nexport function isDiagnosticCategory(value: unknown): value is DiagnosticCategory {\n return typeof value === 'string' && CATEGORY_SET.has(value);\n}\n","import { execFile } from 'node:child_process';\nimport type { SafeCommandOptions, SafeCommandResult } from './types.js';\n\nconst DEFAULT_TIMEOUT_MS = 5000;\nconst MAX_BUFFER_BYTES = 1024 * 1024; // 1MB\n\nexport class CommandExecutionError extends Error {\n public readonly exitCode: number | null;\n public readonly stdout: string;\n public readonly stderr: string;\n public readonly killed: boolean;\n\n constructor(\n message: string,\n options: {\n exitCode: number | null;\n stdout: string;\n stderr: string;\n killed: boolean;\n cause?: unknown;\n },\n ) {\n super(message, { cause: options.cause });\n this.name = 'CommandExecutionError';\n this.exitCode = options.exitCode;\n this.stdout = options.stdout;\n this.stderr = options.stderr;\n this.killed = options.killed;\n }\n}\n\n/**\n * Executes a command safely without shell expansion.\n * Strictly non-interactive and read-only.\n */\nexport async function executeSafeCommand(\n file: string,\n args: readonly string[] = [],\n options: SafeCommandOptions = {},\n): Promise<SafeCommandResult> {\n const timeoutMs =\n options.timeoutMs !== undefined && options.timeoutMs > 0\n ? options.timeoutMs\n : DEFAULT_TIMEOUT_MS;\n const start = Date.now();\n\n return new Promise((resolve, reject) => {\n execFile(\n file,\n [...args],\n {\n timeout: timeoutMs,\n maxBuffer: MAX_BUFFER_BYTES,\n cwd: options.cwd,\n env: options.env,\n windowsHide: true,\n },\n (error, stdout, stderr) => {\n const durationMs = Date.now() - start;\n const outStr = String(stdout ?? '');\n const errStr = String(stderr ?? '');\n\n if (error) {\n // Process exited with non-zero or was killed / timed out\n const exitCode = typeof error.code === 'number' ? error.code : 1;\n const killed = error.killed ?? false;\n\n // If command simply returned a non-zero exit code, return as result\n if (typeof error.code === 'number' && !error.killed) {\n resolve({\n stdout: outStr,\n stderr: errStr,\n exitCode,\n killed: false,\n durationMs,\n });\n return;\n }\n\n reject(\n new CommandExecutionError(error.message, {\n exitCode: typeof error.code === 'number' ? error.code : null,\n stdout: outStr,\n stderr: errStr,\n killed,\n cause: error,\n }),\n );\n return;\n }\n\n resolve({\n stdout: outStr,\n stderr: errStr,\n exitCode: 0,\n killed: false,\n durationMs,\n });\n },\n );\n });\n}\n","import os from 'node:os';\nimport { executeSafeCommand } from './command.js';\nimport type { CpuInfo, MemoryInfo, PlatformAdapter, PlatformInfo, UptimeInfo } from './types.js';\n\nexport interface LinuxSystemProvider {\n arch(): string;\n release(): string;\n hostname(): string;\n totalmem(): number;\n freemem(): number;\n cpus(): os.CpuInfo[];\n uptime(): number;\n}\n\nexport class LinuxPlatformAdapter implements PlatformAdapter {\n public readonly platformType = 'linux' as const;\n public readonly isSupported = true;\n\n constructor(private readonly provider: LinuxSystemProvider = os) {}\n\n public getPlatformInfo(): PlatformInfo {\n return {\n platform: 'linux',\n isSupported: true,\n os: 'linux',\n arch: this.provider.arch(),\n release: this.provider.release(),\n hostname: this.provider.hostname(),\n };\n }\n\n public getMemoryInfo(): MemoryInfo {\n const totalBytes = this.provider.totalmem();\n const freeBytes = this.provider.freemem();\n const usedBytes = Math.max(0, totalBytes - freeBytes);\n const utilizationPercent =\n totalBytes > 0 ? Number(((usedBytes / totalBytes) * 100).toFixed(1)) : 0;\n\n return {\n totalBytes,\n freeBytes,\n usedBytes,\n utilizationPercent,\n };\n }\n\n public getCpuInfo(): CpuInfo {\n const cpus = this.provider.cpus();\n const cores = cpus.length;\n const model = cpus[0]?.model ?? 'Unknown CPU';\n const speedMHz = cpus[0]?.speed;\n\n let totalBusy = 0;\n let totalTime = 0;\n\n for (const cpu of cpus) {\n const times = cpu.times;\n const coreTotal = times.user + times.nice + times.sys + times.idle + times.irq;\n const coreBusy = coreTotal - times.idle;\n totalBusy += coreBusy;\n totalTime += coreTotal;\n }\n\n const utilizationPercent =\n totalTime > 0 ? Number(((totalBusy / totalTime) * 100).toFixed(1)) : 0;\n\n return {\n model,\n cores,\n speedMHz,\n utilizationPercent,\n };\n }\n\n public getUptimeInfo(): UptimeInfo {\n return {\n uptimeSeconds: Math.floor(this.provider.uptime()),\n };\n }\n\n public async isCommandAvailable(command: string): Promise<boolean> {\n try {\n const result = await executeSafeCommand('which', [command], { timeoutMs: 3000 });\n return result.exitCode === 0;\n } catch {\n return false;\n }\n }\n}\n","import os from 'node:os';\nimport { executeSafeCommand } from './command.js';\nimport type { CpuInfo, MemoryInfo, PlatformAdapter, PlatformInfo, UptimeInfo } from './types.js';\n\nexport interface DarwinSystemProvider {\n arch(): string;\n release(): string;\n hostname(): string;\n totalmem(): number;\n freemem(): number;\n cpus(): os.CpuInfo[];\n uptime(): number;\n}\n\nexport class MacOSPlatformAdapter implements PlatformAdapter {\n public readonly platformType = 'macos' as const;\n public readonly isSupported = true;\n\n constructor(private readonly provider: DarwinSystemProvider = os) {}\n\n public getPlatformInfo(): PlatformInfo {\n return {\n platform: 'macos',\n isSupported: true,\n os: 'darwin',\n arch: this.provider.arch(),\n release: this.provider.release(),\n hostname: this.provider.hostname(),\n };\n }\n\n public getMemoryInfo(): MemoryInfo {\n const totalBytes = this.provider.totalmem();\n const freeBytes = this.provider.freemem();\n const usedBytes = Math.max(0, totalBytes - freeBytes);\n const utilizationPercent =\n totalBytes > 0 ? Number(((usedBytes / totalBytes) * 100).toFixed(1)) : 0;\n\n return {\n totalBytes,\n freeBytes,\n usedBytes,\n utilizationPercent,\n };\n }\n\n public getCpuInfo(): CpuInfo {\n const cpus = this.provider.cpus();\n const cores = cpus.length;\n const model = cpus[0]?.model ?? 'Unknown CPU';\n const speedMHz = cpus[0]?.speed;\n\n let totalBusy = 0;\n let totalTime = 0;\n\n for (const cpu of cpus) {\n const times = cpu.times;\n const coreTotal = times.user + times.nice + times.sys + times.idle + times.irq;\n const coreBusy = coreTotal - times.idle;\n totalBusy += coreBusy;\n totalTime += coreTotal;\n }\n\n const utilizationPercent =\n totalTime > 0 ? Number(((totalBusy / totalTime) * 100).toFixed(1)) : 0;\n\n return {\n model,\n cores,\n speedMHz,\n utilizationPercent,\n };\n }\n\n public getUptimeInfo(): UptimeInfo {\n return {\n uptimeSeconds: Math.floor(this.provider.uptime()),\n };\n }\n\n public async isCommandAvailable(command: string): Promise<boolean> {\n try {\n const result = await executeSafeCommand('which', [command], { timeoutMs: 3000 });\n return result.exitCode === 0;\n } catch {\n return false;\n }\n }\n}\n","import os from 'node:os';\nimport type { CpuInfo, MemoryInfo, PlatformAdapter, PlatformInfo, UptimeInfo } from './types.js';\n\nexport interface UnsupportedSystemProvider {\n platform(): NodeJS.Platform;\n arch(): string;\n release(): string;\n hostname(): string;\n totalmem(): number;\n freemem(): number;\n cpus(): os.CpuInfo[];\n uptime(): number;\n}\n\nexport class UnsupportedPlatformAdapter implements PlatformAdapter {\n public readonly platformType = 'unsupported' as const;\n public readonly isSupported = false;\n\n constructor(private readonly provider: UnsupportedSystemProvider = os) {}\n\n public getPlatformInfo(): PlatformInfo {\n return {\n platform: 'unsupported',\n isSupported: false,\n os: this.provider.platform(),\n arch: this.provider.arch(),\n release: this.provider.release(),\n hostname: this.provider.hostname(),\n };\n }\n\n public getMemoryInfo(): MemoryInfo {\n const totalBytes = this.provider.totalmem();\n const freeBytes = this.provider.freemem();\n const usedBytes = Math.max(0, totalBytes - freeBytes);\n const utilizationPercent =\n totalBytes > 0 ? Number(((usedBytes / totalBytes) * 100).toFixed(1)) : 0;\n\n return {\n totalBytes,\n freeBytes,\n usedBytes,\n utilizationPercent,\n };\n }\n\n public getCpuInfo(): CpuInfo {\n const cpus = this.provider.cpus();\n const cores = cpus.length;\n const model = cpus[0]?.model ?? 'Unknown CPU';\n const speedMHz = cpus[0]?.speed;\n\n return {\n model,\n cores,\n speedMHz,\n utilizationPercent: undefined,\n };\n }\n\n public getUptimeInfo(): UptimeInfo {\n return {\n uptimeSeconds: Math.floor(this.provider.uptime()),\n };\n }\n\n public async isCommandAvailable(_command: string): Promise<boolean> {\n return false;\n }\n}\n","import os from 'node:os';\nimport { executeSafeCommand } from './command.js';\nimport type { CpuInfo, MemoryInfo, PlatformAdapter, PlatformInfo, UptimeInfo } from './types.js';\n\nexport interface WindowsSystemProvider {\n arch(): string;\n release(): string;\n hostname(): string;\n totalmem(): number;\n freemem(): number;\n cpus(): os.CpuInfo[];\n uptime(): number;\n}\n\nexport class WindowsPlatformAdapter implements PlatformAdapter {\n public readonly platformType = 'windows' as const;\n public readonly isSupported = true;\n\n constructor(private readonly provider: WindowsSystemProvider = os) {}\n\n public getPlatformInfo(): PlatformInfo {\n return {\n platform: 'windows',\n isSupported: true,\n os: 'win32',\n arch: this.provider.arch(),\n release: this.provider.release(),\n hostname: this.provider.hostname(),\n };\n }\n\n public getMemoryInfo(): MemoryInfo {\n const totalBytes = this.provider.totalmem();\n const freeBytes = this.provider.freemem();\n const usedBytes = Math.max(0, totalBytes - freeBytes);\n const utilizationPercent =\n totalBytes > 0 ? Number(((usedBytes / totalBytes) * 100).toFixed(1)) : 0;\n\n return {\n totalBytes,\n freeBytes,\n usedBytes,\n utilizationPercent,\n };\n }\n\n public getCpuInfo(): CpuInfo {\n const cpus = this.provider.cpus();\n const cores = cpus.length;\n const model = cpus[0]?.model ?? 'Unknown CPU';\n const speedMHz = cpus[0]?.speed;\n\n let totalBusy = 0;\n let totalTime = 0;\n\n for (const cpu of cpus) {\n const times = cpu.times;\n const coreTotal = times.user + times.nice + times.sys + times.idle + times.irq;\n const coreBusy = coreTotal - times.idle;\n totalBusy += coreBusy;\n totalTime += coreTotal;\n }\n\n const utilizationPercent =\n totalTime > 0 ? Number(((totalBusy / totalTime) * 100).toFixed(1)) : 0;\n\n return {\n model,\n cores,\n speedMHz,\n utilizationPercent,\n };\n }\n\n public getUptimeInfo(): UptimeInfo {\n return {\n uptimeSeconds: Math.floor(this.provider.uptime()),\n };\n }\n\n public async isCommandAvailable(command: string): Promise<boolean> {\n try {\n const result = await executeSafeCommand('where', [command], { timeoutMs: 3000 });\n return result.exitCode === 0;\n } catch {\n return false;\n }\n }\n}\n","import process from 'node:process';\nimport { LinuxPlatformAdapter } from './linux.js';\nimport { MacOSPlatformAdapter } from './macos.js';\nimport type { PlatformAdapter, PlatformType, SupportedPlatform } from './types.js';\nimport { UnsupportedPlatformAdapter } from './unsupported.js';\nimport { WindowsPlatformAdapter } from './windows.js';\n\nexport const SUPPORTED_PLATFORMS: readonly SupportedPlatform[] = [\n 'windows',\n 'macos',\n 'linux',\n] as const;\n\n/**\n * Normalizes an operating system platform identifier into a PlatformType.\n * Defaults to current process.platform if none is supplied.\n */\nexport function detectPlatform(osPlatform: string = process.platform): PlatformType {\n switch (osPlatform) {\n case 'win32':\n return 'windows';\n case 'darwin':\n return 'macos';\n case 'linux':\n return 'linux';\n default:\n return 'unsupported';\n }\n}\n\n/**\n * Checks whether an operating system platform identifier is supported.\n */\nexport function isSupportedPlatform(osPlatform: string = process.platform): boolean {\n return detectPlatform(osPlatform) !== 'unsupported';\n}\n\n/**\n * Factory that returns the appropriate PlatformAdapter for the given platform.\n * Defaults to process.platform.\n */\nexport function resolvePlatformAdapter(osPlatform: string = process.platform): PlatformAdapter {\n const platformType = detectPlatform(osPlatform);\n\n switch (platformType) {\n case 'windows':\n return new WindowsPlatformAdapter();\n case 'macos':\n return new MacOSPlatformAdapter();\n case 'linux':\n return new LinuxPlatformAdapter();\n case 'unsupported':\n return new UnsupportedPlatformAdapter();\n }\n}\n","import type { Finding } from '../domain/index.js';\nimport type { FindingSeverity } from '../domain/severity.js';\n\n/**\n * Authoritative score bands.\n * Adheres to docs/SCORING.md Section 28.\n */\nexport const SCORE_BANDS = ['EXCELLENT', 'GOOD', 'FAIR', 'POOR', 'CRITICAL'] as const;\nexport type ScoreBand = (typeof SCORE_BANDS)[number];\n\n/**\n * Base severity penalties.\n * Adheres to docs/SCORING.md Section 8 & 57.\n */\nexport const BASE_SEVERITY_PENALTIES: Readonly<Record<FindingSeverity, number>> = Object.freeze({\n CRITICAL: 25,\n HIGH: 15,\n MEDIUM: 8,\n LOW: 3,\n INFO: 0,\n});\n\nexport const SEVERITY_PENALTIES = BASE_SEVERITY_PENALTIES;\nexport const WARN_PENALTY_MULTIPLIER = 0.5;\n\n/**\n * Detailed penalty assigned to an individual deduplicated finding.\n */\nexport interface FindingPenalty {\n readonly ruleId: string;\n readonly severity: FindingSeverity;\n readonly status: Finding['status'];\n readonly penalty: number;\n}\n\n/**\n * Complete health score result model.\n * Adheres to docs/SCORING.md Section 3, 28, 38, & 55.\n */\nexport interface ScoreResult {\n readonly score: number;\n readonly rawScore: number;\n readonly band: ScoreBand;\n readonly totalPenalty: number;\n readonly penalties: readonly FindingPenalty[];\n readonly totalFindings: number;\n readonly criticalCount: number;\n readonly highCount: number;\n readonly mediumCount: number;\n readonly lowCount: number;\n readonly infoCount: number;\n readonly failCount: number;\n readonly warnCount: number;\n readonly passCount: number;\n}\n\n// Backward compatibility alias for foundational interface\nexport type HealthScore = ScoreResult;\n\nexport interface ScoreCalculator {\n calculate(findings: readonly Finding[]): ScoreResult;\n}\n\n/**\n * Determines the score band from the final clamped and rounded score.\n * Adheres to docs/SCORING.md Section 28 & 29.\n *\n * 90-100: EXCELLENT\n * 75-89: GOOD\n * 60-74: FAIR\n * 40-59: POOR\n * 0-39: CRITICAL\n */\nexport function getScoreBand(score: number): ScoreBand {\n if (score >= 90) return 'EXCELLENT';\n if (score >= 75) return 'GOOD';\n if (score >= 60) return 'FAIR';\n if (score >= 40) return 'POOR';\n return 'CRITICAL';\n}\n\nfunction getPenaltyForFinding(finding: Finding): number {\n const base = BASE_SEVERITY_PENALTIES[finding.severity] ?? 0;\n if (finding.status === 'FAIL') return base;\n if (finding.status === 'WARN') return base * WARN_PENALTY_MULTIPLIER;\n return 0;\n}\n\n/**\n * Calculates deterministic health score from diagnostic findings.\n * Adheres strictly to docs/SCORING.md:\n * - Starting score = 100\n * - Deduplication by stable ruleId (retains highest penalty among duplicates)\n * - FAIL: base penalty (CRITICAL: 25, HIGH: 15, MEDIUM: 8, LOW: 3, INFO: 0)\n * - WARN: 50% of base penalty (CRITICAL: 12.5, HIGH: 7.5, MEDIUM: 4, LOW: 1.5, INFO: 0)\n * - PASS, SKIPPED, UNAVAILABLE, ERROR: 0 penalty\n * - No confidence multiplier\n * - Final score clamped to 0-100 and rounded to nearest integer\n */\nexport function calculateScore(findings: readonly Finding[]): ScoreResult {\n // Deduplicate by stable ruleId, keeping highest penalty (docs/SCORING.md Section 14)\n const uniqueFindingsMap = new Map<string, Finding>();\n for (const finding of findings) {\n const existing = uniqueFindingsMap.get(finding.ruleId);\n if (!existing) {\n uniqueFindingsMap.set(finding.ruleId, finding);\n } else {\n const existingPenalty = getPenaltyForFinding(existing);\n const currentPenalty = getPenaltyForFinding(finding);\n if (currentPenalty > existingPenalty) {\n uniqueFindingsMap.set(finding.ruleId, finding);\n }\n }\n }\n\n const uniqueFindings = Array.from(uniqueFindingsMap.values());\n const penalties: FindingPenalty[] = [];\n\n let totalPenalty = 0;\n let criticalCount = 0;\n let highCount = 0;\n let mediumCount = 0;\n let lowCount = 0;\n let infoCount = 0;\n let failCount = 0;\n let warnCount = 0;\n let passCount = 0;\n\n for (const finding of uniqueFindings) {\n const base = BASE_SEVERITY_PENALTIES[finding.severity] ?? 0;\n let penalty = 0;\n\n if (finding.status === 'FAIL') {\n penalty = base;\n failCount += 1;\n } else if (finding.status === 'WARN') {\n penalty = base * WARN_PENALTY_MULTIPLIER;\n warnCount += 1;\n } else if (finding.status === 'PASS') {\n passCount += 1;\n }\n\n if (finding.severity === 'CRITICAL') criticalCount += 1;\n else if (finding.severity === 'HIGH') highCount += 1;\n else if (finding.severity === 'MEDIUM') mediumCount += 1;\n else if (finding.severity === 'LOW') lowCount += 1;\n else if (finding.severity === 'INFO') infoCount += 1;\n\n penalties.push({\n ruleId: finding.ruleId,\n severity: finding.severity,\n status: finding.status,\n penalty,\n });\n\n totalPenalty += penalty;\n }\n\n const rawScore = 100 - totalPenalty;\n const clampedScore = Math.max(0, Math.min(100, rawScore));\n const finalScore = Math.round(clampedScore);\n const band = getScoreBand(finalScore);\n\n return {\n score: finalScore,\n rawScore,\n band,\n totalPenalty,\n penalties: Object.freeze(penalties),\n totalFindings: uniqueFindings.length,\n criticalCount,\n highCount,\n mediumCount,\n lowCount,\n infoCount,\n failCount,\n warnCount,\n passCount,\n };\n}\n\n/**\n * Default score calculator implementation.\n */\nexport class DefaultScoreCalculator implements ScoreCalculator {\n public calculate(findings: readonly Finding[]): ScoreResult {\n return calculateScore(findings);\n }\n}\n","import type { DiagnosticCategory } from '../domain/category.js';\nimport type { DetectionResult } from '../domain/detection-result.js';\nimport type { FindingStatus } from '../domain/status.js';\nimport type { ScoreResult } from '../scoring/index.js';\nimport type { DiagnosticCoverage, ReportMetadata, ReportModel } from './types.js';\n\nexport interface CreateReportModelOptions {\n readonly command: string;\n readonly targetPath: string;\n readonly scope: string;\n readonly category?: DiagnosticCategory;\n readonly score?: ScoreResult;\n readonly tool?: string;\n readonly version?: string;\n}\n\n/**\n * Assembles a canonical ReportModel from detection results, coverage, and metadata.\n * Adheres to docs/CLI-SPEC.md Section 46 and docs/SCORING.md Section 38.\n */\nexport function createReportModel(\n detectionResult: DetectionResult,\n options: CreateReportModelOptions,\n): ReportModel {\n const { findings, executedRules, skippedRules, unavailableRules, errors } = detectionResult;\n\n const passed = findings.filter((f) => f.status === 'PASS').length;\n const failed = findings.filter((f) => f.status === 'FAIL').length;\n const warned = findings.filter((f) => f.status === 'WARN').length;\n const findingUnavailable = findings.filter((f) => f.status === 'UNAVAILABLE').length;\n const unavailable = Math.max(unavailableRules.length, findingUnavailable);\n const findingErrored = findings.filter((f) => f.status === 'ERROR').length;\n const errored = Math.max(errors.length, findingErrored);\n const skipped = skippedRules.length;\n const executed = executedRules.length;\n const totalRules = executed + skipped + unavailableRules.length;\n\n const coverage: DiagnosticCoverage = {\n totalRules,\n executed,\n passed,\n failed,\n warned,\n skipped,\n unavailable,\n errored,\n };\n\n let status: FindingStatus = 'PASS';\n if (failed > 0) {\n status = 'FAIL';\n } else if (warned > 0) {\n status = 'WARN';\n } else if (errored > 0) {\n status = 'ERROR';\n } else if (passed > 0) {\n status = 'PASS';\n } else if (unavailable > 0) {\n status = 'UNAVAILABLE';\n }\n\n const metadata: ReportMetadata = {\n tool: options.tool ?? 'yowtf',\n version: options.version ?? '0.1.0',\n command: options.command,\n targetPath: options.targetPath,\n scope: options.scope,\n category: options.category,\n };\n\n return {\n metadata,\n status,\n score: options.score,\n findings,\n coverage,\n };\n}\n","/**\n * Authoritative diagnostic confidence levels.\n * Adheres to docs/DETECTION-ENGINE.md Section 31-32.\n *\n * Confidence communicates certainty; it does NOT directly modify scoring penalties.\n */\n\nexport const FINDING_CONFIDENCES = ['HIGH', 'MEDIUM', 'LOW'] as const;\n\nexport type FindingConfidence = (typeof FINDING_CONFIDENCES)[number];\n\n/**\n * Type guard for FindingConfidence.\n */\nexport function isFindingConfidence(value: unknown): value is FindingConfidence {\n return typeof value === 'string' && (FINDING_CONFIDENCES as readonly string[]).includes(value);\n}\n","/**\n * Rule Identifier contract and validation.\n * Adheres to docs/RULE-CATALOGUE.md Section 4 and docs/DETECTION-ENGINE.md Section 11.\n *\n * Rule IDs are lowercase, dot-separated identifiers in the canonical format:\n * <category>.<subject>.<condition>\n */\n\nconst RULE_ID_REGEX = /^[a-z0-9-]+(\\.[a-z0-9-]+)+$/;\n\nexport interface ParsedRuleId {\n readonly category: string;\n readonly segments: readonly string[];\n readonly subject?: string;\n readonly condition?: string;\n}\n\n/**\n * Validates whether a string matches the canonical Rule ID format.\n * Lowercase, dot-separated identifier with at least two segments.\n */\nexport function isValidRuleId(id: string): boolean {\n return typeof id === 'string' && RULE_ID_REGEX.test(id);\n}\n\n/**\n * Parses a Rule ID into its component parts.\n * Returns null if the Rule ID is invalid.\n */\nexport function parseRuleId(id: string): ParsedRuleId | null {\n if (!isValidRuleId(id)) {\n return null;\n }\n\n const parts = id.split('.');\n const category = parts[0];\n if (!category) {\n return null;\n }\n const segments = Object.freeze(parts.slice(1));\n\n return {\n category,\n segments,\n ...(parts.length > 2 ? { subject: parts.slice(1, -1).join('.') } : {}),\n ...(parts.length > 1 ? { condition: parts[parts.length - 1] } : {}),\n };\n}\n","/**\n * Authoritative diagnostic severity levels.\n * Adheres to docs/DETECTION-ENGINE.md Section 32 and docs/SCORING.md Section 7.\n *\n * Severity describes diagnostic impact; scoring calculations belong in the scoring layer.\n */\n\nexport const FINDING_SEVERITIES = ['CRITICAL', 'HIGH', 'MEDIUM', 'LOW', 'INFO'] as const;\n\nexport type FindingSeverity = (typeof FINDING_SEVERITIES)[number];\n\n/**\n * Type guard for FindingSeverity.\n */\nexport function isFindingSeverity(value: unknown): value is FindingSeverity {\n return typeof value === 'string' && (FINDING_SEVERITIES as readonly string[]).includes(value);\n}\n","/**\n * Authoritative diagnostic finding statuses.\n * Adheres to docs/DETECTION-ENGINE.md Section 17-23 and docs/SCORING.md Section 9.\n */\n\nexport const FINDING_STATUSES = [\n 'PASS',\n 'FAIL',\n 'WARN',\n 'SKIPPED',\n 'UNAVAILABLE',\n 'ERROR',\n] as const;\n\nexport type FindingStatus = (typeof FINDING_STATUSES)[number];\n\n/**\n * Type guard for FindingStatus.\n */\nexport function isFindingStatus(value: unknown): value is FindingStatus {\n return typeof value === 'string' && (FINDING_STATUSES as readonly string[]).includes(value);\n}\n","import type { DiagnosticCategory } from '../category.js';\nimport { isDiagnosticCategory } from '../category.js';\nimport type { FindingConfidence } from '../confidence.js';\nimport { isFindingConfidence } from '../confidence.js';\nimport type { FindingEvidence } from '../evidence.js';\nimport { isValidRuleId } from '../rule-id.js';\nimport type { FindingSeverity } from '../severity.js';\nimport { isFindingSeverity } from '../severity.js';\nimport type { FindingStatus } from '../status.js';\nimport { isFindingStatus } from '../status.js';\n\n/**\n * Authoritative diagnostic finding model.\n * Adheres to docs/DETECTION-ENGINE.md Section 24.\n */\nexport interface Finding {\n readonly ruleId: string;\n readonly category: DiagnosticCategory;\n readonly status: FindingStatus;\n readonly severity: FindingSeverity;\n readonly confidence: FindingConfidence;\n readonly title: string;\n readonly summary: string;\n readonly explanation?: string;\n readonly impact?: string;\n readonly remediationHint?: string;\n readonly evidence?: FindingEvidence;\n}\n\nexport interface CreateFindingParams {\n readonly ruleId: string;\n readonly category: DiagnosticCategory;\n readonly status: FindingStatus;\n readonly severity: FindingSeverity;\n readonly confidence: FindingConfidence;\n readonly title: string;\n readonly summary: string;\n readonly explanation?: string;\n readonly impact?: string;\n readonly remediationHint?: string;\n readonly evidence?: FindingEvidence;\n}\n\nfunction deepFreezeEvidence(evidence?: FindingEvidence): FindingEvidence | undefined {\n if (!evidence) {\n return undefined;\n }\n\n const frozenItems = evidence.items.map((item) => {\n const frozenItem = {\n ...item,\n ...(item.metadata ? { metadata: Object.freeze({ ...item.metadata }) } : {}),\n };\n return Object.freeze(frozenItem);\n });\n\n const frozenEvidence: FindingEvidence = {\n items: Object.freeze(frozenItems),\n ...(evidence.details ? { details: Object.freeze({ ...evidence.details }) } : {}),\n };\n\n return Object.freeze(frozenEvidence);\n}\n\n/**\n * Creates and validates an immutable Finding object.\n * Rejects structurally invalid parameters and enforces deep immutability.\n */\nexport function createFinding(params: CreateFindingParams): Finding {\n if (!isValidRuleId(params.ruleId)) {\n throw new Error(\n `Invalid ruleId: '${params.ruleId}'. Must follow lowercase dot-separated format`,\n );\n }\n\n if (!isDiagnosticCategory(params.category)) {\n throw new Error(`Invalid diagnostic category: '${String(params.category)}'`);\n }\n\n if (!isFindingStatus(params.status)) {\n throw new Error(`Invalid finding status: '${String(params.status)}'`);\n }\n\n if (!isFindingSeverity(params.severity)) {\n throw new Error(`Invalid finding severity: '${String(params.severity)}'`);\n }\n\n if (!isFindingConfidence(params.confidence)) {\n throw new Error(`Invalid finding confidence: '${String(params.confidence)}'`);\n }\n\n if (typeof params.title !== 'string' || params.title.trim().length === 0) {\n throw new Error('Finding title must be a non-empty string');\n }\n\n if (typeof params.summary !== 'string' || params.summary.trim().length === 0) {\n throw new Error('Finding summary must be a non-empty string');\n }\n\n const finding: Finding = {\n ruleId: params.ruleId,\n category: params.category,\n status: params.status,\n severity: params.severity,\n confidence: params.confidence,\n title: params.title.trim(),\n summary: params.summary.trim(),\n ...(params.explanation ? { explanation: params.explanation.trim() } : {}),\n ...(params.impact ? { impact: params.impact.trim() } : {}),\n ...(params.remediationHint ? { remediationHint: params.remediationHint.trim() } : {}),\n ...(params.evidence ? { evidence: deepFreezeEvidence(params.evidence) } : {}),\n };\n\n return Object.freeze(finding);\n}\n","import type { DetectionResult } from '../domain/detection-result.js';\nimport type { EvidenceItem, EvidenceSet } from '../domain/evidence.js';\nimport type { Finding } from '../domain/findings/finding.js';\nimport { createFinding } from '../domain/findings/finding.js';\nimport type { FindingSeverity } from '../domain/severity.js';\nimport type { DetectionContext, RuleRegistryInterface } from './types.js';\n\nconst SEVERITY_ORDER: Record<FindingSeverity, number> = {\n CRITICAL: 1,\n HIGH: 2,\n MEDIUM: 3,\n LOW: 4,\n INFO: 5,\n};\n\nfunction flattenEvidence(\n evidence: readonly EvidenceItem[] | readonly EvidenceSet[],\n): readonly EvidenceItem[] {\n if (evidence.length === 0) {\n return [];\n }\n const first = evidence[0];\n if (first && 'items' in first && Array.isArray((first as EvidenceSet).items)) {\n const items: EvidenceItem[] = [];\n for (const set of evidence as readonly EvidenceSet[]) {\n items.push(...set.items);\n }\n return items;\n }\n return evidence as readonly EvidenceItem[];\n}\n\n/**\n * Authoritative Detection Engine for YOWTF.\n * Executes registered diagnostic rules deterministically against normalized evidence.\n * Provides fault isolation and structured coverage transparency.\n * Reference: docs/DETECTION-ENGINE.md Section 85-87.\n */\nexport class DetectionEngine {\n constructor(private readonly registry: RuleRegistryInterface) {}\n\n public async execute(\n evidenceInput: readonly EvidenceItem[] | readonly EvidenceSet[],\n context: DetectionContext = {},\n ): Promise<DetectionResult> {\n const evidence = flattenEvidence(evidenceInput);\n const rulesToRun = this.registry.select(context);\n\n const findings: Finding[] = [];\n const executedRules: string[] = [];\n const skippedRules: string[] = [];\n const unavailableRules: string[] = [];\n const errors: string[] = [];\n\n for (const rule of rulesToRun) {\n const ruleId = rule.metadata.id;\n\n let applicable = false;\n try {\n applicable = rule.isApplicable(context, evidence);\n } catch (err) {\n errors.push(ruleId);\n findings.push(\n createFinding({\n ruleId,\n category: rule.metadata.category,\n status: 'ERROR',\n severity: 'HIGH',\n confidence: 'HIGH',\n title: `${rule.metadata.name} (Applicability Error)`,\n summary: `Failed to determine rule applicability: ${err instanceof Error ? err.message : String(err)}`,\n }),\n );\n continue;\n }\n\n if (!applicable) {\n skippedRules.push(ruleId);\n continue;\n }\n\n try {\n const evaluation = await rule.evaluate(context, evidence);\n const status = evaluation.status;\n\n switch (status) {\n case 'PASS':\n case 'FAIL':\n case 'WARN':\n executedRules.push(ruleId);\n if (evaluation.finding) {\n findings.push(evaluation.finding);\n }\n break;\n case 'SKIPPED':\n skippedRules.push(ruleId);\n break;\n case 'UNAVAILABLE':\n unavailableRules.push(ruleId);\n if (evaluation.finding) {\n findings.push(evaluation.finding);\n }\n break;\n case 'ERROR':\n errors.push(ruleId);\n if (evaluation.finding) {\n findings.push(evaluation.finding);\n } else {\n findings.push(\n createFinding({\n ruleId,\n category: rule.metadata.category,\n status: 'ERROR',\n severity: 'HIGH',\n confidence: 'HIGH',\n title: `${rule.metadata.name} (Evaluation Error)`,\n summary: 'Diagnostic rule reported an internal error during evaluation.',\n }),\n );\n }\n break;\n }\n } catch (err) {\n errors.push(ruleId);\n findings.push(\n createFinding({\n ruleId,\n category: rule.metadata.category,\n status: 'ERROR',\n severity: 'HIGH',\n confidence: 'HIGH',\n title: `${rule.metadata.name} (Execution Error)`,\n summary: `Diagnostic rule threw an unexpected exception: ${err instanceof Error ? err.message : String(err)}`,\n }),\n );\n }\n }\n\n // Deterministic sorting of findings:\n // 1. Severity: CRITICAL -> HIGH -> MEDIUM -> LOW -> INFO\n // 2. Category alphabetical\n // 3. Rule ID alphabetical\n findings.sort((a, b) => {\n const sevDiff = SEVERITY_ORDER[a.severity] - SEVERITY_ORDER[b.severity];\n if (sevDiff !== 0) return sevDiff;\n const catDiff = a.category.localeCompare(b.category);\n if (catDiff !== 0) return catDiff;\n return a.ruleId.localeCompare(b.ruleId);\n });\n\n return Object.freeze({\n findings: Object.freeze(findings),\n executedRules: Object.freeze(executedRules),\n skippedRules: Object.freeze(skippedRules),\n unavailableRules: Object.freeze(unavailableRules),\n errors: Object.freeze(errors),\n });\n }\n}\n","import type { EvidenceItem, FindingEvidence } from '../../domain/evidence.js';\nimport type { Finding } from '../../domain/findings/finding.js';\nimport { createFinding } from '../../domain/findings/finding.js';\nimport type { FindingConfidence } from '../../domain/confidence.js';\nimport type { FindingSeverity } from '../../domain/severity.js';\nimport type { FindingStatus } from '../../domain/status.js';\nimport type { RuleMetadata } from '../../domain/rules/rule-definition.js';\n\nexport function findEvidence<T = unknown>(\n evidence: readonly EvidenceItem[],\n key: string,\n): EvidenceItem<T> | undefined {\n return evidence.find((e) => e.key === key) as EvidenceItem<T> | undefined;\n}\n\nexport function findEvidenceList<T = unknown>(\n evidence: readonly EvidenceItem[],\n key: string,\n): readonly EvidenceItem<T>[] {\n return evidence.filter((e) => e.key === key) as readonly EvidenceItem<T>[];\n}\n\nexport interface BuildFindingOptions {\n readonly status: FindingStatus;\n readonly severity?: FindingSeverity;\n readonly confidence?: FindingConfidence;\n readonly title?: string;\n readonly summary: string;\n readonly explanation?: string;\n readonly impact?: string;\n readonly remediationHint?: string;\n readonly evidenceItems?: readonly EvidenceItem[];\n readonly details?: Readonly<Record<string, string | number | boolean | readonly string[]>>;\n}\n\nexport function buildFinding(metadata: RuleMetadata, options: BuildFindingOptions): Finding {\n let evidence: FindingEvidence | undefined;\n if (options.evidenceItems && options.evidenceItems.length > 0) {\n evidence = {\n items: options.evidenceItems,\n ...(options.details ? { details: options.details } : {}),\n };\n } else if (options.details) {\n evidence = {\n items: [],\n details: options.details,\n };\n }\n\n return createFinding({\n ruleId: metadata.id,\n category: metadata.category,\n status: options.status,\n severity: options.severity ?? metadata.severity,\n confidence: options.confidence ?? metadata.confidence,\n title: options.title ?? metadata.name,\n summary: options.summary,\n explanation: options.explanation ?? metadata.explanation,\n impact: options.impact,\n remediationHint: options.remediationHint ?? metadata.remediationHint,\n evidence,\n });\n}\n","import type { SyncDiagnosticRule, DiagnosticRule, DetectionContext } from '../../types.js';\nimport type { EvidenceItem } from '../../../domain/evidence.js';\nimport type { RuleEvaluation } from '../../../domain/rules/rule-definition.js';\nimport { buildFinding, findEvidence } from '../utils.js';\n\n/**\n * SYS-001: High Memory Pressure\n * Reference: docs/RULE-CATALOGUE.md Section 13\n */\nexport const sys001MemoryPressure: SyncDiagnosticRule = {\n metadata: {\n id: 'system.memory.pressure',\n name: 'High Memory Pressure',\n category: 'system',\n description:\n 'Identify unusually high current memory utilization that may affect developer workload stability.',\n severity: 'HIGH',\n confidence: 'HIGH',\n applicability: ['Applicable when memory metrics can be collected.'],\n requiredEvidence: ['system.memory'],\n explanation:\n 'Sustained high memory utilization can cause slowdowns, swapping, or application instability.',\n remediationHint: 'Inspect memory-heavy applications and current developer workloads.',\n },\n isApplicable(_context: DetectionContext, _evidence: readonly EvidenceItem[]): boolean {\n return true;\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{ utilizationPercent?: number }>(evidence, 'system.memory');\n if (\n !item ||\n item.availability !== 'AVAILABLE' ||\n !item.value ||\n item.value.utilizationPercent === undefined\n ) {\n return {\n ruleId: 'system.memory.pressure',\n status: 'UNAVAILABLE',\n finding: buildFinding(sys001MemoryPressure.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'Memory metrics could not be collected from the operating system.',\n evidenceItems: item ? [item] : [],\n }),\n };\n }\n\n const util = item.value.utilizationPercent;\n if (util >= 90) {\n return {\n ruleId: 'system.memory.pressure',\n status: 'FAIL',\n finding: buildFinding(sys001MemoryPressure.metadata, {\n status: 'FAIL',\n severity: 'HIGH',\n summary: `System memory utilization is critical at ${util.toFixed(1)}% (threshold >= 90%).`,\n evidenceItems: [item],\n details: { utilizationPercent: util },\n }),\n };\n }\n\n if (util >= 80) {\n return {\n ruleId: 'system.memory.pressure',\n status: 'WARN',\n finding: buildFinding(sys001MemoryPressure.metadata, {\n status: 'WARN',\n severity: 'MEDIUM',\n summary: `System memory utilization is elevated at ${util.toFixed(1)}% (threshold >= 80%).`,\n evidenceItems: [item],\n details: { utilizationPercent: util },\n }),\n };\n }\n\n return {\n ruleId: 'system.memory.pressure',\n status: 'PASS',\n finding: buildFinding(sys001MemoryPressure.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: `System memory utilization is healthy at ${util.toFixed(1)}%.`,\n evidenceItems: [item],\n details: { utilizationPercent: util },\n }),\n };\n },\n};\n\n/**\n * SYS-002: High CPU Pressure\n * Reference: docs/RULE-CATALOGUE.md Section 13\n */\nexport const sys002CpuPressure: SyncDiagnosticRule = {\n metadata: {\n id: 'system.cpu.pressure',\n name: 'High CPU Pressure',\n category: 'system',\n description:\n 'Identify sustained/high current CPU utilization that may affect developer workflows.',\n severity: 'HIGH',\n confidence: 'HIGH',\n applicability: ['Applicable when CPU utilization can be collected.'],\n requiredEvidence: ['system.cpu'],\n explanation:\n 'High CPU utilization may indicate a compute-heavy workload competing with development tools.',\n remediationHint: 'Inspect resource-heavy processes.',\n },\n isApplicable(_context: DetectionContext, _evidence: readonly EvidenceItem[]): boolean {\n return true;\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{ utilizationPercent?: number }>(evidence, 'system.cpu');\n if (\n !item ||\n item.availability !== 'AVAILABLE' ||\n !item.value ||\n item.value.utilizationPercent === undefined\n ) {\n return {\n ruleId: 'system.cpu.pressure',\n status: 'UNAVAILABLE',\n finding: buildFinding(sys002CpuPressure.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'CPU utilization metrics could not be collected.',\n evidenceItems: item ? [item] : [],\n }),\n };\n }\n\n const util = item.value.utilizationPercent;\n if (util >= 95) {\n return {\n ruleId: 'system.cpu.pressure',\n status: 'FAIL',\n finding: buildFinding(sys002CpuPressure.metadata, {\n status: 'FAIL',\n severity: 'HIGH',\n summary: `System CPU utilization is critically high at ${util.toFixed(1)}% (threshold >= 95%).`,\n evidenceItems: [item],\n details: { utilizationPercent: util },\n }),\n };\n }\n\n if (util >= 85) {\n return {\n ruleId: 'system.cpu.pressure',\n status: 'WARN',\n finding: buildFinding(sys002CpuPressure.metadata, {\n status: 'WARN',\n severity: 'MEDIUM',\n summary: `System CPU utilization is elevated at ${util.toFixed(1)}% (threshold >= 85%).`,\n evidenceItems: [item],\n details: { utilizationPercent: util },\n }),\n };\n }\n\n return {\n ruleId: 'system.cpu.pressure',\n status: 'PASS',\n finding: buildFinding(sys002CpuPressure.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: `System CPU utilization is normal at ${util.toFixed(1)}%.`,\n evidenceItems: [item],\n details: { utilizationPercent: util },\n }),\n };\n },\n};\n\n/**\n * SYS-003: Recently Restarted System\n * Reference: docs/RULE-CATALOGUE.md Section 13\n */\nexport const sys003UptimeShort: SyncDiagnosticRule = {\n metadata: {\n id: 'system.uptime.short',\n name: 'Recently Restarted System',\n category: 'system',\n description: 'Identify systems that have been running for a very short period.',\n severity: 'LOW',\n confidence: 'HIGH',\n applicability: ['Applicable when uptime is available.'],\n requiredEvidence: ['system.uptime'],\n explanation:\n 'A recently restarted workstation may have background services and development tools that have not fully returned to their normal operating state.',\n remediationHint:\n 'Allow normal services and development tools to initialize before interpreting transient issues.',\n },\n isApplicable(_context: DetectionContext, _evidence: readonly EvidenceItem[]): boolean {\n return true;\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<number>(evidence, 'system.uptime');\n if (!item || item.availability !== 'AVAILABLE' || item.value === undefined) {\n return {\n ruleId: 'system.uptime.short',\n status: 'UNAVAILABLE',\n finding: buildFinding(sys003UptimeShort.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'System uptime information is unavailable.',\n evidenceItems: item ? [item] : [],\n }),\n };\n }\n\n const uptimeSeconds = Number(item.value);\n const oneHour = 3600;\n if (uptimeSeconds < oneHour) {\n const minutes = Math.floor(uptimeSeconds / 60);\n return {\n ruleId: 'system.uptime.short',\n status: 'WARN',\n finding: buildFinding(sys003UptimeShort.metadata, {\n status: 'WARN',\n severity: 'LOW',\n summary: `System was restarted recently (uptime: ${minutes}m, threshold < 60m).`,\n evidenceItems: [item],\n details: { uptimeSeconds },\n }),\n };\n }\n\n return {\n ruleId: 'system.uptime.short',\n status: 'PASS',\n finding: buildFinding(sys003UptimeShort.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: `System uptime is sufficient (${Math.floor(uptimeSeconds / 3600)}h).`,\n evidenceItems: [item],\n details: { uptimeSeconds },\n }),\n };\n },\n};\n\n/**\n * SYS-004: Architecture Mismatch\n * Reference: docs/RULE-CATALOGUE.md Section 13\n */\nexport const sys004ArchitectureMismatch: SyncDiagnosticRule = {\n metadata: {\n id: 'system.architecture.mismatch',\n name: 'Architecture Mismatch',\n category: 'system',\n description:\n 'Identify a relevant mismatch between detected operating-system architecture and an explicitly required project/runtime architecture.',\n severity: 'HIGH',\n confidence: 'HIGH',\n applicability: ['Only when an explicit architecture requirement exists.'],\n requiredEvidence: ['system.architecture'],\n explanation:\n 'Architecture mismatch can prevent native modules and executables from running correctly.',\n remediationHint:\n \"Inspect the project's architecture requirements and installed runtime/tool architecture.\",\n },\n isApplicable(context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const req =\n context.targetArchitecture ??\n findEvidence<{ targetArch?: string }>(evidence, 'project.architecture')?.value?.targetArch;\n return Boolean(req);\n },\n evaluate(context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const expectedArch =\n context.targetArchitecture ??\n findEvidence<{ targetArch?: string }>(evidence, 'project.architecture')?.value?.targetArch;\n if (!expectedArch) {\n return {\n ruleId: 'system.architecture.mismatch',\n status: 'SKIPPED',\n };\n }\n\n const item = findEvidence<{ arch?: string }>(evidence, 'system.architecture');\n if (!item || item.availability !== 'AVAILABLE' || !item.value?.arch) {\n return {\n ruleId: 'system.architecture.mismatch',\n status: 'UNAVAILABLE',\n finding: buildFinding(sys004ArchitectureMismatch.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'System architecture information is unavailable.',\n evidenceItems: item ? [item] : [],\n }),\n };\n }\n\n const actualArch = item.value.arch;\n if (actualArch !== expectedArch) {\n return {\n ruleId: 'system.architecture.mismatch',\n status: 'FAIL',\n finding: buildFinding(sys004ArchitectureMismatch.metadata, {\n status: 'FAIL',\n severity: 'HIGH',\n summary: `System architecture '${actualArch}' does not match required architecture '${expectedArch}'.`,\n evidenceItems: [item],\n details: { actualArch, expectedArch },\n }),\n };\n }\n\n return {\n ruleId: 'system.architecture.mismatch',\n status: 'PASS',\n finding: buildFinding(sys004ArchitectureMismatch.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: `System architecture '${actualArch}' matches required architecture '${expectedArch}'.`,\n evidenceItems: [item],\n details: { actualArch, expectedArch },\n }),\n };\n },\n};\n\n/**\n * SYS-005: Supported Operating System\n * Reference: docs/RULE-CATALOGUE.md Section 13\n */\nexport const sys005PlatformSupported: SyncDiagnosticRule = {\n metadata: {\n id: 'system.platform.supported',\n name: 'Supported Operating System',\n category: 'system',\n description: 'Determine whether YOWTF is running on a supported operating system.',\n severity: 'INFO',\n confidence: 'HIGH',\n applicability: ['All runtime platforms; evaluates against YOWTF supported platform list.'],\n requiredEvidence: ['system.platform.supported'],\n explanation:\n 'Identify whether the current operating system has official V1 diagnostic support.',\n remediationHint: 'Run YOWTF on a supported platform for full diagnostics.',\n },\n isApplicable(_context: DetectionContext, _evidence: readonly EvidenceItem[]): boolean {\n return true;\n },\n evaluate(context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{ platform?: string; isSupported?: boolean }>(\n evidence,\n 'system.platform.supported',\n );\n const plat = item?.value?.platform ?? context.platform;\n const isSupported =\n item?.value?.isSupported ?? (plat === 'win32' || plat === 'darwin' || plat === 'linux');\n\n if (isSupported) {\n return {\n ruleId: 'system.platform.supported',\n status: 'PASS',\n finding: buildFinding(sys005PlatformSupported.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: `Operating system '${plat ?? 'unknown'}' is supported.`,\n evidenceItems: item ? [item] : [],\n details: { platform: plat ?? 'unknown' },\n }),\n };\n }\n\n return {\n ruleId: 'system.platform.supported',\n status: 'UNAVAILABLE',\n finding: buildFinding(sys005PlatformSupported.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: `Operating system '${plat ?? 'unknown'}' is not officially supported in V1.`,\n evidenceItems: item ? [item] : [],\n details: { platform: plat ?? 'unknown' },\n }),\n };\n },\n};\n\nexport const systemRules: readonly DiagnosticRule[] = Object.freeze([\n sys001MemoryPressure,\n sys002CpuPressure,\n sys003UptimeShort,\n sys004ArchitectureMismatch,\n sys005PlatformSupported,\n]);\n","import type { SyncDiagnosticRule, DiagnosticRule, DetectionContext } from '../../types.js';\nimport type { EvidenceItem } from '../../../domain/evidence.js';\nimport type { RuleEvaluation } from '../../../domain/rules/rule-definition.js';\nimport { buildFinding, findEvidence } from '../utils.js';\n\n/**\n * DISK-001: Low Disk Space\n * Reference: docs/RULE-CATALOGUE.md Section 14\n */\nexport const disk001SpaceLow: SyncDiagnosticRule = {\n metadata: {\n id: 'disk.space.low',\n name: 'Low Disk Space',\n category: 'disk',\n description: 'Identify low available disk space.',\n severity: 'HIGH',\n confidence: 'HIGH',\n applicability: ['Applicable when disk space metrics are available.'],\n requiredEvidence: ['disk.space'],\n explanation:\n 'Low free space can affect builds, package managers, caches, logs, and operating-system behavior.',\n remediationHint: 'Inspect large files, build artifacts, and developer caches.',\n },\n isApplicable(_context: DetectionContext, _evidence: readonly EvidenceItem[]): boolean {\n return true;\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{\n freePercent?: number;\n availableBytes?: number;\n totalBytes?: number;\n }>(evidence, 'disk.space');\n if (!item || item.availability !== 'AVAILABLE' || !item.value) {\n return {\n ruleId: 'disk.space.low',\n status: 'UNAVAILABLE',\n finding: buildFinding(disk001SpaceLow.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'Disk space information could not be retrieved.',\n evidenceItems: item ? [item] : [],\n }),\n };\n }\n\n let freePct = item.value.freePercent;\n if (\n freePct === undefined &&\n item.value.availableBytes !== undefined &&\n item.value.totalBytes !== undefined &&\n item.value.totalBytes > 0\n ) {\n freePct = (item.value.availableBytes / item.value.totalBytes) * 100;\n }\n\n if (freePct === undefined) {\n return {\n ruleId: 'disk.space.low',\n status: 'UNAVAILABLE',\n finding: buildFinding(disk001SpaceLow.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'Free disk space percentage could not be determined.',\n evidenceItems: [item],\n }),\n };\n }\n\n if (freePct < 10) {\n return {\n ruleId: 'disk.space.low',\n status: 'FAIL',\n finding: buildFinding(disk001SpaceLow.metadata, {\n status: 'FAIL',\n severity: 'HIGH',\n summary: `Critically low disk space: ${freePct.toFixed(1)}% free (threshold < 10%).`,\n evidenceItems: [item],\n details: { freePercent: freePct },\n }),\n };\n }\n\n if (freePct < 15) {\n return {\n ruleId: 'disk.space.low',\n status: 'WARN',\n finding: buildFinding(disk001SpaceLow.metadata, {\n status: 'WARN',\n severity: 'MEDIUM',\n summary: `Low disk space warning: ${freePct.toFixed(1)}% free (threshold 10%–14.9%).`,\n evidenceItems: [item],\n details: { freePercent: freePct },\n }),\n };\n }\n\n return {\n ruleId: 'disk.space.low',\n status: 'PASS',\n finding: buildFinding(disk001SpaceLow.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: `Sufficient free disk space available: ${freePct.toFixed(1)}% free.`,\n evidenceItems: [item],\n details: { freePercent: freePct },\n }),\n };\n },\n};\n\n/**\n * DISK-002: Developer Storage Pressure\n * Reference: docs/RULE-CATALOGUE.md Section 14\n */\nexport const disk002DeveloperStoragePressure: SyncDiagnosticRule = {\n metadata: {\n id: 'disk.developer-storage.pressure',\n name: 'Developer Storage Pressure',\n category: 'disk',\n description: 'Identify excessive storage consumption by known developer-related directories.',\n severity: 'MEDIUM',\n confidence: 'MEDIUM',\n applicability: ['Only when supported developer locations can be identified safely.'],\n requiredEvidence: ['disk.developer-storage'],\n explanation: 'Developer artifacts are consuming substantial local storage.',\n remediationHint: 'Review cleanup candidates before deleting anything.',\n },\n isApplicable(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const item = findEvidence(evidence, 'disk.developer-storage');\n return Boolean(item && item.availability === 'AVAILABLE');\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{ totalBytes?: number; sizeGB?: number }>(\n evidence,\n 'disk.developer-storage',\n );\n if (!item || item.availability !== 'AVAILABLE' || !item.value) {\n return {\n ruleId: 'disk.developer-storage.pressure',\n status: 'UNAVAILABLE',\n finding: buildFinding(disk002DeveloperStoragePressure.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'Developer storage size evidence is unavailable.',\n evidenceItems: item ? [item] : [],\n }),\n };\n }\n\n const ONE_GB = 1024 * 1024 * 1024;\n const bytes = item.value.totalBytes ?? (item.value.sizeGB ? item.value.sizeGB * ONE_GB : 0);\n const gb = bytes / ONE_GB;\n\n if (gb >= 50) {\n return {\n ruleId: 'disk.developer-storage.pressure',\n status: 'FAIL',\n finding: buildFinding(disk002DeveloperStoragePressure.metadata, {\n status: 'FAIL',\n severity: 'MEDIUM',\n summary: `Developer storage pressure is severe at ${gb.toFixed(1)} GB (threshold >= 50 GB).`,\n evidenceItems: [item],\n details: { sizeGB: gb },\n }),\n };\n }\n\n if (gb >= 20) {\n return {\n ruleId: 'disk.developer-storage.pressure',\n status: 'WARN',\n finding: buildFinding(disk002DeveloperStoragePressure.metadata, {\n status: 'WARN',\n severity: 'LOW',\n summary: `Developer storage is elevated at ${gb.toFixed(1)} GB (threshold >= 20 GB).`,\n evidenceItems: [item],\n details: { sizeGB: gb },\n }),\n };\n }\n\n return {\n ruleId: 'disk.developer-storage.pressure',\n status: 'PASS',\n finding: buildFinding(disk002DeveloperStoragePressure.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: `Developer storage is within normal limits (${gb.toFixed(1)} GB).`,\n evidenceItems: [item],\n details: { sizeGB: gb },\n }),\n };\n },\n};\n\n/**\n * DISK-003: Project Storage Location Unavailable\n * Reference: docs/RULE-CATALOGUE.md Section 14\n */\nexport const disk003ProjectLocationUnavailable: SyncDiagnosticRule = {\n metadata: {\n id: 'disk.project.location.unavailable',\n name: 'Project Storage Location Unavailable',\n category: 'disk',\n description:\n 'Identify when the project target cannot be inspected because its storage location is unavailable.',\n severity: 'INFO',\n confidence: 'HIGH',\n applicability: ['Applicable when evaluating target project path.'],\n requiredEvidence: ['project.root'],\n explanation: 'YOWTF could not inspect the target path.',\n remediationHint: 'Check path existence and permissions.',\n },\n isApplicable(_context: DetectionContext, _evidence: readonly EvidenceItem[]): boolean {\n return true;\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const rootItem = findEvidence<{ isProject?: boolean; rootPath?: string }>(\n evidence,\n 'project.root',\n );\n const diskLoc = findEvidence<{ accessible?: boolean }>(evidence, 'disk.project.location');\n\n const isFailed =\n rootItem?.availability === 'FAILED' ||\n diskLoc?.availability === 'FAILED' ||\n diskLoc?.value?.accessible === false;\n if (isFailed) {\n return {\n ruleId: 'disk.project.location.unavailable',\n status: 'UNAVAILABLE',\n finding: buildFinding(disk003ProjectLocationUnavailable.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'Project target location is inaccessible or does not exist.',\n evidenceItems: rootItem ? [rootItem] : diskLoc ? [diskLoc] : [],\n }),\n };\n }\n\n return {\n ruleId: 'disk.project.location.unavailable',\n status: 'PASS',\n finding: buildFinding(disk003ProjectLocationUnavailable.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: 'Project storage location is accessible.',\n evidenceItems: rootItem ? [rootItem] : [],\n }),\n };\n },\n};\n\n/**\n * DISK-004: Read-Only Project Filesystem\n * Reference: docs/RULE-CATALOGUE.md Section 14\n */\nexport const disk004FilesystemReadonly: SyncDiagnosticRule = {\n metadata: {\n id: 'disk.filesystem.readonly',\n name: 'Read-Only Project Filesystem',\n category: 'disk',\n description:\n 'Identify when the project filesystem is read-only where this can affect normal development workflows.',\n severity: 'MEDIUM',\n confidence: 'HIGH',\n applicability: ['Only when reliable read-only filesystem information is available.'],\n requiredEvidence: ['disk.filesystem'],\n explanation:\n 'A read-only project location can prevent tools from creating builds, dependencies, generated files, or other expected development artifacts.',\n remediationHint: 'Inspect filesystem permissions and mount configuration.',\n },\n isApplicable(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const item = findEvidence(evidence, 'disk.filesystem');\n return Boolean(item && item.availability === 'AVAILABLE');\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{ isReadOnly?: boolean; writable?: boolean }>(\n evidence,\n 'disk.filesystem',\n );\n if (!item || item.availability !== 'AVAILABLE' || !item.value) {\n return {\n ruleId: 'disk.filesystem.readonly',\n status: 'SKIPPED',\n };\n }\n\n const isReadOnly = item.value.isReadOnly === true || item.value.writable === false;\n if (isReadOnly) {\n return {\n ruleId: 'disk.filesystem.readonly',\n status: 'WARN',\n finding: buildFinding(disk004FilesystemReadonly.metadata, {\n status: 'WARN',\n severity: 'MEDIUM',\n summary: 'The project filesystem is mounted as read-only.',\n evidenceItems: [item],\n details: { isReadOnly: true },\n }),\n };\n }\n\n return {\n ruleId: 'disk.filesystem.readonly',\n status: 'PASS',\n finding: buildFinding(disk004FilesystemReadonly.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: 'The project filesystem is writable.',\n evidenceItems: [item],\n details: { isReadOnly: false },\n }),\n };\n },\n};\n\nexport const diskRules: readonly DiagnosticRule[] = Object.freeze([\n disk001SpaceLow,\n disk002DeveloperStoragePressure,\n disk003ProjectLocationUnavailable,\n disk004FilesystemReadonly,\n]);\n","import type { SyncDiagnosticRule, DiagnosticRule, DetectionContext } from '../../types.js';\nimport type { EvidenceItem } from '../../../domain/evidence.js';\nimport type { RuleEvaluation } from '../../../domain/rules/rule-definition.js';\nimport { buildFinding, findEvidence } from '../utils.js';\n\nexport interface ProcessItem {\n readonly pid: number;\n readonly name: string;\n readonly cpuPercent?: number;\n readonly memoryPercent?: number;\n readonly state?: string; // 'Z' or 'defunct'\n}\n\n/**\n * PROC-001: Resource-Heavy Process\n * Reference: docs/RULE-CATALOGUE.md Section 15\n */\nexport const proc001ResourceHog: SyncDiagnosticRule = {\n metadata: {\n id: 'process.resource.hog',\n name: 'Resource-Heavy Process',\n category: 'process',\n description: 'Identify a process consuming unusually high CPU resources.',\n severity: 'MEDIUM',\n confidence: 'HIGH',\n applicability: ['Applicable when process CPU metrics are available.'],\n requiredEvidence: ['process.list'],\n explanation: 'A resource-heavy process may starve developer tools of CPU time.',\n remediationHint: 'Inspect whether the process is expected for the current workload.',\n },\n isApplicable(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const item = findEvidence(evidence, 'process.list');\n return Boolean(item && item.availability === 'AVAILABLE');\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{ processes?: readonly ProcessItem[] }>(evidence, 'process.list');\n if (!item || item.availability !== 'AVAILABLE' || !item.value?.processes) {\n return {\n ruleId: 'process.resource.hog',\n status: 'UNAVAILABLE',\n finding: buildFinding(proc001ResourceHog.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'Process CPU utilization metrics are unavailable.',\n evidenceItems: item ? [item] : [],\n }),\n };\n }\n\n const procs = item.value.processes;\n let maxProc: ProcessItem | undefined;\n for (const p of procs) {\n if (p.cpuPercent !== undefined) {\n if (!maxProc || p.cpuPercent > (maxProc.cpuPercent ?? 0)) {\n maxProc = p;\n }\n }\n }\n\n const maxCpu = maxProc?.cpuPercent ?? 0;\n if (maxCpu >= 95) {\n return {\n ruleId: 'process.resource.hog',\n status: 'FAIL',\n finding: buildFinding(proc001ResourceHog.metadata, {\n status: 'FAIL',\n severity: 'MEDIUM',\n summary: `Process '${maxProc?.name ?? 'unknown'}' (PID ${maxProc?.pid ?? 'unknown'}) is consuming ${maxCpu.toFixed(1)}% CPU (threshold >= 95%).`,\n evidenceItems: [item],\n details: { pid: maxProc?.pid ?? 0, name: maxProc?.name ?? '', cpuPercent: maxCpu },\n }),\n };\n }\n\n if (maxCpu >= 80) {\n return {\n ruleId: 'process.resource.hog',\n status: 'WARN',\n finding: buildFinding(proc001ResourceHog.metadata, {\n status: 'WARN',\n severity: 'LOW',\n summary: `Process '${maxProc?.name ?? 'unknown'}' (PID ${maxProc?.pid ?? 'unknown'}) is consuming ${maxCpu.toFixed(1)}% CPU (threshold >= 80%).`,\n evidenceItems: [item],\n details: { pid: maxProc?.pid ?? 0, name: maxProc?.name ?? '', cpuPercent: maxCpu },\n }),\n };\n }\n\n return {\n ruleId: 'process.resource.hog',\n status: 'PASS',\n finding: buildFinding(proc001ResourceHog.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: 'No process is consuming excessive CPU resources.',\n evidenceItems: [item],\n }),\n };\n },\n};\n\n/**\n * PROC-002: Memory-Heavy Process\n * Reference: docs/RULE-CATALOGUE.md Section 15\n */\nexport const proc002MemoryHog: SyncDiagnosticRule = {\n metadata: {\n id: 'process.memory.hog',\n name: 'Memory-Heavy Process',\n category: 'process',\n description: 'Identify a process consuming unusually high memory.',\n severity: 'MEDIUM',\n confidence: 'HIGH',\n applicability: ['Applicable when process memory metrics are available.'],\n requiredEvidence: ['process.list'],\n explanation: 'The identified process is consuming substantial system memory.',\n remediationHint:\n 'Inspect whether the process is expected and whether its workload can be reduced.',\n },\n isApplicable(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const item = findEvidence(evidence, 'process.list');\n return Boolean(item && item.availability === 'AVAILABLE');\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{ processes?: readonly ProcessItem[] }>(evidence, 'process.list');\n if (!item || item.availability !== 'AVAILABLE' || !item.value?.processes) {\n return {\n ruleId: 'process.memory.hog',\n status: 'UNAVAILABLE',\n finding: buildFinding(proc002MemoryHog.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'Process memory metrics are unavailable.',\n evidenceItems: item ? [item] : [],\n }),\n };\n }\n\n const procs = item.value.processes;\n let maxProc: ProcessItem | undefined;\n for (const p of procs) {\n if (p.memoryPercent !== undefined) {\n if (!maxProc || p.memoryPercent > (maxProc.memoryPercent ?? 0)) {\n maxProc = p;\n }\n }\n }\n\n const maxMem = maxProc?.memoryPercent ?? 0;\n if (maxMem >= 20) {\n return {\n ruleId: 'process.memory.hog',\n status: 'FAIL',\n finding: buildFinding(proc002MemoryHog.metadata, {\n status: 'FAIL',\n severity: 'MEDIUM',\n summary: `Process '${maxProc?.name ?? 'unknown'}' (PID ${maxProc?.pid ?? 'unknown'}) is consuming ${maxMem.toFixed(1)}% of system memory (threshold >= 20%).`,\n evidenceItems: [item],\n details: { pid: maxProc?.pid ?? 0, name: maxProc?.name ?? '', memoryPercent: maxMem },\n }),\n };\n }\n\n if (maxMem >= 10) {\n return {\n ruleId: 'process.memory.hog',\n status: 'WARN',\n finding: buildFinding(proc002MemoryHog.metadata, {\n status: 'WARN',\n severity: 'LOW',\n summary: `Process '${maxProc?.name ?? 'unknown'}' (PID ${maxProc?.pid ?? 'unknown'}) is consuming ${maxMem.toFixed(1)}% of system memory (threshold >= 10%).`,\n evidenceItems: [item],\n details: { pid: maxProc?.pid ?? 0, name: maxProc?.name ?? '', memoryPercent: maxMem },\n }),\n };\n }\n\n return {\n ruleId: 'process.memory.hog',\n status: 'PASS',\n finding: buildFinding(proc002MemoryHog.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: 'No process is consuming excessive system memory.',\n evidenceItems: [item],\n }),\n };\n },\n};\n\n/**\n * PROC-003: Zombie/Defunct Development Process\n * Reference: docs/RULE-CATALOGUE.md Section 15\n */\nexport const proc003Zombie: SyncDiagnosticRule = {\n metadata: {\n id: 'process.development.zombie',\n name: 'Zombie/Defunct Development Process',\n category: 'process',\n description: 'Identify defunct/zombie processes associated with development workflows.',\n severity: 'LOW',\n confidence: 'HIGH',\n applicability: [\n 'Linux where reliable process state is available. Non-Linux platforms return SKIPPED.',\n ],\n requiredEvidence: ['process.list'],\n explanation: 'A defunct process remains in the process table.',\n remediationHint: 'Inspect the parent process and the development tool that created it.',\n },\n isApplicable(context: DetectionContext, _evidence: readonly EvidenceItem[]): boolean {\n return context.platform === 'linux';\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{ processes?: readonly ProcessItem[] }>(evidence, 'process.list');\n if (!item || item.availability !== 'AVAILABLE' || !item.value?.processes) {\n return {\n ruleId: 'process.development.zombie',\n status: 'UNAVAILABLE',\n finding: buildFinding(proc003Zombie.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'Process state information is unavailable.',\n evidenceItems: item ? [item] : [],\n }),\n };\n }\n\n const zombies = item.value.processes.filter(\n (p) => p.state === 'Z' || p.state === 'defunct' || p.name.includes('<defunct>'),\n );\n\n if (zombies.length > 0) {\n return {\n ruleId: 'process.development.zombie',\n status: 'WARN',\n finding: buildFinding(proc003Zombie.metadata, {\n status: 'WARN',\n severity: 'LOW',\n summary: `Detected ${zombies.length} defunct/zombie process(es) in the system process table.`,\n evidenceItems: [item],\n details: { zombieCount: zombies.length, pids: zombies.map((z) => String(z.pid)) },\n }),\n };\n }\n\n return {\n ruleId: 'process.development.zombie',\n status: 'PASS',\n finding: buildFinding(proc003Zombie.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: 'No defunct or zombie development processes detected.',\n evidenceItems: [item],\n }),\n };\n },\n};\n\n/**\n * PROC-004: Duplicate Development Process\n * Reference: docs/RULE-CATALOGUE.md Section 15\n */\nexport const proc004Duplicate: SyncDiagnosticRule = {\n metadata: {\n id: 'process.development.duplicate',\n name: 'Duplicate Development Process',\n category: 'process',\n description:\n 'Identify unusually duplicated development processes that may indicate accidental duplicate servers/watchers.',\n severity: 'LOW',\n confidence: 'MEDIUM',\n applicability: ['Only for explicitly recognized development process patterns.'],\n requiredEvidence: ['process.list'],\n explanation: 'Multiple instances of a development process were detected.',\n remediationHint: 'Inspect whether the duplicate instances are intentional.',\n },\n isApplicable(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const item = findEvidence(evidence, 'process.list');\n return Boolean(item && item.availability === 'AVAILABLE');\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{\n processes?: readonly ProcessItem[];\n duplicateDevProcesses?: readonly string[];\n }>(evidence, 'process.list');\n if (!item || item.availability !== 'AVAILABLE' || !item.value) {\n return {\n ruleId: 'process.development.duplicate',\n status: 'UNAVAILABLE',\n finding: buildFinding(proc004Duplicate.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'Process list evidence is unavailable.',\n evidenceItems: item ? [item] : [],\n }),\n };\n }\n\n // Check for explicit duplicate dev processes or duplicate dev process names\n const duplicates = item.value.duplicateDevProcesses ?? [];\n if (duplicates.length > 0) {\n return {\n ruleId: 'process.development.duplicate',\n status: 'WARN',\n finding: buildFinding(proc004Duplicate.metadata, {\n status: 'WARN',\n severity: 'LOW',\n summary: `Detected duplicate development processes: ${duplicates.join(', ')}.`,\n evidenceItems: [item],\n details: { duplicates },\n }),\n };\n }\n\n return {\n ruleId: 'process.development.duplicate',\n status: 'PASS',\n finding: buildFinding(proc004Duplicate.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: 'No duplicate development processes detected.',\n evidenceItems: [item],\n }),\n };\n },\n};\n\nexport const processRules: readonly DiagnosticRule[] = Object.freeze([\n proc001ResourceHog,\n proc002MemoryHog,\n proc003Zombie,\n proc004Duplicate,\n]);\n","import type { SyncDiagnosticRule, DiagnosticRule, DetectionContext } from '../../types.js';\nimport type { EvidenceItem } from '../../../domain/evidence.js';\nimport type { RuleEvaluation } from '../../../domain/rules/rule-definition.js';\nimport { buildFinding, findEvidence } from '../utils.js';\n\nexport interface PortListener {\n readonly port: number;\n readonly address: string;\n readonly pid?: number;\n readonly processName?: string;\n readonly hasConflict?: boolean;\n readonly isDuplicate?: boolean;\n readonly ownerKnown?: boolean;\n}\n\n/**\n * PORT-001: Development Port Conflict\n * Reference: docs/RULE-CATALOGUE.md Section 16\n */\nexport const port001DevConflict: SyncDiagnosticRule = {\n metadata: {\n id: 'port.development.conflict',\n name: 'Development Port Conflict',\n category: 'port',\n description: 'Identify a known development port already occupied by another process.',\n severity: 'MEDIUM',\n confidence: 'HIGH',\n applicability: ['Applicable when active port listeners are inspected.'],\n requiredEvidence: ['port.listeners'],\n explanation: 'Explain which process currently occupies the relevant development port.',\n remediationHint: 'Inspect the owning process and project configuration.',\n },\n isApplicable(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const item = findEvidence(evidence, 'port.listeners');\n return Boolean(item && item.availability === 'AVAILABLE');\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{\n listeners?: readonly PortListener[];\n conflicts?: readonly PortListener[];\n }>(evidence, 'port.listeners');\n if (!item || item.availability !== 'AVAILABLE' || !item.value) {\n return {\n ruleId: 'port.development.conflict',\n status: 'UNAVAILABLE',\n finding: buildFinding(port001DevConflict.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'Port listener information is unavailable.',\n evidenceItems: item ? [item] : [],\n }),\n };\n }\n\n const conflicts =\n item.value.conflicts ?? item.value.listeners?.filter((l) => l.hasConflict) ?? [];\n if (conflicts.length > 0) {\n const first = conflicts[0];\n return {\n ruleId: 'port.development.conflict',\n status: 'WARN',\n finding: buildFinding(port001DevConflict.metadata, {\n status: 'WARN',\n severity: 'MEDIUM',\n summary: `Development port conflict detected on port ${first?.port} (occupied by '${first?.processName ?? 'PID ' + first?.pid}').`,\n evidenceItems: [item],\n details: {\n port: first?.port ?? 0,\n process: first?.processName ?? String(first?.pid ?? ''),\n },\n }),\n };\n }\n\n return {\n ruleId: 'port.development.conflict',\n status: 'PASS',\n finding: buildFinding(port001DevConflict.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: 'No development port conflicts detected.',\n evidenceItems: [item],\n }),\n };\n },\n};\n\n/**\n * PORT-002: Duplicate Listener Detection\n * Reference: docs/RULE-CATALOGUE.md Section 16\n */\nexport const port002DuplicateListener: SyncDiagnosticRule = {\n metadata: {\n id: 'port.duplicate.listener',\n name: 'Duplicate Listener Detection',\n category: 'port',\n description:\n 'Identify multiple relevant listeners competing for the same expected endpoint where the operating system permits distinguishable bindings.',\n severity: 'MEDIUM',\n confidence: 'HIGH',\n applicability: ['Applicable when active port listeners are inspected.'],\n requiredEvidence: ['port.listeners'],\n explanation: 'Conflicting listeners are competing for the same endpoint.',\n remediationHint: 'Inspect listener bindings and project configuration.',\n },\n isApplicable(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const item = findEvidence(evidence, 'port.listeners');\n return Boolean(item && item.availability === 'AVAILABLE');\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{\n listeners?: readonly PortListener[];\n duplicates?: readonly PortListener[];\n }>(evidence, 'port.listeners');\n if (!item || item.availability !== 'AVAILABLE' || !item.value) {\n return {\n ruleId: 'port.duplicate.listener',\n status: 'UNAVAILABLE',\n finding: buildFinding(port002DuplicateListener.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'Port listener information is unavailable.',\n evidenceItems: item ? [item] : [],\n }),\n };\n }\n\n const duplicates =\n item.value.duplicates ?? item.value.listeners?.filter((l) => l.isDuplicate) ?? [];\n if (duplicates.length > 0) {\n const first = duplicates[0];\n return {\n ruleId: 'port.duplicate.listener',\n status: 'WARN',\n finding: buildFinding(port002DuplicateListener.metadata, {\n status: 'WARN',\n severity: 'MEDIUM',\n summary: `Duplicate listeners detected for port ${first?.port} on address '${first?.address}'.`,\n evidenceItems: [item],\n details: { port: first?.port ?? 0, address: first?.address ?? '' },\n }),\n };\n }\n\n return {\n ruleId: 'port.duplicate.listener',\n status: 'PASS',\n finding: buildFinding(port002DuplicateListener.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: 'No duplicate port listeners detected.',\n evidenceItems: [item],\n }),\n };\n },\n};\n\n/**\n * PORT-003: Unexpected Local Port Exposure\n * Reference: docs/RULE-CATALOGUE.md Section 16\n */\nexport const port003UnexpectedExposure: SyncDiagnosticRule = {\n metadata: {\n id: 'port.unexpected.exposure',\n name: 'Unexpected Local Port Exposure',\n category: 'port',\n description:\n 'Identify development-related services listening on a broad local interface when the project appears to expect local-only access.',\n severity: 'MEDIUM',\n confidence: 'MEDIUM',\n applicability: ['Only when project/tool context provides an explicit local-only expectation.'],\n requiredEvidence: ['port.exposure'],\n explanation: 'A development service is listening beyond the expected local-only scope.',\n remediationHint: \"Inspect the server's bind/listen configuration.\",\n },\n isApplicable(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const item = findEvidence(evidence, 'port.exposure');\n return Boolean(item && item.availability === 'AVAILABLE');\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{\n isBroadlyExposed?: boolean;\n listenAddress?: string;\n port?: number;\n }>(evidence, 'port.exposure');\n if (!item || item.availability !== 'AVAILABLE' || !item.value) {\n return {\n ruleId: 'port.unexpected.exposure',\n status: 'SKIPPED',\n };\n }\n\n if (item.value.isBroadlyExposed) {\n return {\n ruleId: 'port.unexpected.exposure',\n status: 'WARN',\n finding: buildFinding(port003UnexpectedExposure.metadata, {\n status: 'WARN',\n severity: 'MEDIUM',\n summary: `Development service on port ${item.value.port} is exposed on broad address '${item.value.listenAddress ?? '0.0.0.0'}' instead of loopback.`,\n evidenceItems: [item],\n details: {\n port: item.value.port ?? 0,\n listenAddress: item.value.listenAddress ?? '0.0.0.0',\n },\n }),\n };\n }\n\n return {\n ruleId: 'port.unexpected.exposure',\n status: 'PASS',\n finding: buildFinding(port003UnexpectedExposure.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: 'Development services are bound to local loopback interface as expected.',\n evidenceItems: [item],\n }),\n };\n },\n};\n\n/**\n * PORT-004: Port Owner Unavailable\n * Reference: docs/RULE-CATALOGUE.md Section 16\n */\nexport const port004ProcessUnavailable: SyncDiagnosticRule = {\n metadata: {\n id: 'port.process.unavailable',\n name: 'Port Owner Unavailable',\n category: 'port',\n description: 'Represent a listening port for which the owning process cannot be identified.',\n severity: 'INFO',\n confidence: 'HIGH',\n applicability: ['Applicable when listening ports are inspected.'],\n requiredEvidence: ['port.listeners'],\n explanation: 'The port is observable but ownership information could not be retrieved.',\n remediationHint: 'Inspect the port using platform-specific tools with appropriate permissions.',\n },\n isApplicable(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const item = findEvidence(evidence, 'port.listeners');\n return Boolean(item && item.availability === 'AVAILABLE');\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{\n listeners?: readonly PortListener[];\n hasUnidentifiedOwner?: boolean;\n }>(evidence, 'port.listeners');\n if (!item || item.availability !== 'AVAILABLE' || !item.value) {\n return {\n ruleId: 'port.process.unavailable',\n status: 'UNAVAILABLE',\n finding: buildFinding(port004ProcessUnavailable.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'Port ownership evidence could not be collected.',\n evidenceItems: item ? [item] : [],\n }),\n };\n }\n\n const hasUnknown =\n item.value.hasUnidentifiedOwner || item.value.listeners?.some((l) => l.ownerKnown === false);\n if (hasUnknown) {\n return {\n ruleId: 'port.process.unavailable',\n status: 'UNAVAILABLE',\n finding: buildFinding(port004ProcessUnavailable.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary:\n 'One or more listening ports have unidentifiable process owners (insufficient privileges).',\n evidenceItems: [item],\n }),\n };\n }\n\n return {\n ruleId: 'port.process.unavailable',\n status: 'PASS',\n finding: buildFinding(port004ProcessUnavailable.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: 'All observable port listeners have identified process owners.',\n evidenceItems: [item],\n }),\n };\n },\n};\n\nexport const portRules: readonly DiagnosticRule[] = Object.freeze([\n port001DevConflict,\n port002DuplicateListener,\n port003UnexpectedExposure,\n port004ProcessUnavailable,\n]);\n","import type { SyncDiagnosticRule, DiagnosticRule, DetectionContext } from '../../types.js';\nimport type { EvidenceItem } from '../../../domain/evidence.js';\nimport type { RuleEvaluation } from '../../../domain/rules/rule-definition.js';\nimport { buildFinding, findEvidence } from '../utils.js';\n\n/**\n * NET-001: Network Interface Information Unavailable\n * Reference: docs/RULE-CATALOGUE.md Section 17\n */\nexport const net001InterfaceUnavailable: SyncDiagnosticRule = {\n metadata: {\n id: 'network.interface.unavailable',\n name: 'Network Interface Information Unavailable',\n category: 'network',\n description: 'Represent inability to collect local network interface information.',\n severity: 'INFO',\n confidence: 'HIGH',\n applicability: ['Applicable when inspecting local network interfaces.'],\n requiredEvidence: ['network.interfaces'],\n explanation: 'Network interface information could not be retrieved from the operating system.',\n remediationHint: 'Inspect operating system network adapter permissions.',\n },\n isApplicable(_context: DetectionContext, _evidence: readonly EvidenceItem[]): boolean {\n return true;\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence(evidence, 'network.interfaces');\n if (!item || item.availability !== 'AVAILABLE') {\n return {\n ruleId: 'network.interface.unavailable',\n status: 'UNAVAILABLE',\n finding: buildFinding(net001InterfaceUnavailable.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'Local network interface metadata is unavailable.',\n evidenceItems: item ? [item] : [],\n }),\n };\n }\n\n return {\n ruleId: 'network.interface.unavailable',\n status: 'PASS',\n finding: buildFinding(net001InterfaceUnavailable.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: 'Network interface metadata is available.',\n evidenceItems: [item],\n }),\n };\n },\n};\n\n/**\n * NET-002: DNS Configuration Missing\n * Reference: docs/RULE-CATALOGUE.md Section 17\n */\nexport const net002DnsMissing: SyncDiagnosticRule = {\n metadata: {\n id: 'network.dns.configuration.missing',\n name: 'DNS Configuration Missing',\n category: 'network',\n description:\n 'Identify a local network configuration with no usable DNS server information where the platform exposes such configuration.',\n severity: 'MEDIUM',\n confidence: 'HIGH',\n applicability: ['Applicable when network configuration is inspected.'],\n requiredEvidence: ['network.dns'],\n explanation: 'DNS configuration may prevent developer tools from resolving hostnames.',\n remediationHint: 'Inspect active network adapter DNS configuration.',\n },\n isApplicable(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const item = findEvidence(evidence, 'network.dns');\n return Boolean(item && item.availability === 'AVAILABLE');\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{ servers?: readonly string[]; hasUsableDns?: boolean }>(\n evidence,\n 'network.dns',\n );\n if (!item || item.availability !== 'AVAILABLE' || !item.value) {\n return {\n ruleId: 'network.dns.configuration.missing',\n status: 'UNAVAILABLE',\n finding: buildFinding(net002DnsMissing.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'DNS configuration evidence is unavailable.',\n evidenceItems: item ? [item] : [],\n }),\n };\n }\n\n const hasDns =\n item.value.hasUsableDns !== false && item.value.servers && item.value.servers.length > 0;\n if (!hasDns) {\n return {\n ruleId: 'network.dns.configuration.missing',\n status: 'WARN',\n finding: buildFinding(net002DnsMissing.metadata, {\n status: 'WARN',\n severity: 'MEDIUM',\n summary: 'No usable DNS servers configured on active network adapters.',\n evidenceItems: [item],\n }),\n };\n }\n\n return {\n ruleId: 'network.dns.configuration.missing',\n status: 'PASS',\n finding: buildFinding(net002DnsMissing.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: 'Usable DNS servers are configured.',\n evidenceItems: [item],\n details: { serverCount: item.value.servers?.length ?? 0 },\n }),\n };\n },\n};\n\n/**\n * NET-003: Suspicious Proxy Configuration\n * Reference: docs/RULE-CATALOGUE.md Section 17\n */\nexport const net003ProxySuspicious: SyncDiagnosticRule = {\n metadata: {\n id: 'network.proxy.configuration.suspicious',\n name: 'Suspicious Proxy Configuration',\n category: 'network',\n description: 'Identify proxy configuration that appears incomplete or malformed.',\n severity: 'LOW',\n confidence: 'MEDIUM',\n applicability: ['Only when proxy configuration is explicitly present.'],\n requiredEvidence: ['network.proxy'],\n explanation: 'Proxy configuration appears incomplete or malformed.',\n remediationHint: 'Review system or environment proxy configuration settings.',\n },\n isApplicable(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const item = findEvidence<{ isPresent?: boolean }>(evidence, 'network.proxy');\n return Boolean(item && item.availability === 'AVAILABLE' && item.value?.isPresent);\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{\n isPresent?: boolean;\n isMalformed?: boolean;\n proxyVarName?: string;\n }>(evidence, 'network.proxy');\n if (!item || item.availability !== 'AVAILABLE' || !item.value) {\n return {\n ruleId: 'network.proxy.configuration.suspicious',\n status: 'SKIPPED',\n };\n }\n\n if (item.value.isMalformed) {\n return {\n ruleId: 'network.proxy.configuration.suspicious',\n status: 'WARN',\n finding: buildFinding(net003ProxySuspicious.metadata, {\n status: 'WARN',\n severity: 'LOW',\n summary: `Malformed or incomplete proxy configuration in variable '${item.value.proxyVarName ?? 'HTTP_PROXY'}'.`,\n evidenceItems: [item],\n details: { variable: item.value.proxyVarName ?? 'HTTP_PROXY' },\n }),\n };\n }\n\n return {\n ruleId: 'network.proxy.configuration.suspicious',\n status: 'PASS',\n finding: buildFinding(net003ProxySuspicious.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: 'Proxy configuration format is valid.',\n evidenceItems: [item],\n }),\n };\n },\n};\n\n/**\n * NET-004: Local Route Information Unavailable\n * Reference: docs/RULE-CATALOGUE.md Section 17\n */\nexport const net004RouteUnavailable: SyncDiagnosticRule = {\n metadata: {\n id: 'network.route.configuration.unavailable',\n name: 'Local Route Information Unavailable',\n category: 'network',\n description:\n 'Represent inability to obtain local route information required by applicable network diagnostics.',\n severity: 'INFO',\n confidence: 'HIGH',\n applicability: ['Applicable when routing table diagnostics are required.'],\n requiredEvidence: ['network.routes'],\n explanation: 'Local route information could not be obtained.',\n remediationHint: 'Inspect operating system network route table permissions.',\n },\n isApplicable(_context: DetectionContext, _evidence: readonly EvidenceItem[]): boolean {\n return true;\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence(evidence, 'network.routes');\n if (!item || item.availability !== 'AVAILABLE') {\n return {\n ruleId: 'network.route.configuration.unavailable',\n status: 'UNAVAILABLE',\n finding: buildFinding(net004RouteUnavailable.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'Local network routing table metadata is unavailable.',\n evidenceItems: item ? [item] : [],\n }),\n };\n }\n\n return {\n ruleId: 'network.route.configuration.unavailable',\n status: 'PASS',\n finding: buildFinding(net004RouteUnavailable.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: 'Local routing table information is available.',\n evidenceItems: [item],\n }),\n };\n },\n};\n\nexport const networkRules: readonly DiagnosticRule[] = Object.freeze([\n net001InterfaceUnavailable,\n net002DnsMissing,\n net003ProxySuspicious,\n net004RouteUnavailable,\n]);\n","import type { SyncDiagnosticRule, DiagnosticRule, DetectionContext } from '../../types.js';\nimport type { EvidenceItem } from '../../../domain/evidence.js';\nimport type { RuleEvaluation } from '../../../domain/rules/rule-definition.js';\nimport { buildFinding, findEvidence } from '../utils.js';\n\n/**\n * ENV-001: Empty PATH Entry\n * Reference: docs/RULE-CATALOGUE.md Section 18\n */\nexport const env001EmptyPathEntry: SyncDiagnosticRule = {\n metadata: {\n id: 'environment.path.empty-entry',\n name: 'Empty PATH Entry',\n category: 'environment',\n description:\n 'Identify empty PATH entries that can create platform-specific command-resolution behavior.',\n severity: 'LOW',\n confidence: 'HIGH',\n applicability: ['Applicable when PATH entries are available.'],\n requiredEvidence: ['environment.path'],\n explanation: 'Empty PATH entries can create ambiguous or unintended executable resolution.',\n remediationHint: 'Inspect PATH construction and remove unintended empty entries.',\n },\n isApplicable(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const item = findEvidence(evidence, 'environment.path');\n return Boolean(item && item.availability === 'AVAILABLE');\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{ entries?: readonly string[]; hasEmptyEntry?: boolean }>(\n evidence,\n 'environment.path',\n );\n if (!item || item.availability !== 'AVAILABLE' || !item.value) {\n return {\n ruleId: 'environment.path.empty-entry',\n status: 'UNAVAILABLE',\n finding: buildFinding(env001EmptyPathEntry.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'PATH entries are unavailable.',\n evidenceItems: item ? [item] : [],\n }),\n };\n }\n\n const hasEmpty =\n item.value.hasEmptyEntry ?? item.value.entries?.some((e) => e.trim().length === 0) ?? false;\n if (hasEmpty) {\n return {\n ruleId: 'environment.path.empty-entry',\n status: 'WARN',\n finding: buildFinding(env001EmptyPathEntry.metadata, {\n status: 'WARN',\n severity: 'LOW',\n summary: 'Detected empty entry in system PATH environment variable.',\n evidenceItems: [item],\n }),\n };\n }\n\n return {\n ruleId: 'environment.path.empty-entry',\n status: 'PASS',\n finding: buildFinding(env001EmptyPathEntry.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: 'No empty PATH entries detected.',\n evidenceItems: [item],\n }),\n };\n },\n};\n\nconst SECRET_PATTERNS = [\n /SECRET/i,\n /PASSWORD/i,\n /TOKEN/i,\n /PRIVATE_KEY/i,\n /API_KEY/i,\n /AUTH_KEY/i,\n /ACCESS_KEY/i,\n];\n\n/**\n * ENV-002: Potential Secret in Environment Metadata\n * Reference: docs/RULE-CATALOGUE.md Section 18\n */\nexport const env002SecretExposure: SyncDiagnosticRule = {\n metadata: {\n id: 'environment.secret.exposure',\n name: 'Potential Secret in Environment Metadata',\n category: 'environment',\n description:\n 'Identify environment variable names that strongly suggest credentials or secrets are present.',\n severity: 'MEDIUM',\n confidence: 'MEDIUM',\n applicability: ['Applicable when environment variable names are available.'],\n requiredEvidence: ['environment.variables'],\n explanation: 'A secret-like environment variable exists and may deserve review.',\n remediationHint: 'Review whether sensitive values are appropriately scoped and managed.',\n },\n isApplicable(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const item = findEvidence(evidence, 'environment.variables');\n return Boolean(item && item.availability === 'AVAILABLE');\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{\n variableNames?: readonly string[];\n suspiciousNames?: readonly string[];\n }>(evidence, 'environment.variables');\n if (!item || item.availability !== 'AVAILABLE' || !item.value) {\n return {\n ruleId: 'environment.secret.exposure',\n status: 'UNAVAILABLE',\n finding: buildFinding(env002SecretExposure.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'Environment variable metadata is unavailable.',\n evidenceItems: item ? [item] : [],\n }),\n };\n }\n\n let suspicious = item.value.suspiciousNames;\n if (!suspicious && item.value.variableNames) {\n suspicious = item.value.variableNames.filter((name) =>\n SECRET_PATTERNS.some((p) => p.test(name)),\n );\n }\n\n if (suspicious && suspicious.length > 0) {\n const safeEvidenceItem: EvidenceItem = {\n key: 'environment.variables',\n source: item.source,\n availability: item.availability,\n value: { variableNames: suspicious },\n };\n return {\n ruleId: 'environment.secret.exposure',\n status: 'WARN',\n finding: buildFinding(env002SecretExposure.metadata, {\n status: 'WARN',\n severity: 'MEDIUM',\n summary: `Detected secret-like environment variable name(s): ${suspicious.join(', ')}.`,\n evidenceItems: [safeEvidenceItem],\n details: { count: suspicious.length, variableNames: suspicious },\n }),\n };\n }\n\n return {\n ruleId: 'environment.secret.exposure',\n status: 'PASS',\n finding: buildFinding(env002SecretExposure.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: 'No suspicious unmanaged secret-like environment variable names detected.',\n evidenceItems: [item],\n }),\n };\n },\n};\n\n/**\n * ENV-003: Duplicate PATH Entry\n * Reference: docs/RULE-CATALOGUE.md Section 18\n */\nexport const env003DuplicatePath: SyncDiagnosticRule = {\n metadata: {\n id: 'environment.path.duplicate',\n name: 'Duplicate PATH Entry',\n category: 'environment',\n description: 'Identify duplicate normalized PATH entries.',\n severity: 'LOW',\n confidence: 'HIGH',\n applicability: ['Applicable when PATH entries are available.'],\n requiredEvidence: ['environment.path'],\n explanation:\n 'Duplicate PATH entries can make environment configuration harder to reason about.',\n remediationHint: 'Review duplicate PATH entries.',\n },\n isApplicable(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const item = findEvidence(evidence, 'environment.path');\n return Boolean(item && item.availability === 'AVAILABLE');\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{ entries?: readonly string[]; duplicates?: readonly string[] }>(\n evidence,\n 'environment.path',\n );\n if (!item || item.availability !== 'AVAILABLE' || !item.value) {\n return {\n ruleId: 'environment.path.duplicate',\n status: 'UNAVAILABLE',\n finding: buildFinding(env003DuplicatePath.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'PATH entries are unavailable.',\n evidenceItems: item ? [item] : [],\n }),\n };\n }\n\n let duplicates = item.value.duplicates;\n if (!duplicates && item.value.entries) {\n const seen = new Set<string>();\n const dups = new Set<string>();\n for (const entry of item.value.entries) {\n const normalized = entry.trim().toLowerCase();\n if (normalized.length > 0) {\n if (seen.has(normalized)) {\n dups.add(entry.trim());\n } else {\n seen.add(normalized);\n }\n }\n }\n duplicates = Array.from(dups);\n }\n\n if (duplicates && duplicates.length > 0) {\n return {\n ruleId: 'environment.path.duplicate',\n status: 'WARN',\n finding: buildFinding(env003DuplicatePath.metadata, {\n status: 'WARN',\n severity: 'LOW',\n summary: `Detected duplicate PATH entry/entries: ${duplicates.join(', ')}.`,\n evidenceItems: [item],\n details: { duplicateCount: duplicates.length, duplicates },\n }),\n };\n }\n\n return {\n ruleId: 'environment.path.duplicate',\n status: 'PASS',\n finding: buildFinding(env003DuplicatePath.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: 'No duplicate PATH entries detected.',\n evidenceItems: [item],\n }),\n };\n },\n};\n\n/**\n * ENV-004: Shell Environment PATH Mismatch\n * Reference: docs/RULE-CATALOGUE.md Section 18\n */\nexport const env004ShellPathMismatch: SyncDiagnosticRule = {\n metadata: {\n id: 'environment.shell.path-mismatch',\n name: 'Shell Environment PATH Mismatch',\n category: 'environment',\n description:\n 'Identify a detectable mismatch between the shell environment PATH and the expected user/system PATH configuration.',\n severity: 'MEDIUM',\n confidence: 'MEDIUM',\n applicability: ['Only where the platform exposes a reliable comparison.'],\n requiredEvidence: ['environment.shell.path'],\n explanation: 'The current shell may resolve tools differently from the expected environment.',\n remediationHint: 'Inspect shell initialization and PATH configuration.',\n },\n isApplicable(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const item = findEvidence(evidence, 'environment.shell.path');\n return Boolean(item && item.availability === 'AVAILABLE');\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{\n isConsistent?: boolean;\n comparisonUnavailable?: boolean;\n mismatchDetails?: string;\n }>(evidence, 'environment.shell.path');\n if (\n !item ||\n item.availability !== 'AVAILABLE' ||\n !item.value ||\n item.value.comparisonUnavailable\n ) {\n return {\n ruleId: 'environment.shell.path-mismatch',\n status: 'UNAVAILABLE',\n finding: buildFinding(env004ShellPathMismatch.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'Shell PATH comparison metadata is unavailable on this platform.',\n evidenceItems: item ? [item] : [],\n }),\n };\n }\n\n if (item.value.isConsistent === false) {\n return {\n ruleId: 'environment.shell.path-mismatch',\n status: 'WARN',\n finding: buildFinding(env004ShellPathMismatch.metadata, {\n status: 'WARN',\n severity: 'MEDIUM',\n summary:\n item.value.mismatchDetails ??\n 'Current shell PATH diverges significantly from persistent system/user PATH.',\n evidenceItems: [item],\n }),\n };\n }\n\n return {\n ruleId: 'environment.shell.path-mismatch',\n status: 'PASS',\n finding: buildFinding(env004ShellPathMismatch.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: 'Shell environment PATH is consistent with persistent system configuration.',\n evidenceItems: [item],\n }),\n };\n },\n};\n\nexport const environmentRules: readonly DiagnosticRule[] = Object.freeze([\n env001EmptyPathEntry,\n env002SecretExposure,\n env003DuplicatePath,\n env004ShellPathMismatch,\n]);\n","import type { SyncDiagnosticRule, DiagnosticRule, DetectionContext } from '../../types.js';\nimport type { EvidenceItem } from '../../../domain/evidence.js';\nimport type { RuleEvaluation } from '../../../domain/rules/rule-definition.js';\nimport { buildFinding, findEvidence } from '../utils.js';\n\nfunction isNodeProject(context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n if (context.targetNodeVersion) return true;\n const projectType = findEvidence<{ primaryType?: string; types?: readonly string[] }>(\n evidence,\n 'project.type',\n );\n if (projectType?.value) {\n if (projectType.value.primaryType === 'node') return true;\n if (projectType.value.types?.includes('node')) return true;\n }\n const manifest = findEvidence<{ manifests?: readonly { name: string }[] }>(\n evidence,\n 'project.manifest',\n );\n return manifest?.value?.manifests?.some((m) => m.name === 'package.json') ?? false;\n}\n\nfunction isPythonProject(context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n if (context.targetPythonVersion) return true;\n const projectType = findEvidence<{ primaryType?: string; types?: readonly string[] }>(\n evidence,\n 'project.type',\n );\n if (projectType?.value) {\n if (projectType.value.primaryType === 'python') return true;\n if (projectType.value.types?.includes('python')) return true;\n }\n const manifest = findEvidence<{ manifests?: readonly { name: string }[] }>(\n evidence,\n 'project.manifest',\n );\n return (\n manifest?.value?.manifests?.some((m) =>\n ['requirements.txt', 'pyproject.toml', 'Pipfile', 'setup.py'].includes(m.name),\n ) ?? false\n );\n}\n\nfunction isJavaProject(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const projectType = findEvidence<{ primaryType?: string; types?: readonly string[] }>(\n evidence,\n 'project.type',\n );\n if (projectType?.value) {\n if (projectType.value.primaryType === 'java') return true;\n if (projectType.value.types?.includes('java')) return true;\n }\n const manifest = findEvidence<{ manifests?: readonly { name: string }[] }>(\n evidence,\n 'project.manifest',\n );\n return (\n manifest?.value?.manifests?.some((m) =>\n ['pom.xml', 'build.gradle', 'build.gradle.kts'].includes(m.name),\n ) ?? false\n );\n}\n\n/**\n * RUN-001: Node.js Runtime Unavailable\n * Reference: docs/RULE-CATALOGUE.md Section 19\n */\nexport const run001NodeUnavailable: SyncDiagnosticRule = {\n metadata: {\n id: 'runtime.node.unavailable',\n name: 'Node.js Runtime Unavailable',\n category: 'runtime',\n description:\n 'Represent inability to determine the Node.js runtime where Node.js is required by the current diagnostic scope.',\n severity: 'INFO',\n confidence: 'HIGH',\n applicability: ['Applicable to Node-related project scopes.'],\n requiredEvidence: ['runtime.node'],\n explanation: 'Node.js executable could not be resolved on PATH for this Node project.',\n remediationHint: 'Install Node.js or ensure the node executable is present on PATH.',\n },\n isApplicable(context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n return isNodeProject(context, evidence);\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{ isAvailable?: boolean; version?: string }>(\n evidence,\n 'runtime.node',\n );\n const available =\n item?.availability === 'AVAILABLE' &&\n item.value?.isAvailable !== false &&\n Boolean(item.value?.version);\n\n if (!available) {\n return {\n ruleId: 'runtime.node.unavailable',\n status: 'UNAVAILABLE',\n finding: buildFinding(run001NodeUnavailable.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'Node.js runtime executable is not available on PATH for this Node project.',\n evidenceItems: item ? [item] : [],\n }),\n };\n }\n\n return {\n ruleId: 'runtime.node.unavailable',\n status: 'PASS',\n finding: buildFinding(run001NodeUnavailable.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: `Node.js is available (${item?.value?.version ?? 'installed'}).`,\n evidenceItems: [item],\n }),\n };\n },\n};\n\n/**\n * RUN-002: Node.js Runtime Unpinned\n * Reference: docs/RULE-CATALOGUE.md Section 19\n */\nexport const run002NodeUnpinned: SyncDiagnosticRule = {\n metadata: {\n id: 'runtime.node.unpinned',\n name: 'Node.js Version Not Pinned',\n category: 'runtime',\n description: 'Identify a Node.js project without an explicit runtime-version policy.',\n severity: 'MEDIUM',\n confidence: 'HIGH',\n applicability: ['Applicable to Node.js projects.'],\n requiredEvidence: ['project.runtime.policy'],\n explanation:\n 'An unpinned runtime can cause different Node.js versions to be used across developer machines.',\n remediationHint:\n 'Define an explicit Node.js version policy using .nvmrc, .node-version, or package.json engines.',\n },\n isApplicable(context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n return isNodeProject(context, evidence);\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const policyItem = findEvidence<{\n policyFiles?: readonly string[];\n engines?: { node?: string };\n }>(evidence, 'project.runtime.policy');\n const nodePolicy =\n policyItem?.value?.policyFiles?.some((f) =>\n ['.nvmrc', '.node-version', '.tool-versions'].includes(f),\n ) || Boolean(policyItem?.value?.engines?.node);\n\n if (!nodePolicy) {\n return {\n ruleId: 'runtime.node.unpinned',\n status: 'FAIL',\n finding: buildFinding(run002NodeUnpinned.metadata, {\n status: 'FAIL',\n severity: 'MEDIUM',\n summary:\n 'Node.js project has no pinned runtime version policy (.nvmrc, .node-version, or engines.node).',\n evidenceItems: policyItem ? [policyItem] : [],\n }),\n };\n }\n\n return {\n ruleId: 'runtime.node.unpinned',\n status: 'PASS',\n finding: buildFinding(run002NodeUnpinned.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: 'Node.js runtime version is explicitly pinned in project configuration.',\n evidenceItems: policyItem ? [policyItem] : [],\n }),\n };\n },\n};\n\n/**\n * RUN-003: Python Runtime Unavailable\n * Reference: docs/RULE-CATALOGUE.md Section 19\n */\nexport const run003PythonUnavailable: SyncDiagnosticRule = {\n metadata: {\n id: 'runtime.python.unavailable',\n name: 'Python Runtime Unavailable',\n category: 'runtime',\n description:\n 'Represent inability to determine Python runtime availability for an applicable Python scope.',\n severity: 'INFO',\n confidence: 'HIGH',\n applicability: ['Python-related projects/scopes only.'],\n requiredEvidence: ['runtime.python'],\n explanation: 'Python executable could not be resolved on PATH.',\n remediationHint: 'Install Python or ensure python/python3 is in your PATH.',\n },\n isApplicable(context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n return isPythonProject(context, evidence);\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{ isAvailable?: boolean; version?: string }>(\n evidence,\n 'runtime.python',\n );\n const available = item?.availability === 'AVAILABLE' && item.value?.isAvailable !== false;\n\n if (!available) {\n return {\n ruleId: 'runtime.python.unavailable',\n status: 'UNAVAILABLE',\n finding: buildFinding(run003PythonUnavailable.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'Python runtime is not available on PATH for this Python project.',\n evidenceItems: item ? [item] : [],\n }),\n };\n }\n\n return {\n ruleId: 'runtime.python.unavailable',\n status: 'PASS',\n finding: buildFinding(run003PythonUnavailable.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: `Python runtime is available (${item.value?.version ?? 'installed'}).`,\n evidenceItems: [item],\n details: { version: item.value?.version ?? '' },\n }),\n };\n },\n};\n\n/**\n * RUN-004: Python Version Not Pinned\n * Reference: docs/RULE-CATALOGUE.md Section 19\n */\nexport const run004PythonUnpinned: SyncDiagnosticRule = {\n metadata: {\n id: 'runtime.python.unpinned',\n name: 'Python Version Not Pinned',\n category: 'runtime',\n description: 'Identify a Python project without an explicit Python runtime policy.',\n severity: 'MEDIUM',\n confidence: 'HIGH',\n applicability: ['Python projects only.'],\n requiredEvidence: ['project.runtime.policy'],\n explanation:\n 'Different Python versions can change dependency behavior and runtime compatibility.',\n remediationHint:\n \"Define the project's Python version policy via .python-version or pyproject.toml.\",\n },\n isApplicable(context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n return isPythonProject(context, evidence);\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const policyItem = findEvidence<{ policyFiles?: readonly string[]; pythonVersion?: string }>(\n evidence,\n 'project.runtime.policy',\n );\n const pythonPolicy =\n policyItem?.value?.policyFiles?.some((f) =>\n ['.python-version', '.tool-versions', 'runtime.txt'].includes(f),\n ) || Boolean(policyItem?.value?.pythonVersion);\n\n if (!pythonPolicy) {\n return {\n ruleId: 'runtime.python.unpinned',\n status: 'FAIL',\n finding: buildFinding(run004PythonUnpinned.metadata, {\n status: 'FAIL',\n severity: 'MEDIUM',\n summary:\n 'Python project has no pinned version policy (.python-version, runtime.txt, or pyproject.toml).',\n evidenceItems: policyItem ? [policyItem] : [],\n }),\n };\n }\n\n return {\n ruleId: 'runtime.python.unpinned',\n status: 'PASS',\n finding: buildFinding(run004PythonUnpinned.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: 'Python runtime version is explicitly pinned in project configuration.',\n evidenceItems: policyItem ? [policyItem] : [],\n }),\n };\n },\n};\n\n/**\n * RUN-005: Java Runtime Unavailable\n * Reference: docs/RULE-CATALOGUE.md Section 19\n */\nexport const run005JavaUnavailable: SyncDiagnosticRule = {\n metadata: {\n id: 'runtime.java.unavailable',\n name: 'Java Runtime Unavailable',\n category: 'runtime',\n description: 'Represent unavailable Java runtime information for an applicable Java scope.',\n severity: 'INFO',\n confidence: 'HIGH',\n applicability: ['Java-related projects/scopes only.'],\n requiredEvidence: ['runtime.java'],\n explanation: 'Java runtime is not available on PATH for this Java project.',\n remediationHint: 'Install Java JDK and configure JAVA_HOME.',\n },\n isApplicable(context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n return isJavaProject(context, evidence);\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{ isAvailable?: boolean; version?: string }>(\n evidence,\n 'runtime.java',\n );\n const available = item?.availability === 'AVAILABLE' && item.value?.isAvailable !== false;\n\n if (!available) {\n return {\n ruleId: 'runtime.java.unavailable',\n status: 'UNAVAILABLE',\n finding: buildFinding(run005JavaUnavailable.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'Java runtime is not available on PATH for this Java project.',\n evidenceItems: item ? [item] : [],\n }),\n };\n }\n\n return {\n ruleId: 'runtime.java.unavailable',\n status: 'PASS',\n finding: buildFinding(run005JavaUnavailable.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: `Java runtime is available (${item.value?.version ?? 'installed'}).`,\n evidenceItems: [item],\n details: { version: item.value?.version ?? '' },\n }),\n };\n },\n};\n\n/**\n * RUN-006: Runtime Version Mismatch\n * Reference: docs/RULE-CATALOGUE.md Section 19\n */\nexport const run006VersionMismatch: SyncDiagnosticRule = {\n metadata: {\n id: 'runtime.version.mismatch',\n name: 'Runtime Version Mismatch',\n category: 'runtime',\n description: 'Identify a runtime version that conflicts with an explicit project requirement.',\n severity: 'HIGH',\n confidence: 'HIGH',\n applicability: ['Only when an explicit runtime requirement exists.'],\n requiredEvidence: ['runtime.version.requirement'],\n explanation:\n 'The installed or active runtime version does not satisfy the project requirement.',\n remediationHint: \"Use the project's documented runtime version.\",\n },\n isApplicable(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const item = findEvidence(evidence, 'runtime.version.requirement');\n return Boolean(item && item.availability === 'AVAILABLE');\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{\n runtimeName?: string;\n resolvedVersion?: string;\n requiredVersion?: string;\n isSatisfied?: boolean;\n }>(evidence, 'runtime.version.requirement');\n\n if (!item || item.availability !== 'AVAILABLE' || !item.value) {\n return {\n ruleId: 'runtime.version.mismatch',\n status: 'SKIPPED',\n };\n }\n\n if (item.value.isSatisfied === false) {\n return {\n ruleId: 'runtime.version.mismatch',\n status: 'FAIL',\n finding: buildFinding(run006VersionMismatch.metadata, {\n status: 'FAIL',\n severity: 'HIGH',\n summary: `${item.value.runtimeName ?? 'Runtime'} version '${item.value.resolvedVersion ?? 'unknown'}' does not satisfy project requirement '${item.value.requiredVersion ?? 'unknown'}'.`,\n evidenceItems: [item],\n details: {\n runtime: item.value.runtimeName ?? 'runtime',\n resolved: item.value.resolvedVersion ?? '',\n required: item.value.requiredVersion ?? '',\n },\n }),\n };\n }\n\n return {\n ruleId: 'runtime.version.mismatch',\n status: 'PASS',\n finding: buildFinding(run006VersionMismatch.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: `${item.value.runtimeName ?? 'Runtime'} version satisfies project requirements.`,\n evidenceItems: [item],\n }),\n };\n },\n};\n\nexport const runtimeRules: readonly DiagnosticRule[] = Object.freeze([\n run001NodeUnavailable,\n run002NodeUnpinned,\n run003PythonUnavailable,\n run004PythonUnpinned,\n run005JavaUnavailable,\n run006VersionMismatch,\n]);\n","import type { SyncDiagnosticRule, DiagnosticRule, DetectionContext } from '../../types.js';\nimport type { EvidenceItem } from '../../../domain/evidence.js';\nimport type { RuleEvaluation } from '../../../domain/rules/rule-definition.js';\nimport { buildFinding, findEvidence } from '../utils.js';\n\nfunction hasGitContext(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const gitItem = findEvidence<{ isRepository?: boolean }>(evidence, 'project.git');\n return gitItem?.value?.isRepository === true;\n}\n\nfunction hasDockerContext(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const configItem = findEvidence<{ configFiles?: readonly { name: string }[] }>(\n evidence,\n 'project.config',\n );\n return (\n configItem?.value?.configFiles?.some((f) =>\n ['Dockerfile', 'docker-compose.yml', 'docker-compose.yaml', 'compose.yaml'].includes(f.name),\n ) ?? false\n );\n}\n\n/**\n * TOOL-001: Git Unavailable\n * Reference: docs/RULE-CATALOGUE.md Section 20\n */\nexport const tool001GitUnavailable: SyncDiagnosticRule = {\n metadata: {\n id: 'tool.git.unavailable',\n name: 'Git Unavailable',\n category: 'tool',\n description: 'Represent inability to resolve Git when a Git scope requires it.',\n severity: 'INFO',\n confidence: 'HIGH',\n applicability: ['Git-related project/scopes.'],\n requiredEvidence: ['tool.git'],\n explanation: 'Git executable is not available on PATH for this repository.',\n remediationHint: 'Install Git and add git to your PATH environment variable.',\n },\n isApplicable(context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n return hasGitContext(context, evidence);\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{ isAvailable?: boolean; version?: string }>(evidence, 'tool.git');\n const available = item?.availability === 'AVAILABLE' && item.value?.isAvailable !== false;\n\n if (!available) {\n return {\n ruleId: 'tool.git.unavailable',\n status: 'UNAVAILABLE',\n finding: buildFinding(tool001GitUnavailable.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'Git command-line tool is not available on PATH for this Git project.',\n evidenceItems: item ? [item] : [],\n }),\n };\n }\n\n return {\n ruleId: 'tool.git.unavailable',\n status: 'PASS',\n finding: buildFinding(tool001GitUnavailable.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: `Git is available (${item.value?.version ?? 'installed'}).`,\n evidenceItems: [item],\n details: { version: item.value?.version ?? '' },\n }),\n };\n },\n};\n\n/**\n * TOOL-002: Package Manager Mismatch\n * Reference: docs/RULE-CATALOGUE.md Section 20\n */\nexport const tool002PackageManagerMismatch: SyncDiagnosticRule = {\n metadata: {\n id: 'tool.package-manager.mismatch',\n name: 'Package Manager Mismatch',\n category: 'tool',\n description:\n 'Identify when project metadata indicates one package manager while another appears to be the active/resolved package manager.',\n severity: 'MEDIUM',\n confidence: 'HIGH',\n applicability: ['Applicable to supported package-manager projects.'],\n requiredEvidence: ['project.lockfile', 'tool.package-manager'],\n explanation: 'Different package managers can resolve dependencies differently.',\n remediationHint: 'Use the package manager specified by the project.',\n },\n isApplicable(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const lockfileItem = findEvidence(evidence, 'project.lockfile');\n return Boolean(lockfileItem && lockfileItem.availability === 'AVAILABLE');\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const toolPm = findEvidence<{\n activePackageManager?: string;\n declaredPackageManager?: string;\n isMismatch?: boolean;\n }>(evidence, 'tool.package-manager');\n const lockfileItem = findEvidence<{ packageManager?: string }>(evidence, 'project.lockfile');\n\n if (!toolPm || toolPm.availability !== 'AVAILABLE') {\n return {\n ruleId: 'tool.package-manager.mismatch',\n status: 'UNAVAILABLE',\n finding: buildFinding(tool002PackageManagerMismatch.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'Active package manager information is unavailable for comparison.',\n evidenceItems: toolPm ? [toolPm] : [],\n }),\n };\n }\n\n const declared = toolPm.value?.declaredPackageManager ?? lockfileItem?.value?.packageManager;\n const active = toolPm.value?.activePackageManager;\n const isMismatch =\n toolPm.value?.isMismatch ?? (Boolean(declared) && Boolean(active) && declared !== active);\n\n if (isMismatch) {\n return {\n ruleId: 'tool.package-manager.mismatch',\n status: 'WARN',\n finding: buildFinding(tool002PackageManagerMismatch.metadata, {\n status: 'WARN',\n severity: 'MEDIUM',\n summary: `Active package manager '${active}' does not match project expected package manager '${declared}'.`,\n evidenceItems: [toolPm],\n details: { active: active ?? '', expected: declared ?? '' },\n }),\n };\n }\n\n return {\n ruleId: 'tool.package-manager.mismatch',\n status: 'PASS',\n finding: buildFinding(tool002PackageManagerMismatch.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: `Package manager '${active ?? declared ?? 'detected'}' matches project configuration.`,\n evidenceItems: [toolPm],\n }),\n };\n },\n};\n\n/**\n * TOOL-003: Required Package Manager Missing\n * Reference: docs/RULE-CATALOGUE.md Section 20\n */\nexport const tool003PackageManagerMissing: SyncDiagnosticRule = {\n metadata: {\n id: 'tool.package-manager.missing',\n name: 'Required Package Manager Missing',\n category: 'tool',\n description:\n 'Identify when a project explicitly requires a package manager that cannot be resolved.',\n severity: 'HIGH',\n confidence: 'HIGH',\n applicability: ['Only when the project explicitly identifies a package manager.'],\n requiredEvidence: ['tool.package-manager.availability'],\n explanation:\n 'The project identifies a package manager that is not available on the current PATH.',\n remediationHint: \"Install/use the project's documented package manager manually.\",\n },\n isApplicable(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const item = findEvidence<{ expectedPackageManager?: string }>(\n evidence,\n 'tool.package-manager.availability',\n );\n return Boolean(item && item.value?.expectedPackageManager);\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{\n expectedPackageManager?: string;\n isAvailable?: boolean;\n }>(evidence, 'tool.package-manager.availability');\n\n if (!item || !item.value?.expectedPackageManager) {\n return {\n ruleId: 'tool.package-manager.missing',\n status: 'SKIPPED',\n };\n }\n\n if (item.value.isAvailable === false) {\n return {\n ruleId: 'tool.package-manager.missing',\n status: 'FAIL',\n finding: buildFinding(tool003PackageManagerMissing.metadata, {\n status: 'FAIL',\n severity: 'HIGH',\n summary: `Required package manager '${item.value.expectedPackageManager}' is not available on PATH.`,\n evidenceItems: [item],\n details: { packageManager: item.value.expectedPackageManager },\n }),\n };\n }\n\n return {\n ruleId: 'tool.package-manager.missing',\n status: 'PASS',\n finding: buildFinding(tool003PackageManagerMissing.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: `Required package manager '${item.value.expectedPackageManager}' is available on PATH.`,\n evidenceItems: [item],\n }),\n };\n },\n};\n\n/**\n * TOOL-004: Docker Unavailable\n * Reference: docs/RULE-CATALOGUE.md Section 20\n */\nexport const tool004DockerUnavailable: SyncDiagnosticRule = {\n metadata: {\n id: 'tool.docker.unavailable',\n name: 'Docker Unavailable',\n category: 'tool',\n description:\n 'Represent Docker availability when Docker is explicitly relevant to the detected project.',\n severity: 'INFO',\n confidence: 'HIGH',\n applicability: ['Docker-related projects only.'],\n requiredEvidence: ['tool.docker'],\n explanation: 'Docker executable could not be resolved on PATH for this containerized project.',\n remediationHint: 'Install Docker or ensure docker is available in PATH.',\n },\n isApplicable(context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n return hasDockerContext(context, evidence);\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{ isAvailable?: boolean; version?: string }>(evidence, 'tool.docker');\n const available = item?.availability === 'AVAILABLE' && item.value?.isAvailable !== false;\n\n if (!available) {\n return {\n ruleId: 'tool.docker.unavailable',\n status: 'UNAVAILABLE',\n finding: buildFinding(tool004DockerUnavailable.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'Docker is not available on PATH for this containerized project.',\n evidenceItems: item ? [item] : [],\n }),\n };\n }\n\n return {\n ruleId: 'tool.docker.unavailable',\n status: 'PASS',\n finding: buildFinding(tool004DockerUnavailable.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: `Docker is available (${item.value?.version ?? 'installed'}).`,\n evidenceItems: [item],\n details: { version: item.value?.version ?? '' },\n }),\n };\n },\n};\n\n/**\n * TOOL-005: Executable Shadowing\n * Reference: docs/RULE-CATALOGUE.md Section 20\n */\nexport const tool005ExecutableShadowing: SyncDiagnosticRule = {\n metadata: {\n id: 'tool.executable.shadowing',\n name: 'Executable Shadowing',\n category: 'tool',\n description:\n 'Identify multiple executable locations for the same developer tool where PATH ordering can determine which version is used.',\n severity: 'MEDIUM',\n confidence: 'HIGH',\n applicability: ['Applicable when tool executable resolution is inspected.'],\n requiredEvidence: ['tool.shadowing'],\n explanation: 'Multiple installations can make tool resolution unpredictable.',\n remediationHint: 'Inspect PATH ordering and remove unintended duplicate installations.',\n },\n isApplicable(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const item = findEvidence(evidence, 'tool.shadowing');\n return Boolean(item && item.availability === 'AVAILABLE');\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{\n toolName?: string;\n hasShadowing?: boolean;\n locations?: readonly string[];\n }>(evidence, 'tool.shadowing');\n\n if (!item || item.availability !== 'AVAILABLE' || !item.value) {\n return {\n ruleId: 'tool.executable.shadowing',\n status: 'SKIPPED',\n };\n }\n\n if (item.value.hasShadowing && (item.value.locations?.length ?? 0) > 1) {\n return {\n ruleId: 'tool.executable.shadowing',\n status: 'WARN',\n finding: buildFinding(tool005ExecutableShadowing.metadata, {\n status: 'WARN',\n severity: 'MEDIUM',\n summary: `Executable shadowing detected for tool '${item.value.toolName ?? 'unknown'}': found at multiple PATH locations (${item.value.locations?.join(', ')}).`,\n evidenceItems: [item],\n details: { tool: item.value.toolName ?? '', count: item.value.locations?.length ?? 0 },\n }),\n };\n }\n\n return {\n ruleId: 'tool.executable.shadowing',\n status: 'PASS',\n finding: buildFinding(tool005ExecutableShadowing.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: `No executable shadowing detected for '${item.value.toolName ?? 'tools'}'.`,\n evidenceItems: [item],\n }),\n };\n },\n};\n\nexport const toolRules: readonly DiagnosticRule[] = Object.freeze([\n tool001GitUnavailable,\n tool002PackageManagerMismatch,\n tool003PackageManagerMissing,\n tool004DockerUnavailable,\n tool005ExecutableShadowing,\n]);\n","import type { SyncDiagnosticRule, DiagnosticRule, DetectionContext } from '../../types.js';\nimport type { EvidenceItem } from '../../../domain/evidence.js';\nimport type { RuleEvaluation } from '../../../domain/rules/rule-definition.js';\nimport { buildFinding, findEvidence } from '../utils.js';\n\n/**\n * PATH-001: Expected Executable Missing\n * Reference: docs/RULE-CATALOGUE.md Section 21\n */\nexport const path001ExecutableMissing: SyncDiagnosticRule = {\n metadata: {\n id: 'path.executable.missing',\n name: 'Expected Executable Missing',\n category: 'path',\n description: 'Identify an explicitly required executable that cannot be resolved.',\n severity: 'HIGH',\n confidence: 'HIGH',\n applicability: ['Only when a project/tool explicitly requires the executable.'],\n requiredEvidence: ['path.executable.requirement'],\n explanation: 'An explicitly required executable could not be resolved on PATH.',\n remediationHint:\n 'Install the missing executable or add its directory to the PATH environment variable.',\n },\n isApplicable(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const item = findEvidence(evidence, 'path.executable.requirement');\n return Boolean(item && item.availability === 'AVAILABLE');\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{\n executableName?: string;\n isResolved?: boolean;\n resolvedPath?: string;\n }>(evidence, 'path.executable.requirement');\n\n if (!item || item.availability !== 'AVAILABLE' || !item.value?.executableName) {\n return {\n ruleId: 'path.executable.missing',\n status: 'SKIPPED',\n };\n }\n\n if (item.value.isResolved === false || !item.value.resolvedPath) {\n return {\n ruleId: 'path.executable.missing',\n status: 'FAIL',\n finding: buildFinding(path001ExecutableMissing.metadata, {\n status: 'FAIL',\n severity: 'HIGH',\n summary: `Required executable '${item.value.executableName}' could not be resolved on PATH.`,\n evidenceItems: [item],\n details: { executable: item.value.executableName },\n }),\n };\n }\n\n return {\n ruleId: 'path.executable.missing',\n status: 'PASS',\n finding: buildFinding(path001ExecutableMissing.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: `Required executable '${item.value.executableName}' was successfully resolved.`,\n evidenceItems: [item],\n details: { executable: item.value.executableName, path: item.value.resolvedPath },\n }),\n };\n },\n};\n\n/**\n * PATH-002: Multiple Executable Resolutions\n * Reference: docs/RULE-CATALOGUE.md Section 21\n */\nexport const path002ExecutableMultiple: SyncDiagnosticRule = {\n metadata: {\n id: 'path.executable.multiple',\n name: 'Multiple Executable Resolutions',\n category: 'path',\n description:\n 'Identify multiple installations of the same executable available through PATH resolution.',\n severity: 'LOW',\n confidence: 'HIGH',\n applicability: ['Applicable when inspecting PATH executable resolutions.'],\n requiredEvidence: ['path.executable.resolutions'],\n explanation:\n 'Multiple installations of an executable exist on PATH, which may cause unintended resolution.',\n remediationHint: 'Inspect PATH order to confirm intended executable takes precedence.',\n },\n isApplicable(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const item = findEvidence(evidence, 'path.executable.resolutions');\n return Boolean(item && item.availability === 'AVAILABLE');\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{\n executableName?: string;\n locations?: readonly string[];\n }>(evidence, 'path.executable.resolutions');\n\n if (!item || item.availability !== 'AVAILABLE' || !item.value) {\n return {\n ruleId: 'path.executable.multiple',\n status: 'SKIPPED',\n };\n }\n\n const locs = item.value.locations ?? [];\n if (locs.length > 1) {\n return {\n ruleId: 'path.executable.multiple',\n status: 'WARN',\n finding: buildFinding(path002ExecutableMultiple.metadata, {\n status: 'WARN',\n severity: 'LOW',\n summary: `Multiple resolutions found for executable '${item.value.executableName ?? 'tool'}': ${locs.join(', ')}.`,\n evidenceItems: [item],\n details: { count: locs.length, locations: locs },\n }),\n };\n }\n\n return {\n ruleId: 'path.executable.multiple',\n status: 'PASS',\n finding: buildFinding(path002ExecutableMultiple.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: `Single resolution for executable '${item.value.executableName ?? 'tool'}'.`,\n evidenceItems: [item],\n }),\n };\n },\n};\n\n/**\n * PATH-003: Invalid PATH Entry\n * Reference: docs/RULE-CATALOGUE.md Section 21\n */\nexport const path003EntryInvalid: SyncDiagnosticRule = {\n metadata: {\n id: 'path.entry.invalid',\n name: 'Invalid PATH Entry',\n category: 'path',\n description: 'Identify PATH entries that are syntactically or structurally invalid.',\n severity: 'LOW',\n confidence: 'HIGH',\n applicability: ['Applicable when PATH validation evidence is available.'],\n requiredEvidence: ['path.validation'],\n explanation: 'PATH contains non-existent or structurally invalid directory entries.',\n remediationHint: 'Remove invalid or deleted directories from your PATH environment variable.',\n },\n isApplicable(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const item = findEvidence(evidence, 'path.validation');\n return Boolean(item && item.availability === 'AVAILABLE');\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{\n invalidEntries?: readonly string[];\n hasInvalidEntries?: boolean;\n }>(evidence, 'path.validation');\n\n if (!item || item.availability !== 'AVAILABLE' || !item.value) {\n return {\n ruleId: 'path.entry.invalid',\n status: 'UNAVAILABLE',\n finding: buildFinding(path003EntryInvalid.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'PATH validation evidence is unavailable.',\n evidenceItems: item ? [item] : [],\n }),\n };\n }\n\n const invalid = item.value.invalidEntries ?? [];\n if (invalid.length > 0 || item.value.hasInvalidEntries) {\n return {\n ruleId: 'path.entry.invalid',\n status: 'WARN',\n finding: buildFinding(path003EntryInvalid.metadata, {\n status: 'WARN',\n severity: 'LOW',\n summary: `Detected invalid or non-existent PATH entries: ${invalid.join(', ')}.`,\n evidenceItems: [item],\n details: { invalidCount: invalid.length, invalidEntries: invalid },\n }),\n };\n }\n\n return {\n ruleId: 'path.entry.invalid',\n status: 'PASS',\n finding: buildFinding(path003EntryInvalid.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: 'All PATH entries are valid existing directories.',\n evidenceItems: [item],\n }),\n };\n },\n};\n\n/**\n * PATH-004: PATH Order Shadowing\n * Reference: docs/RULE-CATALOGUE.md Section 21\n */\nexport const path004OrderShadowing: SyncDiagnosticRule = {\n metadata: {\n id: 'path.order.shadowing',\n name: 'PATH Order Shadowing',\n category: 'path',\n description:\n 'Identify PATH ordering where an unintended executable precedes the project expected executable.',\n severity: 'MEDIUM',\n confidence: 'HIGH',\n applicability: ['Only when an explicit expected executable/tool version is known.'],\n requiredEvidence: ['path.order.shadowing'],\n explanation: 'An unexpected earlier executable is shadowing the project expected executable.',\n remediationHint: 'Reorder PATH entries so the project intended executable appears first.',\n },\n isApplicable(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const item = findEvidence(evidence, 'path.order.shadowing');\n return Boolean(item && item.availability === 'AVAILABLE');\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{\n expectedPath?: string;\n resolvedPath?: string;\n isShadowed?: boolean;\n toolName?: string;\n }>(evidence, 'path.order.shadowing');\n\n if (!item || item.availability !== 'AVAILABLE' || !item.value) {\n return {\n ruleId: 'path.order.shadowing',\n status: 'SKIPPED',\n };\n }\n\n if (item.value.isShadowed) {\n return {\n ruleId: 'path.order.shadowing',\n status: 'WARN',\n finding: buildFinding(path004OrderShadowing.metadata, {\n status: 'WARN',\n severity: 'MEDIUM',\n summary: `Executable '${item.value.toolName ?? 'tool'}' resolves to '${item.value.resolvedPath}', shadowing expected '${item.value.expectedPath}'.`,\n evidenceItems: [item],\n details: {\n resolved: item.value.resolvedPath ?? '',\n expected: item.value.expectedPath ?? '',\n },\n }),\n };\n }\n\n return {\n ruleId: 'path.order.shadowing',\n status: 'PASS',\n finding: buildFinding(path004OrderShadowing.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: `PATH order correctly resolves the expected executable '${item.value.toolName ?? 'tool'}'.`,\n evidenceItems: [item],\n }),\n };\n },\n};\n\nexport const pathRules: readonly DiagnosticRule[] = Object.freeze([\n path001ExecutableMissing,\n path002ExecutableMultiple,\n path003EntryInvalid,\n path004OrderShadowing,\n]);\n","import type { SyncDiagnosticRule, DiagnosticRule, DetectionContext } from '../../types.js';\nimport type { EvidenceItem } from '../../../domain/evidence.js';\nimport type { RuleEvaluation } from '../../../domain/rules/rule-definition.js';\nimport { buildFinding, findEvidence } from '../utils.js';\n\n/**\n * VER-001: Runtime Version Conflict\n * Reference: docs/RULE-CATALOGUE.md Section 22\n */\nexport const ver001RuntimeConflict: SyncDiagnosticRule = {\n metadata: {\n id: 'version.runtime.conflict',\n name: 'Runtime Version Conflict',\n category: 'version',\n description: 'Identify conflicting versions of the same runtime available on the workstation.',\n severity: 'MEDIUM',\n confidence: 'HIGH',\n applicability: ['Applicable when multiple runtime versions are detected.'],\n requiredEvidence: ['version.runtime.conflict'],\n explanation: 'Conflicting versions of the same runtime were detected on PATH.',\n remediationHint: 'Standardize on a single runtime version or configure a version manager.',\n },\n isApplicable(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const item = findEvidence(evidence, 'version.runtime.conflict');\n return Boolean(item && item.availability === 'AVAILABLE');\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{\n runtimeName?: string;\n hasConflict?: boolean;\n versionsFound?: readonly string[];\n }>(evidence, 'version.runtime.conflict');\n\n if (!item || item.availability !== 'AVAILABLE' || !item.value) {\n return {\n ruleId: 'version.runtime.conflict',\n status: 'SKIPPED',\n };\n }\n\n if (item.value.hasConflict && (item.value.versionsFound?.length ?? 0) > 1) {\n return {\n ruleId: 'version.runtime.conflict',\n status: 'WARN',\n finding: buildFinding(ver001RuntimeConflict.metadata, {\n status: 'WARN',\n severity: 'MEDIUM',\n summary: `Conflicting versions found for runtime '${item.value.runtimeName ?? 'runtime'}': ${item.value.versionsFound?.join(', ')}.`,\n evidenceItems: [item],\n details: {\n runtime: item.value.runtimeName ?? '',\n versions: item.value.versionsFound ?? [],\n },\n }),\n };\n }\n\n return {\n ruleId: 'version.runtime.conflict',\n status: 'PASS',\n finding: buildFinding(ver001RuntimeConflict.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: `No conflicting versions detected for runtime '${item.value.runtimeName ?? 'runtime'}'.`,\n evidenceItems: [item],\n }),\n };\n },\n};\n\n/**\n * VER-002: Developer Tool Version Conflict\n * Reference: docs/RULE-CATALOGUE.md Section 22\n */\nexport const ver002ToolConflict: SyncDiagnosticRule = {\n metadata: {\n id: 'version.tool.conflict',\n name: 'Developer Tool Version Conflict',\n category: 'version',\n description:\n 'Identify multiple versions of a developer tool that may be selected differently depending on PATH.',\n severity: 'MEDIUM',\n confidence: 'HIGH',\n applicability: ['Applicable when multiple versions of a developer tool are detected.'],\n requiredEvidence: ['version.tool.conflict'],\n explanation: 'Multiple versions of a developer tool are present on PATH.',\n remediationHint: 'Remove conflicting installations or fix PATH priority.',\n },\n isApplicable(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const item = findEvidence(evidence, 'version.tool.conflict');\n return Boolean(item && item.availability === 'AVAILABLE');\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{\n toolName?: string;\n hasConflict?: boolean;\n versionsFound?: readonly string[];\n }>(evidence, 'version.tool.conflict');\n\n if (!item || item.availability !== 'AVAILABLE' || !item.value) {\n return {\n ruleId: 'version.tool.conflict',\n status: 'SKIPPED',\n };\n }\n\n if (item.value.hasConflict && (item.value.versionsFound?.length ?? 0) > 1) {\n return {\n ruleId: 'version.tool.conflict',\n status: 'WARN',\n finding: buildFinding(ver002ToolConflict.metadata, {\n status: 'WARN',\n severity: 'MEDIUM',\n summary: `Conflicting versions found for tool '${item.value.toolName ?? 'tool'}': ${item.value.versionsFound?.join(', ')}.`,\n evidenceItems: [item],\n details: { tool: item.value.toolName ?? '', versions: item.value.versionsFound ?? [] },\n }),\n };\n }\n\n return {\n ruleId: 'version.tool.conflict',\n status: 'PASS',\n finding: buildFinding(ver002ToolConflict.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: `No conflicting versions detected for tool '${item.value.toolName ?? 'tool'}'.`,\n evidenceItems: [item],\n }),\n };\n },\n};\n\n/**\n * VER-003: Project Runtime Requirement Unsatisfied\n * Reference: docs/RULE-CATALOGUE.md Section 22\n */\nexport const ver003ProjectRuntimeUnsatisfied: SyncDiagnosticRule = {\n metadata: {\n id: 'version.project.runtime.unsatisfied',\n name: 'Project Runtime Requirement Unsatisfied',\n category: 'version',\n description:\n 'Identify when a resolved runtime version does not satisfy an explicit project requirement.',\n severity: 'HIGH',\n confidence: 'HIGH',\n applicability: ['Only when an explicit project runtime requirement is defined.'],\n requiredEvidence: ['version.project.runtime'],\n explanation:\n 'The current runtime version fails to satisfy the version requirement specified by the project.',\n remediationHint: 'Install or switch to a runtime version matching the project specification.',\n },\n isApplicable(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const item = findEvidence(evidence, 'version.project.runtime');\n return Boolean(item && item.availability === 'AVAILABLE');\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{\n runtimeName?: string;\n resolvedVersion?: string;\n requiredRange?: string;\n isSatisfied?: boolean;\n }>(evidence, 'version.project.runtime');\n\n if (!item || item.availability !== 'AVAILABLE' || !item.value) {\n return {\n ruleId: 'version.project.runtime.unsatisfied',\n status: 'SKIPPED',\n };\n }\n\n if (item.value.isSatisfied === false) {\n return {\n ruleId: 'version.project.runtime.unsatisfied',\n status: 'FAIL',\n finding: buildFinding(ver003ProjectRuntimeUnsatisfied.metadata, {\n status: 'FAIL',\n severity: 'HIGH',\n summary: `Active ${item.value.runtimeName ?? 'runtime'} version '${item.value.resolvedVersion ?? 'unknown'}' does not satisfy project requirement '${item.value.requiredRange ?? 'unknown'}'.`,\n evidenceItems: [item],\n details: {\n runtime: item.value.runtimeName ?? '',\n resolved: item.value.resolvedVersion ?? '',\n required: item.value.requiredRange ?? '',\n },\n }),\n };\n }\n\n return {\n ruleId: 'version.project.runtime.unsatisfied',\n status: 'PASS',\n finding: buildFinding(ver003ProjectRuntimeUnsatisfied.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: `Active ${item.value.runtimeName ?? 'runtime'} version '${item.value.resolvedVersion ?? ''}' satisfies project requirement.`,\n evidenceItems: [item],\n }),\n };\n },\n};\n\n/**\n * VER-004: Developer Tool Version Below Project Requirement\n * Reference: docs/RULE-CATALOGUE.md Section 22\n */\nexport const ver004ToolOutdated: SyncDiagnosticRule = {\n metadata: {\n id: 'version.tool.outdated',\n name: 'Developer Tool Version Below Project Requirement',\n category: 'version',\n description: 'Identify a developer tool version that is below an explicit project requirement.',\n severity: 'MEDIUM',\n confidence: 'HIGH',\n applicability: ['Only when a minimum version is explicitly defined.'],\n requiredEvidence: ['version.tool.requirement'],\n explanation: 'The installed tool version is older than the required minimum version.',\n remediationHint: 'Upgrade the tool to satisfy the minimum version requirement.',\n },\n isApplicable(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const item = findEvidence(evidence, 'version.tool.requirement');\n return Boolean(item && item.availability === 'AVAILABLE');\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{\n toolName?: string;\n installedVersion?: string;\n minimumVersion?: string;\n isOutdated?: boolean;\n }>(evidence, 'version.tool.requirement');\n\n if (!item || item.availability !== 'AVAILABLE' || !item.value) {\n return {\n ruleId: 'version.tool.outdated',\n status: 'SKIPPED',\n };\n }\n\n if (item.value.isOutdated) {\n return {\n ruleId: 'version.tool.outdated',\n status: 'FAIL',\n finding: buildFinding(ver004ToolOutdated.metadata, {\n status: 'FAIL',\n severity: 'MEDIUM',\n summary: `Tool '${item.value.toolName ?? 'tool'}' version '${item.value.installedVersion}' is below required minimum '${item.value.minimumVersion}'.`,\n evidenceItems: [item],\n details: {\n tool: item.value.toolName ?? '',\n installed: item.value.installedVersion ?? '',\n minimum: item.value.minimumVersion ?? '',\n },\n }),\n };\n }\n\n return {\n ruleId: 'version.tool.outdated',\n status: 'PASS',\n finding: buildFinding(ver004ToolOutdated.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: `Tool '${item.value.toolName ?? 'tool'}' satisfies the minimum version requirement.`,\n evidenceItems: [item],\n }),\n };\n },\n};\n\nexport const versionRules: readonly DiagnosticRule[] = Object.freeze([\n ver001RuntimeConflict,\n ver002ToolConflict,\n ver003ProjectRuntimeUnsatisfied,\n ver004ToolOutdated,\n]);\n","import type { SyncDiagnosticRule, DiagnosticRule, DetectionContext } from '../../types.js';\nimport type { EvidenceItem } from '../../../domain/evidence.js';\nimport type { RuleEvaluation } from '../../../domain/rules/rule-definition.js';\nimport { buildFinding, findEvidence } from '../utils.js';\n\nfunction isRecognizedProject(\n _context: DetectionContext,\n evidence: readonly EvidenceItem[],\n): boolean {\n const root = findEvidence<{ isProject?: boolean }>(evidence, 'project.root');\n return root?.value?.isProject === true;\n}\n\n/**\n * PROJ-001: Project Manifest Missing\n * Reference: docs/RULE-CATALOGUE.md Section 23\n */\nexport const proj001ManifestMissing: SyncDiagnosticRule = {\n metadata: {\n id: 'project.manifest.missing',\n name: 'Project Manifest Missing',\n category: 'project',\n description:\n 'Identify a project-like directory that lacks the manifest expected for its detected project type.',\n severity: 'MEDIUM',\n confidence: 'MEDIUM',\n applicability: ['Only when project type can be determined with sufficient confidence.'],\n requiredEvidence: ['project.type', 'project.manifest'],\n explanation:\n 'The project appears to belong to an ecosystem but lacks an expected manifest file.',\n remediationHint: 'Create the appropriate manifest file for your project.',\n },\n isApplicable(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const typeItem = findEvidence<{ primaryType?: string }>(evidence, 'project.type');\n return Boolean(\n typeItem && typeItem.value?.primaryType && typeItem.value.primaryType !== 'unknown',\n );\n },\n\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const manifestItem = findEvidence<{ count?: number; manifests?: readonly unknown[] }>(\n evidence,\n 'project.manifest',\n );\n const typeItem = findEvidence<{ primaryType?: string }>(evidence, 'project.type');\n\n if (\n !manifestItem ||\n manifestItem.availability !== 'AVAILABLE' ||\n (manifestItem.value?.count ?? 0) === 0\n ) {\n return {\n ruleId: 'project.manifest.missing',\n status: 'WARN',\n finding: buildFinding(proj001ManifestMissing.metadata, {\n status: 'WARN',\n severity: 'MEDIUM',\n summary: `Project appears to be '${typeItem?.value?.primaryType ?? 'typed'}' but lacks expected manifest file.`,\n evidenceItems: manifestItem ? [manifestItem] : [],\n }),\n };\n }\n\n return {\n ruleId: 'project.manifest.missing',\n status: 'PASS',\n finding: buildFinding(proj001ManifestMissing.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: 'Expected project manifest file is present.',\n evidenceItems: [manifestItem],\n }),\n };\n },\n};\n\n/**\n * PROJ-002: Project Lockfile Missing\n * Reference: docs/RULE-CATALOGUE.md Section 23\n */\nexport const proj002LockfileMissing: SyncDiagnosticRule = {\n metadata: {\n id: 'project.lockfile.missing',\n name: 'Project Lockfile Missing',\n category: 'project',\n description: 'Identify a dependency-managed project without an expected lockfile.',\n severity: 'HIGH',\n confidence: 'HIGH',\n applicability: ['Only for project ecosystems where a lockfile is expected.'],\n requiredEvidence: ['project.lockfile'],\n explanation:\n 'A missing lockfile can allow dependency resolution to differ between environments.',\n remediationHint:\n 'Use the project dependency workflow to generate and commit the appropriate lockfile.',\n },\n isApplicable(context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n return isRecognizedProject(context, evidence);\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const lockItem = findEvidence<{ lockfiles?: readonly unknown[] }>(evidence, 'project.lockfile');\n\n if (\n !lockItem ||\n lockItem.availability !== 'AVAILABLE' ||\n (lockItem.value?.lockfiles?.length ?? 0) === 0\n ) {\n return {\n ruleId: 'project.lockfile.missing',\n status: 'FAIL',\n finding: buildFinding(proj002LockfileMissing.metadata, {\n status: 'FAIL',\n severity: 'HIGH',\n summary: 'Project uses dependency management but no lockfile was found.',\n evidenceItems: lockItem ? [lockItem] : [],\n }),\n };\n }\n\n return {\n ruleId: 'project.lockfile.missing',\n status: 'PASS',\n finding: buildFinding(proj002LockfileMissing.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: 'Project lockfile is present.',\n evidenceItems: [lockItem],\n }),\n };\n },\n};\n\n/**\n * PROJ-003: Project Runtime Policy Missing\n * Reference: docs/RULE-CATALOGUE.md Section 23\n */\nexport const proj003RuntimePolicyMissing: SyncDiagnosticRule = {\n metadata: {\n id: 'project.runtime.policy.missing',\n name: 'Project Runtime Policy Missing',\n category: 'project',\n description: 'Identify a recognized project without an explicit runtime version policy.',\n severity: 'MEDIUM',\n confidence: 'HIGH',\n applicability: ['Recognized runtime-managed projects.'],\n requiredEvidence: ['project.runtime.policy'],\n explanation: 'No explicit runtime version policy was found in project configuration.',\n remediationHint:\n 'Specify an explicit runtime policy (.nvmrc, .node-version, pyproject.toml, etc.).',\n },\n isApplicable(context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n return isRecognizedProject(context, evidence);\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const policyItem = findEvidence<{ policyFiles?: readonly string[]; engines?: unknown }>(\n evidence,\n 'project.runtime.policy',\n );\n const hasPolicy =\n (policyItem?.value?.policyFiles?.length ?? 0) > 0 || Boolean(policyItem?.value?.engines);\n\n if (!hasPolicy) {\n return {\n ruleId: 'project.runtime.policy.missing',\n status: 'WARN',\n finding: buildFinding(proj003RuntimePolicyMissing.metadata, {\n status: 'WARN',\n severity: 'MEDIUM',\n summary: 'Project has no explicit runtime version policy defined.',\n evidenceItems: policyItem ? [policyItem] : [],\n }),\n };\n }\n\n return {\n ruleId: 'project.runtime.policy.missing',\n status: 'PASS',\n finding: buildFinding(proj003RuntimePolicyMissing.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: 'Project specifies an explicit runtime version policy.',\n evidenceItems: policyItem ? [policyItem] : [],\n }),\n };\n },\n};\n\n/**\n * PROJ-004: Ambiguous Project Root\n * Reference: docs/RULE-CATALOGUE.md Section 23\n */\nexport const proj004RootAmbiguous: SyncDiagnosticRule = {\n metadata: {\n id: 'project.root.ambiguous',\n name: 'Ambiguous Project Root',\n category: 'project',\n description:\n 'Identify situations where multiple plausible project roots are detected and the target cannot be resolved confidently.',\n severity: 'LOW',\n confidence: 'HIGH',\n applicability: ['Applicable when analyzing directory structure for project roots.'],\n requiredEvidence: ['project.root'],\n explanation: 'Multiple ambiguous project roots were detected.',\n remediationHint: 'Run YOWTF with an explicit --path option.',\n },\n isApplicable(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const root = findEvidence(evidence, 'project.root');\n return Boolean(root && root.availability === 'AVAILABLE');\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const root = findEvidence<{ isAmbiguous?: boolean; ambiguousRoots?: readonly string[] }>(\n evidence,\n 'project.root',\n );\n\n if (!root || root.availability !== 'AVAILABLE' || !root.value) {\n return {\n ruleId: 'project.root.ambiguous',\n status: 'SKIPPED',\n };\n }\n\n if (root.value.isAmbiguous) {\n return {\n ruleId: 'project.root.ambiguous',\n status: 'WARN',\n finding: buildFinding(proj004RootAmbiguous.metadata, {\n status: 'WARN',\n severity: 'LOW',\n summary: `Multiple ambiguous project roots detected: ${root.value.ambiguousRoots?.join(', ') ?? 'multiple'}.`,\n evidenceItems: [root],\n }),\n };\n }\n\n return {\n ruleId: 'project.root.ambiguous',\n status: 'PASS',\n finding: buildFinding(proj004RootAmbiguous.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: 'Project root resolved unambiguously.',\n evidenceItems: [root],\n }),\n };\n },\n};\n\nexport const projectRules: readonly DiagnosticRule[] = Object.freeze([\n proj001ManifestMissing,\n proj002LockfileMissing,\n proj003RuntimePolicyMissing,\n proj004RootAmbiguous,\n]);\n","import type { SyncDiagnosticRule, DiagnosticRule, DetectionContext } from '../../types.js';\nimport type { EvidenceItem } from '../../../domain/evidence.js';\nimport type { RuleEvaluation } from '../../../domain/rules/rule-definition.js';\nimport { buildFinding, findEvidence } from '../utils.js';\n\nfunction hasProjectEvidence(\n _context: DetectionContext,\n evidence: readonly EvidenceItem[],\n): boolean {\n const root = findEvidence<{ isProject?: boolean }>(evidence, 'project.root');\n return root?.value?.isProject === true;\n}\n\n/**\n * DEP-001: Dependency Lockfile Missing\n * Reference: docs/RULE-CATALOGUE.md Section 24\n */\nexport const dep001LockfileMissing: SyncDiagnosticRule = {\n metadata: {\n id: 'dependency.lockfile.missing',\n name: 'Dependency Lockfile Missing',\n category: 'dependency',\n description: 'Identify a dependency-managed project without its expected lockfile.',\n severity: 'HIGH',\n confidence: 'HIGH',\n applicability: ['Applicable to projects with declared dependencies.'],\n requiredEvidence: ['project.lockfile'],\n explanation: 'A dependency lockfile is missing for this project.',\n remediationHint: 'Run your package manager to generate and commit the lockfile.',\n },\n isApplicable(context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n return hasProjectEvidence(context, evidence);\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const lockItem = findEvidence<{ lockfiles?: readonly unknown[] }>(evidence, 'project.lockfile');\n\n if (\n !lockItem ||\n lockItem.availability !== 'AVAILABLE' ||\n (lockItem.value?.lockfiles?.length ?? 0) === 0\n ) {\n return {\n ruleId: 'dependency.lockfile.missing',\n status: 'FAIL',\n finding: buildFinding(dep001LockfileMissing.metadata, {\n status: 'FAIL',\n severity: 'HIGH',\n summary: 'No dependency lockfile found for this project.',\n evidenceItems: lockItem ? [lockItem] : [],\n }),\n };\n }\n\n return {\n ruleId: 'dependency.lockfile.missing',\n status: 'PASS',\n finding: buildFinding(dep001LockfileMissing.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: 'Dependency lockfile is present.',\n evidenceItems: [lockItem],\n }),\n };\n },\n};\n\n/**\n * DEP-002: Dependency Lockfile Mismatch\n * Reference: docs/RULE-CATALOGUE.md Section 24\n */\nexport const dep002LockfileMismatch: SyncDiagnosticRule = {\n metadata: {\n id: 'dependency.lockfile.mismatch',\n name: 'Dependency Lockfile Mismatch',\n category: 'dependency',\n description:\n 'Identify an apparent mismatch between dependency manifest and lockfile metadata where reliable comparison is available.',\n severity: 'HIGH',\n confidence: 'HIGH',\n applicability: ['Applicable when manifest and lockfile metadata can be compared.'],\n requiredEvidence: ['dependency.lockfile.comparison'],\n explanation: 'Dependency declarations and lockfile state do not appear synchronized.',\n remediationHint: 'Review dependency workflow and regenerate or update lockfile.',\n },\n isApplicable(context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n return hasProjectEvidence(context, evidence);\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{\n isSynchronized?: boolean;\n comparisonUnavailable?: boolean;\n mismatchDetails?: string;\n }>(evidence, 'dependency.lockfile.comparison');\n\n if (!item || item.availability !== 'AVAILABLE' || item.value?.comparisonUnavailable) {\n return {\n ruleId: 'dependency.lockfile.mismatch',\n status: 'UNAVAILABLE',\n finding: buildFinding(dep002LockfileMismatch.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'Lockfile and manifest comparison metadata is unavailable.',\n evidenceItems: item ? [item] : [],\n }),\n };\n }\n\n if (item.value?.isSynchronized === false) {\n return {\n ruleId: 'dependency.lockfile.mismatch',\n status: 'FAIL',\n finding: buildFinding(dep002LockfileMismatch.metadata, {\n status: 'FAIL',\n severity: 'HIGH',\n summary:\n item.value.mismatchDetails ??\n 'Manifest and lockfile dependencies are out of synchronization.',\n evidenceItems: [item],\n }),\n };\n }\n\n return {\n ruleId: 'dependency.lockfile.mismatch',\n status: 'PASS',\n finding: buildFinding(dep002LockfileMismatch.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: 'Manifest and lockfile dependencies are synchronized.',\n evidenceItems: [item],\n }),\n };\n },\n};\n\n/**\n * DEP-003: Dependency Package Manager Mismatch\n * Reference: docs/RULE-CATALOGUE.md Section 24\n */\nexport const dep003PackageManagerMismatch: SyncDiagnosticRule = {\n metadata: {\n id: 'dependency.package-manager.mismatch',\n name: 'Dependency Package Manager Mismatch',\n category: 'dependency',\n description:\n 'Identify project metadata that points to one package manager while dependency metadata indicates another.',\n severity: 'MEDIUM',\n confidence: 'HIGH',\n applicability: ['Applicable when project metadata and lockfiles are available.'],\n requiredEvidence: ['project.lockfile', 'project.manifest'],\n explanation: 'Declared package manager and lockfile package manager disagree.',\n remediationHint: 'Standardize on a single package manager for the project.',\n },\n isApplicable(context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n return hasProjectEvidence(context, evidence);\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const lockItem = findEvidence<{\n lockfiles?: readonly { packageManager: string }[];\n packageManager?: string;\n }>(evidence, 'project.lockfile');\n const manifestItem = findEvidence<{\n manifests?: readonly { metadata?: { packageManager?: string } }[];\n }>(evidence, 'project.manifest');\n\n const declaredPm = manifestItem?.value?.manifests?.find((m) => m.metadata?.packageManager)\n ?.metadata?.packageManager;\n const lockPm =\n lockItem?.value?.packageManager ?? lockItem?.value?.lockfiles?.[0]?.packageManager;\n\n if (declaredPm && lockPm && declaredPm !== lockPm) {\n return {\n ruleId: 'dependency.package-manager.mismatch',\n status: 'WARN',\n finding: buildFinding(dep003PackageManagerMismatch.metadata, {\n status: 'WARN',\n severity: 'MEDIUM',\n summary: `Package manager conflict: project specifies '${declaredPm}', but lockfile indicates '${lockPm}'.`,\n evidenceItems: [lockItem, manifestItem].filter(Boolean) as EvidenceItem[],\n details: { declared: declaredPm, lockfile: lockPm },\n }),\n };\n }\n\n return {\n ruleId: 'dependency.package-manager.mismatch',\n status: 'PASS',\n finding: buildFinding(dep003PackageManagerMismatch.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: 'Package manager configuration is consistent.',\n evidenceItems: [lockItem, manifestItem].filter(Boolean) as EvidenceItem[],\n }),\n };\n },\n};\n\n/**\n * DEP-004: Dependency Directory Inconsistency\n * Reference: docs/RULE-CATALOGUE.md Section 24\n */\nexport const dep004DirectoryInconsistent: SyncDiagnosticRule = {\n metadata: {\n id: 'dependency.directory.inconsistent',\n name: 'Dependency Directory Inconsistency',\n category: 'dependency',\n description:\n 'Identify a dependency directory state that is inconsistent with the detected dependency metadata.',\n severity: 'MEDIUM',\n confidence: 'MEDIUM',\n applicability: ['Only where the ecosystem provides reliable metadata for comparison.'],\n requiredEvidence: ['dependency.directory.status'],\n explanation: 'Local dependency state may not correspond to project dependency metadata.',\n remediationHint: \"Review the project's documented dependency installation workflow.\",\n },\n isApplicable(context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n return hasProjectEvidence(context, evidence);\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{\n isConsistent?: boolean;\n comparisonUnavailable?: boolean;\n inconsistencyReason?: string;\n }>(evidence, 'dependency.directory.status');\n\n if (!item || item.availability !== 'AVAILABLE' || item.value?.comparisonUnavailable) {\n return {\n ruleId: 'dependency.directory.inconsistent',\n status: 'UNAVAILABLE',\n finding: buildFinding(dep004DirectoryInconsistent.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'Dependency directory consistency comparison is unavailable.',\n evidenceItems: item ? [item] : [],\n }),\n };\n }\n\n if (item.value?.isConsistent === false) {\n return {\n ruleId: 'dependency.directory.inconsistent',\n status: 'WARN',\n finding: buildFinding(dep004DirectoryInconsistent.metadata, {\n status: 'WARN',\n severity: 'MEDIUM',\n summary:\n item.value.inconsistencyReason ??\n 'Installed dependencies appear out of sync or incomplete relative to lockfile.',\n evidenceItems: [item],\n }),\n };\n }\n\n return {\n ruleId: 'dependency.directory.inconsistent',\n status: 'PASS',\n finding: buildFinding(dep004DirectoryInconsistent.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: 'Installed dependency directory is consistent with lockfile metadata.',\n evidenceItems: [item],\n }),\n };\n },\n};\n\nexport const dependencyRules: readonly DiagnosticRule[] = Object.freeze([\n dep001LockfileMissing,\n dep002LockfileMismatch,\n dep003PackageManagerMismatch,\n dep004DirectoryInconsistent,\n]);\n","import type { SyncDiagnosticRule, DiagnosticRule, DetectionContext } from '../../types.js';\nimport type { EvidenceItem } from '../../../domain/evidence.js';\nimport type { RuleEvaluation } from '../../../domain/rules/rule-definition.js';\nimport { buildFinding, findEvidence } from '../utils.js';\n\nfunction isGitRepository(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const item = findEvidence<{ isRepository?: boolean }>(evidence, 'project.git');\n return item?.value?.isRepository === true;\n}\n\n/**\n * GIT-001: Git Repository Missing\n * Reference: docs/RULE-CATALOGUE.md Section 25\n */\nexport const git001RepositoryMissing: SyncDiagnosticRule = {\n metadata: {\n id: 'git.repository.missing',\n name: 'Git Repository Missing',\n category: 'git',\n description:\n 'Identify a project that appears to be version-controlled but has no detectable Git repository metadata.',\n severity: 'MEDIUM',\n confidence: 'MEDIUM',\n applicability: ['Only when project context indicates Git is expected.'],\n requiredEvidence: ['project.git', 'project.root'],\n explanation: 'The project is not initialized as a Git repository.',\n remediationHint: 'Run git init if this project should be version-controlled.',\n },\n isApplicable(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const root = findEvidence<{ isProject?: boolean }>(evidence, 'project.root');\n return root?.value?.isProject === true;\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const gitItem = findEvidence<{ isRepository?: boolean }>(evidence, 'project.git');\n\n if (!gitItem || gitItem.availability !== 'AVAILABLE' || !gitItem.value?.isRepository) {\n return {\n ruleId: 'git.repository.missing',\n status: 'WARN',\n finding: buildFinding(git001RepositoryMissing.metadata, {\n status: 'WARN',\n severity: 'MEDIUM',\n summary: 'Project directory is not tracked inside a Git repository.',\n evidenceItems: gitItem ? [gitItem] : [],\n }),\n };\n }\n\n return {\n ruleId: 'git.repository.missing',\n status: 'PASS',\n finding: buildFinding(git001RepositoryMissing.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: 'Git repository is initialized.',\n evidenceItems: [gitItem],\n }),\n };\n },\n};\n\n/**\n * GIT-002: Dirty Working Tree\n * Reference: docs/RULE-CATALOGUE.md Section 25\n */\nexport const git002WorkingTreeDirty: SyncDiagnosticRule = {\n metadata: {\n id: 'git.working-tree.dirty',\n name: 'Dirty Working Tree',\n category: 'git',\n description: 'Identify uncommitted working-tree changes.',\n severity: 'LOW',\n confidence: 'HIGH',\n applicability: ['Git repositories.'],\n requiredEvidence: ['git.status'],\n explanation: 'Local modifications exist in the working tree.',\n remediationHint: 'Review working tree changes before testing or comparing behavior.',\n },\n isApplicable(context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n return isGitRepository(context, evidence);\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const statusItem = findEvidence<{ isClean?: boolean; modifiedFilesCount?: number }>(\n evidence,\n 'git.status',\n );\n\n if (!statusItem || statusItem.availability !== 'AVAILABLE') {\n return {\n ruleId: 'git.working-tree.dirty',\n status: 'UNAVAILABLE',\n finding: buildFinding(git002WorkingTreeDirty.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'Git status evidence is unavailable.',\n evidenceItems: statusItem ? [statusItem] : [],\n }),\n };\n }\n\n if (statusItem.value?.isClean === false || (statusItem.value?.modifiedFilesCount ?? 0) > 0) {\n return {\n ruleId: 'git.working-tree.dirty',\n status: 'WARN',\n finding: buildFinding(git002WorkingTreeDirty.metadata, {\n status: 'WARN',\n severity: 'LOW',\n summary: `Working tree has uncommitted modifications (${statusItem.value?.modifiedFilesCount ?? 'multiple'} modified files).`,\n evidenceItems: [statusItem],\n details: { modifiedCount: statusItem.value?.modifiedFilesCount ?? 0 },\n }),\n };\n }\n\n return {\n ruleId: 'git.working-tree.dirty',\n status: 'PASS',\n finding: buildFinding(git002WorkingTreeDirty.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: 'Working tree is clean.',\n evidenceItems: [statusItem],\n }),\n };\n },\n};\n\n/**\n * GIT-003: Untracked Files Present\n * Reference: docs/RULE-CATALOGUE.md Section 25\n */\nexport const git003UntrackedFiles: SyncDiagnosticRule = {\n metadata: {\n id: 'git.untracked.files',\n name: 'Untracked Files Present',\n category: 'git',\n description: 'Identify untracked files in a project repository.',\n severity: 'LOW',\n confidence: 'HIGH',\n applicability: ['Git repositories.'],\n requiredEvidence: ['git.status'],\n explanation:\n 'Untracked files may contain local configuration, generated files, or state not shared in version control.',\n remediationHint: 'Review untracked files to either commit or add to .gitignore.',\n },\n isApplicable(context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n return isGitRepository(context, evidence);\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const statusItem = findEvidence<{\n untrackedFilesCount?: number;\n untrackedFiles?: readonly string[];\n }>(evidence, 'git.status');\n\n if (!statusItem || statusItem.availability !== 'AVAILABLE') {\n return {\n ruleId: 'git.untracked.files',\n status: 'UNAVAILABLE',\n finding: buildFinding(git003UntrackedFiles.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'Git untracked files evidence is unavailable.',\n evidenceItems: statusItem ? [statusItem] : [],\n }),\n };\n }\n\n const count =\n statusItem.value?.untrackedFilesCount ?? statusItem.value?.untrackedFiles?.length ?? 0;\n if (count > 0) {\n return {\n ruleId: 'git.untracked.files',\n status: 'WARN',\n finding: buildFinding(git003UntrackedFiles.metadata, {\n status: 'WARN',\n severity: 'LOW',\n summary: `Repository has ${count} untracked file(s).`,\n evidenceItems: [statusItem],\n details: { untrackedCount: count },\n }),\n };\n }\n\n return {\n ruleId: 'git.untracked.files',\n status: 'PASS',\n finding: buildFinding(git003UntrackedFiles.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: 'No untracked files present in the repository.',\n evidenceItems: [statusItem],\n }),\n };\n },\n};\n\n/**\n * GIT-004: Branch Divergence\n * Reference: docs/RULE-CATALOGUE.md Section 25\n */\nexport const git004BranchDivergence: SyncDiagnosticRule = {\n metadata: {\n id: 'git.branch.divergence',\n name: 'Branch Divergence',\n category: 'git',\n description:\n 'Identify a branch with local commits ahead/behind its tracked upstream where reliable local Git metadata is available.',\n severity: 'LOW',\n confidence: 'HIGH',\n applicability: ['Only when an upstream relationship is available.'],\n requiredEvidence: ['git.divergence'],\n explanation: 'Branch has diverged from or is ahead/behind tracked upstream.',\n remediationHint: 'Synchronize branch with upstream via pull/push.',\n },\n isApplicable(context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n if (!isGitRepository(context, evidence)) return false;\n const item = findEvidence(evidence, 'git.divergence');\n return Boolean(item && item.availability === 'AVAILABLE');\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{\n hasUpstream?: boolean;\n aheadCount?: number;\n behindCount?: number;\n isDiverged?: boolean;\n }>(evidence, 'git.divergence');\n\n if (!item || item.availability !== 'AVAILABLE' || item.value?.hasUpstream === false) {\n return {\n ruleId: 'git.branch.divergence',\n status: 'UNAVAILABLE',\n finding: buildFinding(git004BranchDivergence.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'Upstream branch tracking metadata is unavailable.',\n evidenceItems: item ? [item] : [],\n }),\n };\n }\n\n const ahead = item.value?.aheadCount ?? 0;\n const behind = item.value?.behindCount ?? 0;\n const diverged = item.value?.isDiverged ?? (ahead > 0 || behind > 0);\n\n if (diverged) {\n return {\n ruleId: 'git.branch.divergence',\n status: 'WARN',\n finding: buildFinding(git004BranchDivergence.metadata, {\n status: 'WARN',\n severity: 'LOW',\n summary: `Branch is diverged from upstream (ahead: ${ahead}, behind: ${behind}).`,\n evidenceItems: [item],\n details: { ahead, behind },\n }),\n };\n }\n\n return {\n ruleId: 'git.branch.divergence',\n status: 'PASS',\n finding: buildFinding(git004BranchDivergence.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: 'Current branch is up to date with tracked upstream.',\n evidenceItems: [item],\n }),\n };\n },\n};\n\nexport const gitRules: readonly DiagnosticRule[] = Object.freeze([\n git001RepositoryMissing,\n git002WorkingTreeDirty,\n git003UntrackedFiles,\n git004BranchDivergence,\n]);\n","import type { SyncDiagnosticRule, DiagnosticRule, DetectionContext } from '../../types.js';\nimport type { EvidenceItem } from '../../../domain/evidence.js';\nimport type { RuleEvaluation } from '../../../domain/rules/rule-definition.js';\nimport { buildFinding, findEvidence } from '../utils.js';\n\n/**\n * CFG-001: Expected Environment Configuration Missing\n * Reference: docs/RULE-CATALOGUE.md Section 26\n */\nexport const cfg001EnvFileMissing: SyncDiagnosticRule = {\n metadata: {\n id: 'config.environment.file.missing',\n name: 'Expected Environment Configuration Missing',\n category: 'config',\n description:\n 'Identify a project that explicitly documents or structurally requires an environment configuration file that is absent.',\n severity: 'MEDIUM',\n confidence: 'HIGH',\n applicability: ['Only when the project explicitly indicates that the file is expected.'],\n requiredEvidence: ['config.environment.file'],\n explanation: 'An expected environment configuration file (e.g. .env) is missing.',\n remediationHint:\n 'Copy .env.example or create the expected .env file with necessary configurations.',\n },\n isApplicable(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const item = findEvidence<{ isExpected?: boolean }>(evidence, 'config.environment.file');\n return Boolean(item && item.value?.isExpected);\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{\n isExpected?: boolean;\n isPresent?: boolean;\n expectedFileName?: string;\n }>(evidence, 'config.environment.file');\n\n if (!item || !item.value?.isExpected) {\n return {\n ruleId: 'config.environment.file.missing',\n status: 'SKIPPED',\n };\n }\n\n if (item.value.isPresent === false) {\n return {\n ruleId: 'config.environment.file.missing',\n status: 'WARN',\n finding: buildFinding(cfg001EnvFileMissing.metadata, {\n status: 'WARN',\n severity: 'MEDIUM',\n summary: `Expected environment configuration file '${item.value.expectedFileName ?? '.env'}' is missing.`,\n evidenceItems: [item],\n details: { expectedFile: item.value.expectedFileName ?? '.env' },\n }),\n };\n }\n\n return {\n ruleId: 'config.environment.file.missing',\n status: 'PASS',\n finding: buildFinding(cfg001EnvFileMissing.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: `Expected environment configuration file '${item.value.expectedFileName ?? '.env'}' is present.`,\n evidenceItems: [item],\n }),\n };\n },\n};\n\n/**\n * CFG-002: Required Configuration Metadata Missing\n * Reference: docs/RULE-CATALOGUE.md Section 26\n */\nexport const cfg002RequiredValueMissing: SyncDiagnosticRule = {\n metadata: {\n id: 'config.required.value.missing',\n name: 'Required Configuration Metadata Missing',\n category: 'config',\n description:\n 'Identify an explicitly required configuration key whose presence can be safely checked without exposing its value.',\n severity: 'HIGH',\n confidence: 'HIGH',\n applicability: ['Only when the project explicitly defines the required key.'],\n requiredEvidence: ['config.required.keys'],\n explanation: 'An explicitly required configuration key or environment variable is missing.',\n remediationHint:\n 'Define the missing required configuration key in your environment or configuration file.',\n },\n isApplicable(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const item = findEvidence<{ requiredKeys?: readonly string[] }>(\n evidence,\n 'config.required.keys',\n );\n return Boolean(item && (item.value?.requiredKeys?.length ?? 0) > 0);\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{\n requiredKeys?: readonly string[];\n missingKeys?: readonly string[];\n }>(evidence, 'config.required.keys');\n\n if (!item || !item.value?.requiredKeys || item.value.requiredKeys.length === 0) {\n return {\n ruleId: 'config.required.value.missing',\n status: 'SKIPPED',\n };\n }\n\n const missing = item.value.missingKeys ?? [];\n if (missing.length > 0) {\n return {\n ruleId: 'config.required.value.missing',\n status: 'FAIL',\n finding: buildFinding(cfg002RequiredValueMissing.metadata, {\n status: 'FAIL',\n severity: 'HIGH',\n summary: `Required configuration key(s) missing: ${missing.join(', ')}.`,\n evidenceItems: [item],\n details: { missingCount: missing.length, missingKeys: missing },\n }),\n };\n }\n\n return {\n ruleId: 'config.required.value.missing',\n status: 'PASS',\n finding: buildFinding(cfg002RequiredValueMissing.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: 'All explicitly required configuration keys are present.',\n evidenceItems: [item],\n }),\n };\n },\n};\n\nexport const configRules: readonly DiagnosticRule[] = Object.freeze([\n cfg001EnvFileMissing,\n cfg002RequiredValueMissing,\n]);\n","import type { SyncDiagnosticRule, DiagnosticRule, DetectionContext } from '../../types.js';\nimport type { EvidenceItem } from '../../../domain/evidence.js';\nimport type { RuleEvaluation } from '../../../domain/rules/rule-definition.js';\nimport { buildFinding, findEvidence } from '../utils.js';\n\nconst ONE_GB = 1024 * 1024 * 1024;\n\n/**\n * CACHE-001: Large Developer Cache\n * Reference: docs/RULE-CATALOGUE.md Section 27\n */\nexport const cache001StorageLarge: SyncDiagnosticRule = {\n metadata: {\n id: 'cache.storage.large',\n name: 'Large Developer Cache',\n category: 'cache',\n description: 'Identify a known developer cache whose size is unusually large.',\n severity: 'MEDIUM',\n confidence: 'HIGH',\n applicability: ['Only for safely recognized cache locations.'],\n requiredEvidence: ['cache.developer.storage'],\n explanation: 'The cache consumes significant local storage.',\n remediationHint: 'Review the cache as a cleanup candidate.',\n },\n isApplicable(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const item = findEvidence(evidence, 'cache.developer.storage');\n return Boolean(item && item.availability === 'AVAILABLE');\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{ cacheName?: string; sizeBytes?: number; sizeGB?: number }>(\n evidence,\n 'cache.developer.storage',\n );\n\n if (!item || item.availability !== 'AVAILABLE' || !item.value) {\n return {\n ruleId: 'cache.storage.large',\n status: 'UNAVAILABLE',\n finding: buildFinding(cache001StorageLarge.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'Developer cache storage size is unavailable.',\n evidenceItems: item ? [item] : [],\n }),\n };\n }\n\n const bytes = item.value.sizeBytes ?? (item.value.sizeGB ? item.value.sizeGB * ONE_GB : 0);\n const gb = bytes / ONE_GB;\n\n if (gb >= 50) {\n return {\n ruleId: 'cache.storage.large',\n status: 'FAIL',\n finding: buildFinding(cache001StorageLarge.metadata, {\n status: 'FAIL',\n severity: 'MEDIUM',\n summary: `Developer cache '${item.value.cacheName ?? 'cache'}' is very large at ${gb.toFixed(1)} GB (threshold >= 50 GB).`,\n evidenceItems: [item],\n details: { cache: item.value.cacheName ?? '', sizeGB: gb },\n }),\n };\n }\n\n if (gb >= 10) {\n return {\n ruleId: 'cache.storage.large',\n status: 'WARN',\n finding: buildFinding(cache001StorageLarge.metadata, {\n status: 'WARN',\n severity: 'LOW',\n summary: `Developer cache '${item.value.cacheName ?? 'cache'}' is elevated at ${gb.toFixed(1)} GB (threshold >= 10 GB).`,\n evidenceItems: [item],\n details: { cache: item.value.cacheName ?? '', sizeGB: gb },\n }),\n };\n }\n\n return {\n ruleId: 'cache.storage.large',\n status: 'PASS',\n finding: buildFinding(cache001StorageLarge.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: `Developer cache size is normal (${gb.toFixed(1)} GB).`,\n evidenceItems: [item],\n }),\n };\n },\n};\n\n/**\n * CACHE-002: Large Build Artifact\n * Reference: docs/RULE-CATALOGUE.md Section 27\n */\nexport const cache002BuildArtifactLarge: SyncDiagnosticRule = {\n metadata: {\n id: 'cache.build.artifact.large',\n name: 'Large Build Artifact',\n category: 'cache',\n description: 'Identify unusually large recognized build-output directories.',\n severity: 'MEDIUM',\n confidence: 'MEDIUM',\n applicability: ['Only for recognized project/build-output locations.'],\n requiredEvidence: ['cache.build.artifacts'],\n explanation: 'Build output is consuming substantial local storage.',\n remediationHint: 'Review whether the build output can be cleaned or regenerated.',\n },\n isApplicable(_context: DetectionContext, evidence: readonly EvidenceItem[]): boolean {\n const item = findEvidence(evidence, 'cache.build.artifacts');\n return Boolean(item && item.availability === 'AVAILABLE');\n },\n evaluate(_context: DetectionContext, evidence: readonly EvidenceItem[]): RuleEvaluation {\n const item = findEvidence<{ directoryName?: string; sizeBytes?: number; sizeGB?: number }>(\n evidence,\n 'cache.build.artifacts',\n );\n\n if (!item || item.availability !== 'AVAILABLE' || !item.value) {\n return {\n ruleId: 'cache.build.artifact.large',\n status: 'UNAVAILABLE',\n finding: buildFinding(cache002BuildArtifactLarge.metadata, {\n status: 'UNAVAILABLE',\n severity: 'INFO',\n summary: 'Build artifact size evidence is unavailable.',\n evidenceItems: item ? [item] : [],\n }),\n };\n }\n\n const bytes = item.value.sizeBytes ?? (item.value.sizeGB ? item.value.sizeGB * ONE_GB : 0);\n const gb = bytes / ONE_GB;\n\n if (gb >= 20) {\n return {\n ruleId: 'cache.build.artifact.large',\n status: 'FAIL',\n finding: buildFinding(cache002BuildArtifactLarge.metadata, {\n status: 'FAIL',\n severity: 'MEDIUM',\n summary: `Build artifact directory '${item.value.directoryName ?? 'build'}' is very large at ${gb.toFixed(1)} GB (threshold >= 20 GB).`,\n evidenceItems: [item],\n details: { directory: item.value.directoryName ?? '', sizeGB: gb },\n }),\n };\n }\n\n if (gb >= 5) {\n return {\n ruleId: 'cache.build.artifact.large',\n status: 'WARN',\n finding: buildFinding(cache002BuildArtifactLarge.metadata, {\n status: 'WARN',\n severity: 'LOW',\n summary: `Build artifact directory '${item.value.directoryName ?? 'build'}' is elevated at ${gb.toFixed(1)} GB (threshold >= 5 GB).`,\n evidenceItems: [item],\n details: { directory: item.value.directoryName ?? '', sizeGB: gb },\n }),\n };\n }\n\n return {\n ruleId: 'cache.build.artifact.large',\n status: 'PASS',\n finding: buildFinding(cache002BuildArtifactLarge.metadata, {\n status: 'PASS',\n severity: 'INFO',\n summary: `Build artifact directory size is within normal limits (${gb.toFixed(1)} GB).`,\n evidenceItems: [item],\n }),\n };\n },\n};\n\nexport const cacheRules: readonly DiagnosticRule[] = Object.freeze([\n cache001StorageLarge,\n cache002BuildArtifactLarge,\n]);\n","import type { DiagnosticRule } from '../types.js';\nimport { systemRules } from './system/index.js';\nimport { diskRules } from './disk/index.js';\nimport { processRules } from './processes/index.js';\nimport { portRules } from './ports/index.js';\nimport { networkRules } from './network/index.js';\nimport { environmentRules } from './environment/index.js';\nimport { runtimeRules } from './runtimes/index.js';\nimport { toolRules } from './tools/index.js';\nimport { pathRules } from './paths/index.js';\nimport { versionRules } from './versions/index.js';\nimport { projectRules } from './project/index.js';\nimport { dependencyRules } from './dependencies/index.js';\nimport { gitRules } from './git/index.js';\nimport { configRules } from './configuration/index.js';\nimport { cacheRules } from './caches/index.js';\n\n/**\n * The authoritative, closed V1 diagnostic rule set for YOWTF.\n * Order matches docs/RULE-CATALOGUE.md Section 76.\n * Contains exactly 60 rules across 15 categories.\n */\nexport const allV1Rules: readonly DiagnosticRule[] = Object.freeze([\n // 1. System (5)\n ...systemRules,\n // 2. Disk (4)\n ...diskRules,\n // 3. Processes (4)\n ...processRules,\n // 4. Ports (4)\n ...portRules,\n // 5. Network (4)\n ...networkRules,\n // 6. Environment (4)\n ...environmentRules,\n // 7. Runtimes (6)\n ...runtimeRules,\n // 8. Tools (5)\n ...toolRules,\n // 9. Paths (4)\n ...pathRules,\n // 10. Versions (4)\n ...versionRules,\n // 11. Project (4)\n ...projectRules,\n // 12. Dependencies (4)\n ...dependencyRules,\n // 13. Git (4)\n ...gitRules,\n // 14. Configuration (2)\n ...configRules,\n // 15. Caches (2)\n ...cacheRules,\n]);\n","import type { DetectionContext, DiagnosticRule, RuleRegistryInterface } from './types.js';\nimport { allV1Rules } from './rules/all.js';\n\n/**\n * Deterministic Rule Registry for YOWTF.\n * Rejects duplicate rule IDs and preserves stable catalog order.\n * Reference: docs/DETECTION-ENGINE.md Section 39-40.\n */\nexport class DefaultRuleRegistry implements RuleRegistryInterface {\n private readonly rulesById = new Map<string, DiagnosticRule>();\n private readonly rulesOrder: DiagnosticRule[] = [];\n\n constructor(initialRules: readonly DiagnosticRule[] = []) {\n for (const rule of initialRules) {\n this.register(rule);\n }\n }\n\n public register(rule: DiagnosticRule): void {\n const id = rule.metadata.id;\n if (this.rulesById.has(id)) {\n throw new Error(`Duplicate rule registration: rule ID '${id}' is already registered.`);\n }\n this.rulesById.set(id, rule);\n this.rulesOrder.push(rule);\n }\n\n public get(ruleId: string): DiagnosticRule | undefined {\n return this.rulesById.get(ruleId);\n }\n\n public list(): readonly DiagnosticRule[] {\n return Object.freeze([...this.rulesOrder]);\n }\n\n public select(context?: DetectionContext): readonly DiagnosticRule[] {\n if (\n !context ||\n !context.commandScope ||\n context.commandScope === 'all' ||\n context.commandScope === 'doctor'\n ) {\n return this.list();\n }\n\n const scope = context.commandScope.toLowerCase();\n return Object.freeze(\n this.rulesOrder.filter((rule) => {\n // Match category directly or special scope matching\n if (rule.metadata.category === scope) {\n return true;\n }\n // Aliases from COMMANDS.md: 'deps' -> 'dependency', 'env' -> 'environment', 'ports' -> 'port', 'runtimes' -> 'runtime', 'tools' -> 'tool', 'paths' -> 'path', 'versions' -> 'version', 'caches' -> 'cache', 'clean' -> 'cache' | 'disk'\n if (scope === 'deps' && rule.metadata.category === 'dependency') return true;\n if (scope === 'env' && rule.metadata.category === 'environment') return true;\n if (scope === 'ports' && rule.metadata.category === 'port') return true;\n if (scope === 'runtimes' && rule.metadata.category === 'runtime') return true;\n if (scope === 'tools' && rule.metadata.category === 'tool') return true;\n if (scope === 'paths' && rule.metadata.category === 'path') return true;\n if (\n scope === 'versions' &&\n (rule.metadata.category === 'version' || rule.metadata.category === 'runtime')\n )\n return true;\n if (scope === 'caches' && rule.metadata.category === 'cache') return true;\n if (\n scope === 'clean' &&\n (rule.metadata.category === 'cache' || rule.metadata.category === 'disk')\n )\n return true;\n if (scope === 'processes' && rule.metadata.category === 'process') return true;\n\n return false;\n }),\n );\n }\n}\n\n/**\n * Creates a pre-populated rule registry containing all 60 authoritative V1 diagnostic rules.\n */\nexport function createDefaultRuleRegistry(): DefaultRuleRegistry {\n return new DefaultRuleRegistry(allV1Rules);\n}\n","import type { DetectionResult } from '../../domain/detection-result.js';\nimport type { EvidenceItem, EvidenceSet } from '../../domain/evidence.js';\nimport { DetectionEngine } from '../../detection/engine.js';\nimport { createDefaultRuleRegistry } from '../../detection/registry.js';\nimport type { DetectionContext, RuleRegistryInterface } from '../../detection/types.js';\n\nexport interface DetectionServiceOptions {\n readonly registry?: RuleRegistryInterface;\n}\n\n/**\n * Application service coordinating diagnostic rule evaluation.\n * Boundary between application orchestration and the detection engine.\n * Reference: docs/ARCHITECTURE.md Section 5.2 and 5.6.\n */\nexport class DetectionService {\n private readonly engine: DetectionEngine;\n\n constructor(options: DetectionServiceOptions = {}) {\n const registry = options.registry ?? createDefaultRuleRegistry();\n this.engine = new DetectionEngine(registry);\n }\n\n /**\n * Executes detection rules against normalized evidence and returns deterministic findings.\n */\n public async runDetection(\n evidence: readonly EvidenceItem[] | readonly EvidenceSet[],\n context?: DetectionContext,\n ): Promise<DetectionResult> {\n return this.engine.execute(evidence, context);\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { CliUsageError } from './errors.js';\n\n/**\n * Resolves and validates the target directory path.\n * If targetPath is not provided, defaults to normalized current working directory.\n * If targetPath is provided, validates that it exists, is a directory, and is accessible.\n * Throws CliUsageError (exit code 2) on failure.\n * Adheres to docs/CLI-SPEC.md Section 15, 16, & 56.\n */\nexport function resolveAndValidatePath(rawPath?: string, cwd: string = process.cwd()): string {\n if (!rawPath) {\n return path.normalize(path.resolve(cwd));\n }\n\n const resolvedPath = path.normalize(path.resolve(cwd, rawPath));\n\n if (!fs.existsSync(resolvedPath)) {\n throw new CliUsageError(\n `Target directory does not exist: '${rawPath}'. Please specify an existing directory.`,\n );\n }\n\n let stats: fs.Stats;\n try {\n stats = fs.statSync(resolvedPath);\n } catch (err) {\n throw new CliUsageError(\n `Target path cannot be inspected: '${rawPath}'. ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n if (!stats.isDirectory()) {\n throw new CliUsageError(\n `Target path is not a directory: '${rawPath}'. YOWTF expects a valid directory path.`,\n );\n }\n\n try {\n fs.accessSync(resolvedPath, fs.constants.R_OK);\n } catch {\n throw new CliUsageError(\n `Target directory is not accessible/readable: '${rawPath}'. Please check file permissions.`,\n );\n }\n\n return resolvedPath;\n}\n","import fs from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport type {\n DiscoveredProject,\n ProjectConfigInfo,\n ProjectGitInfo,\n ProjectLockfileInfo,\n ProjectManifestInfo,\n ProjectManifestMetadata,\n SupportedProjectType,\n} from './types.js';\n\ninterface MarkerRule {\n readonly filename: string;\n readonly ecosystem: SupportedProjectType;\n readonly isManifest?: boolean;\n}\n\nconst PROJECT_MARKERS: readonly MarkerRule[] = [\n // Node.js\n { filename: 'package.json', ecosystem: 'node', isManifest: true },\n { filename: 'pnpm-lock.yaml', ecosystem: 'node' },\n { filename: 'package-lock.json', ecosystem: 'node' },\n { filename: 'yarn.lock', ecosystem: 'node' },\n { filename: 'bun.lockb', ecosystem: 'node' },\n { filename: 'bun.lock', ecosystem: 'node' },\n\n // Python\n { filename: 'pyproject.toml', ecosystem: 'python', isManifest: true },\n { filename: 'requirements.txt', ecosystem: 'python', isManifest: true },\n { filename: 'Pipfile', ecosystem: 'python', isManifest: true },\n { filename: 'setup.py', ecosystem: 'python', isManifest: true },\n\n // Rust\n { filename: 'Cargo.toml', ecosystem: 'rust', isManifest: true },\n\n // Go\n { filename: 'go.mod', ecosystem: 'go', isManifest: true },\n\n // Java\n { filename: 'pom.xml', ecosystem: 'java', isManifest: true },\n { filename: 'build.gradle', ecosystem: 'java', isManifest: true },\n { filename: 'build.gradle.kts', ecosystem: 'java', isManifest: true },\n\n // PHP\n { filename: 'composer.json', ecosystem: 'php', isManifest: true },\n\n // Ruby\n { filename: 'Gemfile', ecosystem: 'ruby', isManifest: true },\n\n // Version control\n { filename: '.git', ecosystem: 'unknown' },\n];\n\nconst KNOWN_LOCKFILES: Readonly<Record<string, string>> = {\n 'pnpm-lock.yaml': 'pnpm',\n 'package-lock.json': 'npm',\n 'yarn.lock': 'yarn',\n 'bun.lockb': 'bun',\n 'bun.lock': 'bun',\n 'Cargo.lock': 'cargo',\n 'go.sum': 'go',\n 'composer.lock': 'composer',\n 'Gemfile.lock': 'bundler',\n 'poetry.lock': 'poetry',\n 'Pipfile.lock': 'pipenv',\n};\n\nconst KNOWN_RUNTIME_POLICIES: readonly string[] = [\n '.nvmrc',\n '.node-version',\n '.python-version',\n '.ruby-version',\n '.tool-versions',\n];\n\nconst KNOWN_ENV_CONFIGS: readonly string[] = [\n '.env',\n '.env.example',\n '.env.local',\n '.env.development',\n '.env.production',\n '.env.test',\n];\n\nconst KNOWN_TOOLING_CONFIGS: readonly string[] = [\n 'tsconfig.json',\n 'eslint.config.js',\n 'eslint.config.mjs',\n '.eslintrc.json',\n '.eslintrc.js',\n 'vite.config.ts',\n 'vite.config.js',\n 'next.config.js',\n 'next.config.mjs',\n 'next.config.ts',\n];\n\nconst KNOWN_GENERAL_CONFIGS: readonly string[] = [\n 'Dockerfile',\n 'docker-compose.yml',\n 'compose.yaml',\n];\n\nexport class ProjectDiscovery {\n /**\n * Discovers project root and inspects structured project facts.\n * Strictly read-only and safe.\n */\n public async discover(startDir: string): Promise<DiscoveredProject> {\n const normalizedStart = path.normalize(path.resolve(startDir));\n const rootPath = await this.findProjectRoot(normalizedStart);\n\n if (!rootPath) {\n return {\n isProject: false,\n rootPath: normalizedStart,\n types: [],\n primaryType: 'unknown',\n manifests: [],\n lockfiles: [],\n configFiles: [],\n git: { isRepository: false },\n };\n }\n\n const entries = await this.safeReadDir(rootPath);\n const entrySet = new Set(entries);\n\n // 1. Identify manifests\n const manifests = await this.discoverManifests(rootPath, entrySet);\n\n // 2. Identify lockfiles\n const lockfiles = this.discoverLockfiles(rootPath, entrySet);\n\n // 3. Identify configs (presence only, no secret reading)\n const configFiles = this.discoverConfigs(rootPath, entrySet);\n\n // 4. Identify Git metadata (local only, no mutations)\n const git = await this.discoverGit(rootPath, entrySet);\n\n // 5. Determine project types\n const types = this.determineTypes(manifests, entrySet);\n const primaryType = types[0] ?? 'unknown';\n\n // 6. Resolve package manager identity\n const packageManager = this.resolvePackageManager(lockfiles, manifests);\n\n return {\n isProject: true,\n rootPath,\n types: Object.freeze(types),\n primaryType,\n manifests: Object.freeze(manifests),\n lockfiles: Object.freeze(lockfiles),\n configFiles: Object.freeze(configFiles),\n ...(packageManager ? { packageManager } : {}),\n git,\n };\n }\n\n /**\n * Walks upward from startDir to locate the first ancestor directory containing project markers.\n * Prevents escaping into unrelated directories such as user home or system temp root.\n */\n private async findProjectRoot(startDir: string): Promise<string | null> {\n const homeDir = path.normalize(os.homedir());\n const tmpDir = path.normalize(os.tmpdir());\n let current = startDir;\n let depth = 0;\n const maxDepth = 6;\n\n while (depth <= maxDepth) {\n // Do not traverse out of temp or home directory into parents\n if (depth > 0 && (current === tmpDir || current === homeDir)) {\n break;\n }\n\n const entries = await this.safeReadDir(current);\n const entrySet = new Set(entries);\n\n // Check if current directory has a project manifest\n const hasManifest = PROJECT_MARKERS.some(\n (marker) => marker.isManifest && entrySet.has(marker.filename),\n );\n if (hasManifest) {\n return current;\n }\n\n // Check if current directory has .git (and is not home or volume root)\n if (entrySet.has('.git') && current !== homeDir && current !== path.parse(current).root) {\n return current;\n }\n\n // Check if current directory has standalone lockfile\n const hasLockfile = Object.keys(KNOWN_LOCKFILES).some((lf) => entrySet.has(lf));\n if (hasLockfile) {\n return current;\n }\n\n const parent = path.dirname(current);\n if (parent === current) {\n break; // Reached filesystem root\n }\n current = parent;\n depth++;\n }\n\n return null;\n }\n\n private async safeReadDir(dir: string): Promise<string[]> {\n try {\n return await fs.readdir(dir);\n } catch {\n return [];\n }\n }\n\n private async discoverManifests(\n rootPath: string,\n entrySet: Set<string>,\n ): Promise<ProjectManifestInfo[]> {\n const manifests: ProjectManifestInfo[] = [];\n\n for (const marker of PROJECT_MARKERS) {\n if (marker.isManifest && entrySet.has(marker.filename)) {\n const filePath = path.join(rootPath, marker.filename);\n let metadata: ProjectManifestMetadata | undefined;\n\n if (marker.filename === 'package.json') {\n metadata = await this.safelyParsePackageJson(filePath);\n }\n\n manifests.push({\n name: marker.filename,\n path: filePath,\n ecosystem: marker.ecosystem,\n ...(metadata ? { metadata } : {}),\n });\n }\n }\n\n // Sort deterministically by name\n return manifests.sort((a, b) => a.name.localeCompare(b.name));\n }\n\n private async safelyParsePackageJson(\n filePath: string,\n ): Promise<ProjectManifestMetadata | undefined> {\n try {\n const stats = await fs.stat(filePath);\n // Guard against oversized pathological files (max 5MB)\n if (stats.size > 5 * 1024 * 1024) {\n return undefined;\n }\n\n const content = await fs.readFile(filePath, 'utf8');\n const parsed = JSON.parse(content) as Record<string, unknown>;\n\n const packageName = typeof parsed.name === 'string' ? parsed.name : undefined;\n const packageManager =\n typeof parsed.packageManager === 'string' ? parsed.packageManager.split('@')[0] : undefined;\n\n const engines =\n typeof parsed.engines === 'object' && parsed.engines !== null\n ? Object.freeze(parsed.engines as Record<string, string>)\n : undefined;\n\n const scripts =\n typeof parsed.scripts === 'object' && parsed.scripts !== null\n ? Object.freeze(Object.keys(parsed.scripts).sort())\n : undefined;\n\n const deps =\n typeof parsed.dependencies === 'object' && parsed.dependencies !== null\n ? Object.keys(parsed.dependencies).length\n : 0;\n const devDeps =\n typeof parsed.devDependencies === 'object' && parsed.devDependencies !== null\n ? Object.keys(parsed.devDependencies).length\n : 0;\n const declaredDependencyCount = deps + devDeps;\n\n return {\n packageName,\n packageManager,\n engines,\n scripts,\n declaredDependencyCount,\n };\n } catch {\n return undefined;\n }\n }\n\n private discoverLockfiles(rootPath: string, entrySet: Set<string>): ProjectLockfileInfo[] {\n const lockfiles: ProjectLockfileInfo[] = [];\n\n for (const [filename, pm] of Object.entries(KNOWN_LOCKFILES)) {\n if (entrySet.has(filename)) {\n lockfiles.push({\n name: filename,\n path: path.join(rootPath, filename),\n packageManager: pm,\n });\n }\n }\n\n return lockfiles.sort((a, b) => a.name.localeCompare(b.name));\n }\n\n private discoverConfigs(rootPath: string, entrySet: Set<string>): ProjectConfigInfo[] {\n const configs: ProjectConfigInfo[] = [];\n\n for (const file of KNOWN_RUNTIME_POLICIES) {\n if (entrySet.has(file)) {\n configs.push({\n name: file,\n path: path.join(rootPath, file),\n category: 'runtime-policy',\n });\n }\n }\n\n for (const file of KNOWN_ENV_CONFIGS) {\n if (entrySet.has(file)) {\n configs.push({\n name: file,\n path: path.join(rootPath, file),\n category: 'environment',\n });\n }\n }\n\n for (const file of KNOWN_TOOLING_CONFIGS) {\n if (entrySet.has(file)) {\n configs.push({\n name: file,\n path: path.join(rootPath, file),\n category: 'tooling',\n });\n }\n }\n\n for (const file of KNOWN_GENERAL_CONFIGS) {\n if (entrySet.has(file)) {\n configs.push({\n name: file,\n path: path.join(rootPath, file),\n category: 'general',\n });\n }\n }\n\n return configs.sort((a, b) => a.name.localeCompare(b.name));\n }\n\n private async discoverGit(rootPath: string, entrySet: Set<string>): Promise<ProjectGitInfo> {\n if (!entrySet.has('.git')) {\n return { isRepository: false };\n }\n\n const gitEntryPath = path.join(rootPath, '.git');\n let effectiveGitDir = gitEntryPath;\n let branch: string | undefined;\n\n try {\n const stat = await fs.stat(gitEntryPath);\n if (stat.isFile()) {\n // Git worktree support: .git is a text file containing \"gitdir: <path>\"\n const gitFileContent = await fs.readFile(gitEntryPath, 'utf8');\n const match = gitFileContent.match(/^gitdir:\\s*(.+)$/m);\n if (match && match[1]) {\n effectiveGitDir = path.resolve(rootPath, match[1].trim());\n }\n }\n\n const headContent = await fs.readFile(path.join(effectiveGitDir, 'HEAD'), 'utf8');\n const trimmed = headContent.trim();\n if (trimmed.startsWith('ref: refs/heads/')) {\n branch = trimmed.replace('ref: refs/heads/', '');\n } else {\n branch = trimmed.substring(0, 7); // Detached head commit hash\n }\n } catch {\n // Unreadable git HEAD is not a fatal error\n }\n\n return {\n isRepository: true,\n gitDir: effectiveGitDir,\n branch,\n };\n }\n\n private determineTypes(\n manifests: readonly ProjectManifestInfo[],\n entrySet: Set<string>,\n ): SupportedProjectType[] {\n const typeSet = new Set<SupportedProjectType>();\n\n for (const manifest of manifests) {\n if (manifest.ecosystem !== 'unknown') {\n typeSet.add(manifest.ecosystem);\n }\n }\n\n // Secondary check for lockfiles or ecosystem markers\n if (\n entrySet.has('package-lock.json') ||\n entrySet.has('pnpm-lock.yaml') ||\n entrySet.has('yarn.lock') ||\n entrySet.has('bun.lockb')\n ) {\n typeSet.add('node');\n }\n if (entrySet.has('Cargo.lock')) {\n typeSet.add('rust');\n }\n if (entrySet.has('go.sum')) {\n typeSet.add('go');\n }\n\n const types = Array.from(typeSet).sort();\n return types.length > 0 ? types : ['unknown'];\n }\n\n private resolvePackageManager(\n lockfiles: readonly ProjectLockfileInfo[],\n manifests: readonly ProjectManifestInfo[],\n ): string | undefined {\n // 1. Lockfiles take precedence for local truth\n if (lockfiles.length > 0) {\n return lockfiles[0]?.packageManager;\n }\n\n // 2. package.json packageManager declaration\n const pkgJson = manifests.find((m) => m.name === 'package.json');\n if (pkgJson?.metadata?.packageManager) {\n return pkgJson.metadata.packageManager;\n }\n\n return undefined;\n }\n}\n","import type { EvidenceItem, EvidenceSet } from '../../domain/evidence.js';\nimport type { Collector, CollectorContext } from '../types.js';\nimport { ProjectDiscovery } from './discovery.js';\nimport type { DiscoveredProject } from './types.js';\n\n/**\n * ProjectCollector gathers structured facts about the target project,\n * fulfilling evidence requirements for PROJ-001 through PROJ-004,\n * DEP-001 through DEP-003, GIT-001, and CFG-001.\n *\n * It is strictly read-only and does not calculate scores or create findings.\n */\nexport class ProjectCollector implements Collector<EvidenceSet> {\n public readonly name = 'project';\n public readonly category = 'project' as const;\n\n constructor(private readonly discovery: ProjectDiscovery = new ProjectDiscovery()) {}\n\n public async collect(context: CollectorContext): Promise<EvidenceSet> {\n let project: DiscoveredProject;\n\n try {\n project = await this.discovery.discover(context.cwd);\n } catch {\n return {\n category: 'project',\n items: [\n {\n key: 'project.root',\n source: 'discovery',\n type: 'path',\n availability: 'FAILED',\n },\n {\n key: 'project.type',\n source: 'discovery',\n type: 'project-type',\n availability: 'FAILED',\n },\n ],\n };\n }\n\n return this.buildEvidenceSet(project);\n }\n\n public buildEvidenceSet(project: DiscoveredProject): EvidenceSet {\n const items: EvidenceItem[] = [];\n\n // 1. project.root\n items.push({\n key: 'project.root',\n source: 'discovery',\n type: 'path',\n availability: project.isProject ? 'AVAILABLE' : 'NOT_APPLICABLE',\n value: {\n rootPath: project.rootPath,\n isProject: project.isProject,\n },\n });\n\n // 2. project.type\n items.push({\n key: 'project.type',\n source: 'discovery',\n type: 'project-type',\n availability: project.isProject ? 'AVAILABLE' : 'NOT_APPLICABLE',\n value: {\n primaryType: project.primaryType,\n types: project.types,\n },\n });\n\n // 3. project.manifest\n items.push({\n key: 'project.manifest',\n source: 'fs',\n type: 'manifest',\n availability: project.manifests.length > 0 ? 'AVAILABLE' : 'UNAVAILABLE',\n value: {\n manifests: project.manifests.map((m) => ({\n name: m.name,\n ecosystem: m.ecosystem,\n ...(m.metadata?.packageName ? { packageName: m.metadata.packageName } : {}),\n ...(m.metadata?.packageManager ? { packageManager: m.metadata.packageManager } : {}),\n ...(m.metadata?.declaredDependencyCount !== undefined\n ? { declaredDependencyCount: m.metadata.declaredDependencyCount }\n : {}),\n })),\n count: project.manifests.length,\n },\n });\n\n // 4. project.lockfile\n items.push({\n key: 'project.lockfile',\n source: 'fs',\n type: 'lockfile',\n availability: project.lockfiles.length > 0 ? 'AVAILABLE' : 'UNAVAILABLE',\n value: {\n lockfiles: project.lockfiles.map((l) => ({\n name: l.name,\n packageManager: l.packageManager,\n })),\n packageManager: project.packageManager,\n },\n });\n\n // 5. project.runtime.policy\n const runtimePolicies = project.configFiles.filter((c) => c.category === 'runtime-policy');\n const pkgJson = project.manifests.find((m) => m.name === 'package.json');\n const engines = pkgJson?.metadata?.engines;\n const hasPolicy = runtimePolicies.length > 0 || engines !== undefined;\n\n items.push({\n key: 'project.runtime.policy',\n source: 'fs',\n type: 'policy',\n availability: hasPolicy ? 'AVAILABLE' : 'UNAVAILABLE',\n value: {\n policyFiles: runtimePolicies.map((p) => p.name),\n ...(engines ? { engines } : {}),\n },\n });\n\n // 6. project.git\n items.push({\n key: 'project.git',\n source: 'fs',\n type: 'vcs',\n availability: project.git.isRepository ? 'AVAILABLE' : 'UNAVAILABLE',\n value: {\n isRepository: project.git.isRepository,\n ...(project.git.branch ? { branch: project.git.branch } : {}),\n },\n });\n\n // 7. project.config\n items.push({\n key: 'project.config',\n source: 'fs',\n type: 'config',\n availability: project.configFiles.length > 0 ? 'AVAILABLE' : 'UNAVAILABLE',\n value: {\n configFiles: project.configFiles.map((c) => ({\n name: c.name,\n category: c.category,\n })),\n count: project.configFiles.length,\n },\n });\n\n return {\n category: 'project',\n items: Object.freeze(items),\n };\n }\n}\n","import process from 'node:process';\nimport { resolveAndValidatePath } from '../../cli/path.js';\nimport { ProjectDiscovery } from '../../collection/project/discovery.js';\nimport { ProjectCollector } from '../../collection/project/project-collector.js';\nimport type { DiscoveredProject } from '../../collection/project/types.js';\nimport type { EvidenceSet } from '../../domain/evidence.js';\nimport { resolvePlatformAdapter } from '../../platform/detector.js';\nimport type { PlatformAdapter } from '../../platform/types.js';\n\nexport interface ProjectCollectionOptions {\n readonly targetPath?: string;\n readonly cwd?: string;\n readonly platformAdapter?: PlatformAdapter;\n}\n\nexport interface ProjectCollectionResult {\n readonly project: DiscoveredProject;\n readonly evidence: EvidenceSet;\n}\n\n/**\n * Application service coordinating project path resolution, project discovery,\n * and structured project evidence collection.\n * Reference: docs/ARCHITECTURE.md Section 5.2 and Section 18.\n */\nexport class ProjectCollectionService {\n private readonly discovery: ProjectDiscovery;\n private readonly collector: ProjectCollector;\n\n constructor(discovery?: ProjectDiscovery, collector?: ProjectCollector) {\n this.discovery = discovery ?? new ProjectDiscovery();\n this.collector = collector ?? new ProjectCollector(this.discovery);\n }\n\n /**\n * Discovers and collects structured project facts for the target directory.\n */\n public async discoverAndCollect(\n options: ProjectCollectionOptions = {},\n ): Promise<ProjectCollectionResult> {\n const cwd = options.cwd ?? process.cwd();\n const resolvedPath = resolveAndValidatePath(options.targetPath, cwd);\n const platformAdapter = options.platformAdapter ?? resolvePlatformAdapter();\n\n const project = await this.discovery.discover(resolvedPath);\n const evidence = await this.collector.collect({\n cwd: project.rootPath,\n platformAdapter,\n });\n\n return {\n project,\n evidence,\n };\n }\n}\n","import type { EvidenceItem, EvidenceSet } from '../../domain/evidence.js';\nimport type { Collector, CollectorContext } from '../types.js';\n\n/**\n * SystemCollector collects normalized system facts matching authoritative V1\n * diagnostic rules (SYS-001 through SYS-005 in docs/RULE-CATALOGUE.md).\n *\n * It is strictly read-only and produces structured evidence without making evaluative decisions.\n */\nexport class SystemCollector implements Collector<EvidenceSet> {\n public readonly name = 'system';\n public readonly category = 'system' as const;\n\n public async collect(context: CollectorContext): Promise<EvidenceSet> {\n const adapter = context.platformAdapter;\n const items: EvidenceItem[] = [];\n\n // 1. Platform support evidence (SYS-005)\n try {\n const platformInfo = adapter.getPlatformInfo();\n items.push({\n key: 'system.platform.supported',\n source: 'platform',\n type: 'platform',\n availability: 'AVAILABLE',\n value: {\n platform: platformInfo.platform,\n isSupported: platformInfo.isSupported,\n os: platformInfo.os,\n release: platformInfo.release,\n },\n });\n\n // 2. Architecture evidence (SYS-004)\n items.push({\n key: 'system.architecture',\n source: 'os.arch',\n type: 'architecture',\n availability: 'AVAILABLE',\n value: {\n arch: platformInfo.arch,\n },\n });\n } catch {\n items.push({\n key: 'system.platform.supported',\n source: 'platform',\n type: 'platform',\n availability: 'FAILED',\n });\n items.push({\n key: 'system.architecture',\n source: 'os.arch',\n type: 'architecture',\n availability: 'FAILED',\n });\n }\n\n // 3. Uptime evidence (SYS-003)\n try {\n const uptimeInfo = adapter.getUptimeInfo();\n items.push({\n key: 'system.uptime',\n source: 'os.uptime',\n type: 'duration',\n unit: 'seconds',\n availability: 'AVAILABLE',\n value: uptimeInfo.uptimeSeconds,\n });\n } catch {\n items.push({\n key: 'system.uptime',\n source: 'os.uptime',\n type: 'duration',\n unit: 'seconds',\n availability: 'FAILED',\n });\n }\n\n // 4. CPU metrics evidence (SYS-002)\n try {\n const cpuInfo = await adapter.getCpuInfo();\n const isAvailable = cpuInfo.utilizationPercent !== undefined;\n items.push({\n key: 'system.cpu',\n source: 'os.cpus',\n type: 'cpu',\n unit: 'percent',\n availability: isAvailable ? 'AVAILABLE' : 'UNAVAILABLE',\n value: cpuInfo,\n });\n } catch {\n items.push({\n key: 'system.cpu',\n source: 'os.cpus',\n type: 'cpu',\n unit: 'percent',\n availability: 'FAILED',\n });\n }\n\n // 5. Memory metrics evidence (SYS-001)\n try {\n const memoryInfo = await adapter.getMemoryInfo();\n items.push({\n key: 'system.memory',\n source: 'os.memory',\n type: 'memory',\n unit: 'bytes',\n availability: 'AVAILABLE',\n value: memoryInfo,\n });\n } catch {\n items.push({\n key: 'system.memory',\n source: 'os.memory',\n type: 'memory',\n unit: 'bytes',\n availability: 'FAILED',\n });\n }\n\n return {\n category: 'system',\n items: Object.freeze(items),\n };\n }\n}\n","import process from 'node:process';\nimport { SystemCollector } from '../../collection/system/system-collector.js';\nimport type { EvidenceSet } from '../../domain/evidence.js';\nimport { resolvePlatformAdapter } from '../../platform/detector.js';\nimport type { PlatformAdapter } from '../../platform/types.js';\n\nexport interface SystemCollectionOptions {\n readonly cwd?: string;\n readonly platformAdapter?: PlatformAdapter;\n}\n\n/**\n * Application service coordinating platform resolution and system facts collection.\n * Serves as the boundary between application use cases/scans and the collection layer.\n * Reference: docs/ARCHITECTURE.md Section 5.2.\n */\nexport class SystemCollectionService {\n private readonly collector: SystemCollector;\n\n constructor(collector?: SystemCollector) {\n this.collector = collector ?? new SystemCollector();\n }\n\n /**\n * Executes system facts collection and returns normalized structured evidence.\n */\n public async collectSystemEvidence(options: SystemCollectionOptions = {}): Promise<EvidenceSet> {\n const cwd = options.cwd ?? process.cwd();\n const platformAdapter = options.platformAdapter ?? resolvePlatformAdapter();\n\n return this.collector.collect({\n cwd,\n platformAdapter,\n });\n }\n}\n","import process from 'node:process';\nimport type { DetectionResult } from '../../domain/detection-result.js';\nimport type { EvidenceSet } from '../../domain/evidence.js';\nimport { isDiagnosticCategory, type DiagnosticCategory } from '../../domain/category.js';\nimport { resolvePlatformAdapter } from '../../platform/detector.js';\nimport type { PlatformAdapter } from '../../platform/types.js';\nimport { calculateScore, type ScoreResult } from '../../scoring/index.js';\nimport { createReportModel } from '../../reporting/model.js';\nimport type { ReportModel } from '../../reporting/types.js';\nimport type { DetectionContext } from '../../detection/types.js';\nimport { DetectionService } from './detection.service.js';\nimport { ProjectCollectionService } from './project-collection.service.js';\nimport { SystemCollectionService } from './system-collection.service.js';\n\nexport interface ScanOrchestratorOptions {\n readonly systemCollectionService?: SystemCollectionService;\n readonly projectCollectionService?: ProjectCollectionService;\n readonly detectionService?: DetectionService;\n}\n\nexport interface RunScanOptions {\n readonly command: string;\n readonly targetPath: string;\n readonly verbose?: boolean;\n readonly json?: boolean;\n readonly quiet?: boolean;\n readonly color?: boolean;\n readonly preview?: boolean;\n readonly platformAdapter?: PlatformAdapter;\n}\n\n/**\n * Application service orchestrating the full diagnostic pipeline:\n * Discovery -> Evidence Collection -> Rule Detection -> Health Scoring -> Report Assembly.\n * Adheres to docs/ARCHITECTURE.md Section 5.2 and docs/CLI-SPEC.md Section 46.\n */\nexport class ScanOrchestratorService {\n private readonly systemCollectionService: SystemCollectionService;\n private readonly projectCollectionService: ProjectCollectionService;\n private readonly detectionService: DetectionService;\n\n constructor(options: ScanOrchestratorOptions = {}) {\n this.systemCollectionService = options.systemCollectionService ?? new SystemCollectionService();\n this.projectCollectionService =\n options.projectCollectionService ?? new ProjectCollectionService();\n this.detectionService = options.detectionService ?? new DetectionService();\n }\n\n /**\n * Executes an end-to-end diagnostic scan for the specified command and options.\n */\n public async executeScan(options: RunScanOptions): Promise<ReportModel> {\n const { command, targetPath } = options;\n const platformAdapter = options.platformAdapter ?? resolvePlatformAdapter();\n\n // 1. Determine scan scope\n const scope = this.resolveScope(command);\n\n // 2. Collect evidence based on scope\n const evidenceSets: EvidenceSet[] = [];\n let projectRoot: string | undefined;\n\n const needsSystem = scope.includes('system');\n const needsProject = scope.includes('project');\n\n if (needsSystem && needsProject) {\n const [sysResult, projResult] = await Promise.allSettled([\n this.systemCollectionService.collectSystemEvidence({\n cwd: targetPath,\n platformAdapter,\n }),\n this.projectCollectionService.discoverAndCollect({\n targetPath,\n cwd: targetPath,\n platformAdapter,\n }),\n ]);\n\n if (sysResult.status === 'fulfilled') {\n evidenceSets.push(sysResult.value);\n } else {\n evidenceSets.push({\n category: 'system',\n items: [\n {\n key: 'system.platform.supported',\n source: 'platform',\n type: 'platform',\n availability: 'FAILED',\n },\n ],\n });\n }\n\n if (projResult.status === 'fulfilled') {\n evidenceSets.push(projResult.value.evidence);\n projectRoot = projResult.value.project.rootPath;\n } else {\n evidenceSets.push({\n category: 'project',\n items: [\n {\n key: 'project.root',\n source: 'discovery',\n type: 'path',\n availability: 'FAILED',\n },\n ],\n });\n }\n } else if (needsSystem) {\n try {\n const sysEvidence = await this.systemCollectionService.collectSystemEvidence({\n cwd: targetPath,\n platformAdapter,\n });\n evidenceSets.push(sysEvidence);\n } catch {\n evidenceSets.push({\n category: 'system',\n items: [\n {\n key: 'system.platform.supported',\n source: 'platform',\n type: 'platform',\n availability: 'FAILED',\n },\n ],\n });\n }\n } else if (needsProject) {\n try {\n const projResult = await this.projectCollectionService.discoverAndCollect({\n targetPath,\n cwd: targetPath,\n platformAdapter,\n });\n evidenceSets.push(projResult.evidence);\n projectRoot = projResult.project.rootPath;\n } catch {\n evidenceSets.push({\n category: 'project',\n items: [\n {\n key: 'project.root',\n source: 'discovery',\n type: 'path',\n availability: 'FAILED',\n },\n ],\n });\n }\n }\n\n // 3. Prepare detection context\n const detectionContext: DetectionContext = {\n platform: platformAdapter.platformType,\n projectRoot: projectRoot ?? targetPath,\n commandScope: command,\n env: process.env,\n targetNodeVersion: process.version,\n };\n\n // 4. Run detection engine\n const detectionResult: DetectionResult = await this.detectionService.runDetection(\n evidenceSets,\n detectionContext,\n );\n\n // 5. Calculate health score\n const scoreResult: ScoreResult = calculateScore(detectionResult.findings);\n\n // 6. Map category if command directly corresponds to one\n let category: DiagnosticCategory | undefined;\n if (isDiagnosticCategory(command)) {\n category = command;\n } else if (command === 'deps') {\n category = 'dependency';\n } else if (command === 'env') {\n category = 'environment';\n } else if (command === 'ports') {\n category = 'port';\n } else if (command === 'runtimes') {\n category = 'runtime';\n } else if (command === 'tools') {\n category = 'tool';\n } else if (command === 'paths') {\n category = 'path';\n } else if (command === 'versions') {\n category = 'version';\n } else if (command === 'caches' || command === 'clean') {\n category = 'cache';\n } else if (command === 'processes') {\n category = 'process';\n }\n\n // 7. Assemble canonical report model\n return createReportModel(detectionResult, {\n command,\n targetPath,\n scope,\n category,\n score: scoreResult,\n tool: 'yowtf',\n version: '0.1.0',\n });\n }\n\n private resolveScope(command: string): string {\n switch (command) {\n case 'system':\n case 'disk':\n case 'processes':\n case 'ports':\n case 'network':\n return 'system';\n case 'project':\n case 'deps':\n case 'git':\n case 'config':\n return 'project';\n case 'env':\n case 'runtimes':\n case 'tools':\n case 'paths':\n case 'versions':\n case 'caches':\n case 'clean':\n case 'doctor':\n case 'score':\n case 'explain':\n case 'yowtf':\n default:\n return 'system + project';\n }\n }\n}\n","import { EXIT_SUCCESS } from '../cli/errors.js';\nimport type { PlatformAdapter } from '../platform/types.js';\nimport type { ReportModel } from '../reporting/types.js';\nimport { ScanOrchestratorService } from './services/scan-orchestrator.service.js';\n\n/**\n * Application Layer foundational interfaces and use cases.\n * Orchestrates the scan lifecycle: discovery -> collection -> detection -> scoring -> reporting.\n * Reference: docs/ARCHITECTURE.md Section 5.2.\n */\n\nexport interface ScanOptions {\n readonly cwd?: string;\n readonly verbose?: boolean;\n readonly json?: boolean;\n readonly quiet?: boolean;\n readonly color?: boolean;\n}\n\nexport interface ApplicationContext {\n readonly cwd: string;\n}\n\nexport interface CommandContext {\n readonly command: string;\n readonly targetPath: string;\n readonly options: {\n readonly verbose?: boolean;\n readonly json?: boolean;\n readonly quiet?: boolean;\n readonly color?: boolean;\n readonly preview?: boolean;\n readonly platformAdapter?: PlatformAdapter;\n };\n}\n\nexport interface CommandResult {\n readonly command: string;\n readonly targetPath: string;\n readonly status: 'ready' | 'executed' | 'error';\n readonly message?: string;\n readonly exitCode: number;\n readonly reportModel?: ReportModel;\n}\n\n/**\n * Application entry point for command execution.\n * Orchestrates the full diagnostic pipeline:\n * Discovery -> Evidence Collection -> Detection -> Scoring -> Reporting.\n */\nexport async function executeCommand(\n context: CommandContext,\n orchestrator: ScanOrchestratorService = new ScanOrchestratorService(),\n): Promise<CommandResult> {\n const reportModel = await orchestrator.executeScan({\n command: context.command,\n targetPath: context.targetPath,\n verbose: context.options.verbose,\n json: context.options.json,\n quiet: context.options.quiet,\n color: context.options.color,\n preview: context.options.preview,\n platformAdapter: context.options.platformAdapter,\n });\n\n return {\n command: context.command,\n targetPath: context.targetPath,\n status: 'executed',\n exitCode: EXIT_SUCCESS,\n reportModel,\n };\n}\n\nexport * from './services/system-collection.service.js';\nexport * from './services/project-collection.service.js';\nexport * from './services/detection.service.js';\nexport * from './services/scan-orchestrator.service.js';\n","import type { ReportModel, ReportOptions, Reporter } from './types.js';\n\n/**\n * Pure machine-readable JSON reporter.\n * Adheres strictly to docs/CLI-SPEC.md Section 12, 15, 46, & 47:\n * - Emits valid, formatted JSON\n * - Zero ANSI color codes\n * - Zero spinner noise\n * - Zero decorative boxes or tables\n * - Deterministic, stable field ordering\n * - Quiet mode does not alter or suppress required JSON fields\n */\nexport class JsonReporter implements Reporter {\n public readonly format = 'json' as const;\n\n public render(model: ReportModel, _options: ReportOptions = {}): string {\n const payload = {\n metadata: {\n tool: model.metadata.tool,\n version: model.metadata.version,\n command: model.metadata.command,\n targetPath: model.metadata.targetPath,\n scope: model.metadata.scope,\n ...(model.metadata.category ? { category: model.metadata.category } : {}),\n },\n status: model.status,\n score: model.score\n ? {\n value: model.score.score,\n rawScore: model.score.rawScore,\n band: model.score.band,\n totalPenalty: model.score.totalPenalty,\n findingsCount: model.score.totalFindings,\n penalties: model.score.penalties.map((p) => ({\n ruleId: p.ruleId,\n severity: p.severity,\n status: p.status,\n penalty: p.penalty,\n })),\n }\n : undefined,\n coverage: {\n totalRules: model.coverage.totalRules,\n executed: model.coverage.executed,\n passed: model.coverage.passed,\n failed: model.coverage.failed,\n warned: model.coverage.warned,\n skipped: model.coverage.skipped,\n unavailable: model.coverage.unavailable,\n errored: model.coverage.errored,\n },\n findings: model.findings.map((f) => ({\n ruleId: f.ruleId,\n category: f.category,\n status: f.status,\n severity: f.severity,\n confidence: f.confidence,\n title: f.title,\n summary: f.summary,\n ...(f.explanation ? { explanation: f.explanation } : {}),\n ...(f.impact ? { impact: f.impact } : {}),\n ...(f.remediationHint ? { remediationHint: f.remediationHint } : {}),\n ...(f.evidence\n ? {\n evidence: {\n items: f.evidence.items.map((it) => ({\n key: it.key,\n source: it.source,\n availability: it.availability,\n ...(it.value !== undefined ? { value: it.value } : {}),\n })),\n ...(f.evidence.details ? { details: f.evidence.details } : {}),\n },\n }\n : {}),\n })),\n };\n\n return JSON.stringify(payload, null, 2);\n }\n}\n","import boxen from 'boxen';\nimport { Chalk, type ChalkInstance } from 'chalk';\nimport Table from 'cli-table3';\nimport type { FindingSeverity } from '../domain/severity.js';\nimport type { FindingStatus } from '../domain/status.js';\nimport type { ScoreBand } from '../scoring/index.js';\nimport type { ReportModel, ReportOptions, Reporter } from './types.js';\n\n/**\n * Terminal presentation reporter.\n * Adheres to docs/CLI-SPEC.md Section 14, 18, 30, 32, 33, 64-68 and docs/COMMANDS.md.\n * - Supports color/no-color via Chalk level toggle\n * - Clean, professional layout with Boxen for health scores\n * - Structured tables via cli-table3 for findings where helpful\n * - Supports --quiet mode (minimal summary & key failures)\n * - Supports --verbose mode (exposing rule IDs, coverage, evidence keys)\n * - Command-specific presentation:\n * - score: focused score view\n * - explain: deep explanation view (problem -> evidence -> impact -> next action)\n * - doctor: prioritized problem view\n * - default / category commands: full / scoped diagnostics\n */\nexport class TerminalReporter implements Reporter {\n public readonly format = 'terminal' as const;\n\n public render(model: ReportModel, options: ReportOptions = {}): string {\n const isColor = options.color !== false;\n const c = new Chalk({ level: isColor ? 2 : 0 });\n const isQuiet = Boolean(options.quiet);\n const isVerbose = Boolean(options.verbose);\n const cmd = options.command ?? model.metadata.command;\n\n if (cmd === 'score') {\n return this.renderScoreOnly(model, c, isQuiet);\n }\n\n if (cmd === 'explain') {\n return this.renderExplainView(model, c, isQuiet, isVerbose);\n }\n\n return this.renderStandardView(model, c, isQuiet, isVerbose);\n }\n\n private renderScoreOnly(model: ReportModel, c: ChalkInstance, isQuiet: boolean): string {\n if (!model.score) {\n return c.dim('No score available for this evaluation.');\n }\n\n const { score, band, totalPenalty, totalFindings } = model.score;\n const bandColored = this.colorScoreBand(band, c);\n\n if (isQuiet) {\n return `${score}/100 (${band})`;\n }\n\n const content = [\n c.bold(`Workstation Health Score: ${this.colorScore(score, c)}/100`),\n `Status: ${bandColored}`,\n `Total Deductions: ${c.yellow(String(totalPenalty))} pts across ${totalFindings} finding(s)`,\n c.dim(`Evaluated scope: ${model.metadata.scope}`),\n ].join('\\n');\n\n return boxen(content, {\n padding: 1,\n margin: 0,\n borderStyle: 'round',\n borderColor: this.getBorderColorForBand(band),\n });\n }\n\n private renderExplainView(\n model: ReportModel,\n c: ChalkInstance,\n isQuiet: boolean,\n isVerbose: boolean,\n ): string {\n const lines: string[] = [];\n\n lines.push(c.bold(`YOWTF Diagnostic Explanations — Scope: ${model.metadata.scope}`));\n lines.push(c.dim(`Target: ${model.metadata.targetPath}`));\n lines.push('');\n\n const problemFindings = model.findings.filter(\n (f) => f.status === 'FAIL' || f.status === 'WARN',\n );\n\n if (problemFindings.length === 0) {\n lines.push(c.green('✓ No warning or failure conditions requiring explanation.'));\n return lines.join('\\n');\n }\n\n for (let i = 0; i < problemFindings.length; i++) {\n const f = problemFindings[i]!;\n const num = c.dim(`[${i + 1}/${problemFindings.length}]`);\n const statusBadge = this.formatStatusBadge(f.status, c);\n const severityTag = this.formatSeverity(f.severity, c);\n\n lines.push(`${num} ${statusBadge} ${c.bold(f.title)} ${severityTag}`);\n if (isVerbose) {\n lines.push(\n c.dim(` Rule ID: ${f.ruleId} (Category: ${f.category}, Confidence: ${f.confidence})`),\n );\n }\n lines.push(` ${c.bold('Summary:')} ${f.summary}`);\n\n if (f.explanation) {\n lines.push(` ${c.bold('Why it matters:')} ${f.explanation}`);\n }\n\n if (f.impact) {\n lines.push(` ${c.bold('Impact:')} ${f.impact}`);\n }\n\n if (f.remediationHint) {\n lines.push(` ${c.bold('Recommended action:')} ${c.cyan(f.remediationHint)}`);\n }\n\n if (f.evidence?.items && f.evidence.items.length > 0 && !isQuiet) {\n const evSummary = f.evidence.items\n .map((item) => `${item.key} (${item.availability})`)\n .join(', ');\n lines.push(` ${c.dim('Evidence:')} ${c.dim(evSummary)}`);\n }\n\n lines.push('');\n }\n\n return lines.join('\\n');\n }\n\n private renderStandardView(\n model: ReportModel,\n c: ChalkInstance,\n isQuiet: boolean,\n isVerbose: boolean,\n ): string {\n const lines: string[] = [];\n\n // Header & Score Banner (if score present and not quiet)\n if (!isQuiet && model.score) {\n const scoreLine = `Health Score: ${this.colorScore(model.score.score, c)}/100 (${this.colorScoreBand(model.score.band, c)})`;\n const scopeLine = c.dim(\n `Scope: ${model.metadata.scope} | Target: ${model.metadata.targetPath}`,\n );\n const summaryBox = boxen(`${c.bold('YOWTF Diagnostic Report')}\\n${scoreLine}\\n${scopeLine}`, {\n padding: 0,\n margin: 0,\n borderStyle: 'single',\n borderColor: this.getBorderColorForBand(model.score.band),\n });\n lines.push(summaryBox);\n lines.push('');\n } else if (isQuiet && model.score) {\n lines.push(`Score: ${model.score.score}/100 (${model.score.band})`);\n }\n\n // Filter findings for quiet mode (only FAIL / WARN)\n const displayFindings = isQuiet\n ? model.findings.filter((f) => f.status === 'FAIL' || f.status === 'WARN')\n : model.findings;\n\n if (displayFindings.length > 0) {\n const table = new Table({\n head: isVerbose\n ? [c.bold('Status'), c.bold('Severity'), c.bold('Rule ID'), c.bold('Summary')]\n : [c.bold('Status'), c.bold('Severity'), c.bold('Finding')],\n style: { head: [], border: [] },\n colWidths: isVerbose ? [10, 10, 32, 50] : [10, 10, 70],\n wordWrap: true,\n });\n\n for (const f of displayFindings) {\n const statusBadge = this.formatStatusBadge(f.status, c);\n const severityBadge = this.formatSeverity(f.severity, c);\n\n if (isVerbose) {\n table.push([statusBadge, severityBadge, f.ruleId, f.summary]);\n } else {\n table.push([\n statusBadge,\n severityBadge,\n f.title ? `${f.title}: ${f.summary}` : f.summary,\n ]);\n }\n }\n\n lines.push(table.toString());\n lines.push('');\n } else if (!isQuiet) {\n lines.push(c.green('✓ No diagnostic findings recorded.'));\n lines.push('');\n }\n\n // Coverage & Statistics (when not in quiet mode)\n if (!isQuiet) {\n const cov = model.coverage;\n const covParts: string[] = [\n `Executed: ${c.bold(String(cov.executed))}/${cov.totalRules}`,\n `Passed: ${c.green(String(cov.passed))}`,\n `Warned: ${c.yellow(String(cov.warned))}`,\n `Failed: ${c.red(String(cov.failed))}`,\n `Skipped: ${c.dim(String(cov.skipped))}`,\n `Unavailable: ${c.dim(String(cov.unavailable))}`,\n ];\n\n if (cov.errored > 0) {\n covParts.push(`Errors: ${c.redBright(String(cov.errored))}`);\n }\n\n lines.push(c.dim(`Coverage: ${covParts.join(' | ')}`));\n }\n\n return lines.join('\\n');\n }\n\n private formatStatusBadge(status: FindingStatus, c: ChalkInstance): string {\n switch (status) {\n case 'PASS':\n return c.green('PASS');\n case 'FAIL':\n return c.red.bold('FAIL');\n case 'WARN':\n return c.yellow.bold('WARN');\n case 'UNAVAILABLE':\n return c.dim('UNAVAIL');\n case 'SKIPPED':\n return c.dim('SKIP');\n case 'ERROR':\n return c.redBright.bold('ERROR');\n default:\n return String(status);\n }\n }\n\n private formatSeverity(severity: FindingSeverity, c: ChalkInstance): string {\n switch (severity) {\n case 'CRITICAL':\n return c.red.bold('CRITICAL');\n case 'HIGH':\n return c.red('HIGH');\n case 'MEDIUM':\n return c.yellow('MEDIUM');\n case 'LOW':\n return c.blue('LOW');\n case 'INFO':\n return c.dim('INFO');\n default:\n return String(severity);\n }\n }\n\n private colorScore(score: number, c: ChalkInstance): string {\n if (score >= 90) return c.green.bold(String(score));\n if (score >= 75) return c.cyan.bold(String(score));\n if (score >= 60) return c.yellow.bold(String(score));\n return c.red.bold(String(score));\n }\n\n private colorScoreBand(band: ScoreBand, c: ChalkInstance): string {\n switch (band) {\n case 'EXCELLENT':\n return c.green.bold('EXCELLENT');\n case 'GOOD':\n return c.cyan.bold('GOOD');\n case 'FAIR':\n return c.yellow.bold('FAIR');\n case 'POOR':\n return c.red('POOR');\n case 'CRITICAL':\n return c.red.bold('CRITICAL');\n }\n }\n\n private getBorderColorForBand(band: ScoreBand): string {\n switch (band) {\n case 'EXCELLENT':\n return 'green';\n case 'GOOD':\n return 'cyan';\n case 'FAIR':\n return 'yellow';\n case 'POOR':\n case 'CRITICAL':\n return 'red';\n }\n }\n}\n","import { executeCommand, type CommandContext } from '../application/index.js';\nimport { JsonReporter, TerminalReporter } from '../reporting/index.js';\nimport type { GlobalOptions } from './options.js';\nimport { resolveAndValidatePath } from './path.js';\n\nexport interface DispatchOptions extends GlobalOptions {\n readonly preview?: boolean;\n}\n\n/**\n * Dispatches a parsed CLI command to the application layer.\n * Normalizes global options and path, delegates to the application use case,\n * and formats the resulting response according to presentation options.\n */\nexport async function dispatchCommand(\n commandName: string,\n options: DispatchOptions,\n commandSpecificOptions: Record<string, unknown> = {},\n): Promise<number> {\n const targetPath = resolveAndValidatePath(options.path);\n\n const context: CommandContext = {\n command: commandName,\n targetPath,\n options: {\n verbose: Boolean(options.verbose),\n json: Boolean(options.json),\n quiet: Boolean(options.quiet),\n color: options.color !== false,\n ...commandSpecificOptions,\n },\n };\n\n const result = await executeCommand(context);\n\n if (result.reportModel) {\n if (options.json) {\n const reporter = new JsonReporter();\n const output = reporter.render(result.reportModel, {\n json: true,\n quiet: Boolean(options.quiet),\n verbose: Boolean(options.verbose),\n command: commandName,\n });\n process.stdout.write(`${output}\\n`);\n return result.exitCode;\n }\n\n const reporter = new TerminalReporter();\n const output = reporter.render(result.reportModel, {\n color: options.color !== false,\n quiet: Boolean(options.quiet),\n verbose: Boolean(options.verbose),\n command: commandName,\n });\n if (output) {\n process.stdout.write(`${output}\\n`);\n }\n return result.exitCode;\n }\n\n return result.exitCode;\n}\n","import type { Command } from 'commander';\n\n/**\n * Global CLI options interface.\n * Adheres to docs/CLI-SPEC.md Section 7.\n */\nexport interface GlobalOptions {\n readonly verbose?: boolean;\n readonly color?: boolean; // --no-color sets color: false in Commander\n readonly json?: boolean;\n readonly quiet?: boolean;\n readonly path?: string;\n}\n\n/**\n * Registers all authoritative global options on a Commander command.\n */\nexport function registerGlobalOptions(command: Command): void {\n command\n .option('--verbose', 'enable additional diagnostic output')\n .option('--no-color', 'disable terminal colors')\n .option('--json', 'emit machine-readable JSON')\n .option('--quiet', 'reduce human-readable output')\n .option('--path <dir>', 'analyze the specified directory');\n}\n","import { Command, CommanderError } from 'commander';\nimport { registerAllCommands } from './commands/index.js';\nimport {\n CliError,\n EXIT_APPLICATION_ERROR,\n EXIT_SUCCESS,\n EXIT_USAGE_ERROR,\n formatCliError,\n} from './errors.js';\nimport { registerGlobalOptions } from './options.js';\n\nexport const APP_NAME = 'yowtf';\nexport const APP_FULL_NAME = 'Your Operating Workstation Trouble Finder';\nexport const APP_TAGLINE = 'Yo, WTF is happening?';\nexport const APP_VERSION = '0.1.0';\n\n/**\n * Creates and configures the complete Commander program for YOWTF.\n * Registers global options and all 20 public V1 commands.\n * Adheres to docs/CLI-SPEC.md and docs/COMMANDS.md.\n */\nexport function createProgram(): Command {\n const program = new Command();\n\n program\n .name(APP_NAME)\n .description(`${APP_FULL_NAME} — ${APP_TAGLINE}`)\n .version(APP_VERSION, '-V, --version', 'output the version number')\n .helpOption('-h, --help', 'display help for command')\n .exitOverride();\n\n // Register global options on the root program\n registerGlobalOptions(program);\n\n // Register all 20 public commands\n registerAllCommands(program);\n\n return program;\n}\n\n/**\n * Executes the Commander program with the provided arguments.\n * Returns process exit code:\n * - 0: Success (or help/version output)\n * - 1: Application/diagnostic failure\n * - 2: CLI usage error (unknown command, unknown option, invalid path, etc.)\n */\nexport async function runCli(argv: string[] = process.argv): Promise<number> {\n const program = createProgram();\n\n try {\n await program.parseAsync(argv);\n return EXIT_SUCCESS;\n } catch (error: unknown) {\n if (error instanceof CommanderError) {\n // Commander sets exitCode = 0 for --help and --version (helpDisplayed, version)\n if (error.exitCode === 0) {\n return EXIT_SUCCESS;\n }\n // Any other Commander parsing/usage error maps to exit code 2\n return EXIT_USAGE_ERROR;\n }\n\n if (error instanceof CliError) {\n process.stderr.write(`${formatCliError(error)}\\n`);\n return error.exitCode;\n }\n\n process.stderr.write(`${formatCliError(error)}\\n`);\n return EXIT_APPLICATION_ERROR;\n }\n}\n","import type { Command } from 'commander';\nimport { dispatchCommand, type DispatchOptions } from '../dispatch.js';\nimport { registerGlobalOptions } from '../options.js';\n\n/**\n * Registers Core diagnostics commands:\n * - root action (default health scan)\n * - doctor\n * - score\n * - explain\n * Reference: docs/COMMANDS.md Section 5 & Section 70.\n */\nexport function registerCoreCommands(program: Command): void {\n // Root default action: yowtf\n program.action(async (_options: unknown, cmd: Command) => {\n const opts = cmd.optsWithGlobals<DispatchOptions>();\n await dispatchCommand('yowtf', opts);\n });\n\n // yowtf doctor\n const doctorCmd = program\n .command('doctor')\n .description('Run diagnostic-oriented health scan')\n .action(async (_options: unknown, cmd: Command) => {\n const opts = cmd.optsWithGlobals<DispatchOptions>();\n await dispatchCommand('doctor', opts);\n });\n registerGlobalOptions(doctorCmd);\n\n // yowtf score\n const scoreCmd = program\n .command('score')\n .description('Calculate and display workstation health score')\n .action(async (_options: unknown, cmd: Command) => {\n const opts = cmd.optsWithGlobals<DispatchOptions>();\n await dispatchCommand('score', opts);\n });\n registerGlobalOptions(scoreCmd);\n\n // yowtf explain\n const explainCmd = program\n .command('explain')\n .description('Explain detected diagnostic findings in detail')\n .action(async (_options: unknown, cmd: Command) => {\n const opts = cmd.optsWithGlobals<DispatchOptions>();\n await dispatchCommand('explain', opts);\n });\n registerGlobalOptions(explainCmd);\n}\n","import type { Command } from 'commander';\nimport { dispatchCommand, type DispatchOptions } from '../dispatch.js';\nimport { registerGlobalOptions } from '../options.js';\n\n/**\n * Registers Workstation diagnostics commands:\n * - system\n * - disk\n * - processes\n * - ports\n * - network\n * Reference: docs/COMMANDS.md Section 5 & Section 70.\n */\nexport function registerWorkstationCommands(program: Command): void {\n // yowtf system\n const systemCmd = program\n .command('system')\n .description('Inspect workstation-level system information')\n .action(async (_options: unknown, cmd: Command) => {\n const opts = cmd.optsWithGlobals<DispatchOptions>();\n await dispatchCommand('system', opts);\n });\n registerGlobalOptions(systemCmd);\n\n // yowtf disk\n const diskCmd = program\n .command('disk')\n .description('Inspect storage health and disk space')\n .action(async (_options: unknown, cmd: Command) => {\n const opts = cmd.optsWithGlobals<DispatchOptions>();\n await dispatchCommand('disk', opts);\n });\n registerGlobalOptions(diskCmd);\n\n // yowtf processes\n const processesCmd = program\n .command('processes')\n .description('Inspect running development-related processes')\n .action(async (_options: unknown, cmd: Command) => {\n const opts = cmd.optsWithGlobals<DispatchOptions>();\n await dispatchCommand('processes', opts);\n });\n registerGlobalOptions(processesCmd);\n\n // yowtf ports\n const portsCmd = program\n .command('ports')\n .description('Inspect development ports and listening services')\n .action(async (_options: unknown, cmd: Command) => {\n const opts = cmd.optsWithGlobals<DispatchOptions>();\n await dispatchCommand('ports', opts);\n });\n registerGlobalOptions(portsCmd);\n\n // yowtf network\n const networkCmd = program\n .command('network')\n .description('Inspect local network configuration and connectivity')\n .action(async (_options: unknown, cmd: Command) => {\n const opts = cmd.optsWithGlobals<DispatchOptions>();\n await dispatchCommand('network', opts);\n });\n registerGlobalOptions(networkCmd);\n}\n","import type { Command } from 'commander';\nimport { dispatchCommand, type DispatchOptions } from '../dispatch.js';\nimport { registerGlobalOptions } from '../options.js';\n\n/**\n * Registers Development Environment diagnostics commands:\n * - env\n * - runtimes\n * - tools\n * - paths\n * - versions\n * Reference: docs/COMMANDS.md Section 5 & Section 70.\n */\nexport function registerEnvironmentCommands(program: Command): void {\n // yowtf env\n const envCmd = program\n .command('env')\n .description('Inspect development environment variables and configuration')\n .action(async (_options: unknown, cmd: Command) => {\n const opts = cmd.optsWithGlobals<DispatchOptions>();\n await dispatchCommand('env', opts);\n });\n registerGlobalOptions(envCmd);\n\n // yowtf runtimes\n const runtimesCmd = program\n .command('runtimes')\n .description('Inspect installed development runtimes')\n .action(async (_options: unknown, cmd: Command) => {\n const opts = cmd.optsWithGlobals<DispatchOptions>();\n await dispatchCommand('runtimes', opts);\n });\n registerGlobalOptions(runtimesCmd);\n\n // yowtf tools\n const toolsCmd = program\n .command('tools')\n .description('Inspect installed developer tools and package managers')\n .action(async (_options: unknown, cmd: Command) => {\n const opts = cmd.optsWithGlobals<DispatchOptions>();\n await dispatchCommand('tools', opts);\n });\n registerGlobalOptions(toolsCmd);\n\n // yowtf paths\n const pathsCmd = program\n .command('paths')\n .description('Inspect executable and PATH resolution')\n .action(async (_options: unknown, cmd: Command) => {\n const opts = cmd.optsWithGlobals<DispatchOptions>();\n await dispatchCommand('paths', opts);\n });\n registerGlobalOptions(pathsCmd);\n\n // yowtf versions\n const versionsCmd = program\n .command('versions')\n .description('Inspect version consistency among tools and runtimes')\n .action(async (_options: unknown, cmd: Command) => {\n const opts = cmd.optsWithGlobals<DispatchOptions>();\n await dispatchCommand('versions', opts);\n });\n registerGlobalOptions(versionsCmd);\n}\n","import type { Command } from 'commander';\nimport { dispatchCommand, type DispatchOptions } from '../dispatch.js';\nimport { registerGlobalOptions } from '../options.js';\n\n/**\n * Registers Project diagnostics commands:\n * - project\n * - deps\n * - git\n * - config\n * Reference: docs/COMMANDS.md Section 5 & Section 70.\n */\nexport function registerProjectCommands(program: Command): void {\n // yowtf project\n const projectCmd = program\n .command('project')\n .description('Inspect current project configuration and environment')\n .action(async (_options: unknown, cmd: Command) => {\n const opts = cmd.optsWithGlobals<DispatchOptions>();\n await dispatchCommand('project', opts);\n });\n registerGlobalOptions(projectCmd);\n\n // yowtf deps\n const depsCmd = program\n .command('deps')\n .description('Inspect project dependencies and lockfile consistency')\n .action(async (_options: unknown, cmd: Command) => {\n const opts = cmd.optsWithGlobals<DispatchOptions>();\n await dispatchCommand('deps', opts);\n });\n registerGlobalOptions(depsCmd);\n\n // yowtf git\n const gitCmd = program\n .command('git')\n .description('Inspect Git repository state and health')\n .action(async (_options: unknown, cmd: Command) => {\n const opts = cmd.optsWithGlobals<DispatchOptions>();\n await dispatchCommand('git', opts);\n });\n registerGlobalOptions(gitCmd);\n\n // yowtf config\n const configCmd = program\n .command('config')\n .description('Inspect project and developer tool configuration files')\n .action(async (_options: unknown, cmd: Command) => {\n const opts = cmd.optsWithGlobals<DispatchOptions>();\n await dispatchCommand('config', opts);\n });\n registerGlobalOptions(configCmd);\n}\n","import type { Command } from 'commander';\nimport { dispatchCommand, type DispatchOptions } from '../dispatch.js';\nimport { registerGlobalOptions } from '../options.js';\n\ninterface CleanCommandOptions extends DispatchOptions {\n readonly preview?: boolean;\n}\n\n/**\n * Registers Storage diagnostics commands:\n * - caches\n * - clean (with --preview)\n * Reference: docs/COMMANDS.md Section 5 & Section 70.\n */\nexport function registerStorageCommands(program: Command): void {\n // yowtf caches\n const cachesCmd = program\n .command('caches')\n .description('Inspect developer caches and temporary storage')\n .action(async (_options: unknown, cmd: Command) => {\n const opts = cmd.optsWithGlobals<DispatchOptions>();\n await dispatchCommand('caches', opts);\n });\n registerGlobalOptions(cachesCmd);\n\n // yowtf clean\n const cleanCmd = program\n .command('clean')\n .description('Identify cleanup candidates for caches and temporary files')\n .option('--preview', 'preview cleanup candidates without modifying anything')\n .action(async (_options: unknown, cmd: Command) => {\n const opts = cmd.optsWithGlobals<CleanCommandOptions>();\n await dispatchCommand('clean', opts, {\n preview: Boolean(opts.preview),\n });\n });\n registerGlobalOptions(cleanCmd);\n}\n","import type { Command } from 'commander';\nimport { registerCoreCommands } from './core.js';\nimport { registerWorkstationCommands } from './workstation.js';\nimport { registerEnvironmentCommands } from './environment.js';\nimport { registerProjectCommands } from './project.js';\nimport { registerStorageCommands } from './storage.js';\n\n/**\n * Registers all 20 public V1 commands on the Commander program.\n * Reference: docs/COMMANDS.md Section 2 & Section 70.\n */\nexport function registerAllCommands(program: Command): void {\n registerCoreCommands(program);\n registerWorkstationCommands(program);\n registerEnvironmentCommands(program);\n registerProjectCommands(program);\n registerStorageCommands(program);\n}\n"],"mappings":"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","names":["os","os","os","os","os","process","process","ONE_GB","fs","os","path","process","process","process","process","process","process","reporter","output"]}
|