export interface ToolKnob { knob: string; type: string; default: boolean | number | string | null; threshold: boolean; } export interface Exemplar { before: string; after: string; lang: string; } export interface QualityConcept { id: string; dimension: string; total: number; exemplar?: Exemplar; } export interface QualityConcernRecord { name: string; value: boolean | number; severity: string; numeric: boolean; toolCount: number; ruleCount: number; valueDerivation?: string; knobPerTool?: Record; configOptions?: string[]; } export interface QualityRuleRecord { name: string; tool: string; ecosystem: string; ruleId: string; ruleName: string; concern: string; category: string; url: string; canonical?: string[]; knobs?: ToolKnob[]; } export interface QualityToolRecord { name: string; ecosystem: string; ruleCount: number; knobCount: number; detectionOnly: boolean; } export interface QualityConcern extends QualityConcernRecord { id: string; } export interface QualityRule extends QualityRuleRecord { id: string; } export interface QualityTool extends QualityToolRecord { id: string; } export interface QualityData { concerns: QualityConcernRecord[]; rules: QualityRuleRecord[]; tools: QualityToolRecord[]; concepts: QualityConcept[]; } export type CatalogRule = Record & { ruleId: string }; export interface KnobSpec { default: unknown; knob: string; threshold: boolean; type?: string; fixed?: boolean; } export type KnobEntry = [string, string, KnobSpec]; export interface CatalogProduct { source: string; rules: CatalogRule[]; summary: Record; } export type ProducerRefresh = "build" | "manual"; export interface CatalogProducer { name: string; refresh: ProducerRefresh; produce: () => Promise; knobs?: () => Promise; } export interface CatalogRequest { rules: readonly string[]; knobs: readonly string[]; } export interface CatalogWriter { json: (file: string, data: unknown) => Promise; text: (file: string, text: string) => Promise; markdown: (file: string, text: string) => Promise; } export interface ToolTally { ecosystem: string; rules: number; tool: string; version: string; } export interface ConceptEntry { byEcosystem: Record; byTool: Record; dimension: string; id: string; sample: string[]; tools: number; total: number; exemplar?: unknown; } export interface RuleKnob { default: unknown; knob: string; threshold: boolean; type?: string; } export interface ConcernControl { rules: number; severity: string; tools: number; value: boolean | number; valueDerivation?: string; knobPerTool?: Record; configOptions?: string[]; } export interface CatalogState { rules?: CatalogRule[]; classified?: CatalogRule[]; catalog?: CatalogRule[]; concepts?: ConceptEntry[]; ruleKnobs?: Record; } export type CatalogKey = keyof CatalogState; export interface CatalogStep { name: string; needs: readonly CatalogKey[]; gives: readonly CatalogKey[]; run: (state: CatalogState, writer: CatalogWriter) => Promise>; }