import type { DiffFile } from '@sofagent/core'; import type { RuleCheck } from './rules/types'; /** 规则严重级别 */ export type RulesetSeverity = 'FAIL' | 'WARN'; /** JSON 规则的两种类型 */ export type RulesetRuleType = 'pattern' | 'plugin'; /** JSON 规则集 schema 中的单条规则 */ export interface RulesetRule { /** 规则唯一 ID(用于去重和引用) */ id: string; /** 规则显示名称 */ name: string; /** 规则描述 */ description?: string; /** 严重级别:FAIL = 违规(exit 2),WARN = 警告(exit 1) */ severity: RulesetSeverity; /** 规则类型:pattern = 内置正则,plugin = 外部 npm 包 */ type: RulesetRuleType; /** 正则匹配模式(对 diff 新增行做匹配) */ pattern?: string; /** 文件名过滤正则(可选,不设则匹配所有文件) */ filePattern?: string; /** 匹配时输出的消息模板(支持 {match} / {file} / {line} 占位符) */ message?: string; /** npm 包名(type=plugin 时必填) */ plugin?: string; /** 传给插件的可选参数 */ options?: Record; } /** JSON 规则集 schema */ export interface Ruleset { /** 规则集名称(唯一标识,如 sofagent / security) */ name: string; /** 规则集版本 */ version: string; /** 规则集描述 */ description?: string; /** 作者信息 */ author?: string; /** 规则集主页 URL */ homepage?: string; /** 规则列表 */ rules: RulesetRule[]; } /** 加载规则集时的错误 */ export declare class RulesetLoadError extends Error { readonly rulesetName?: string | undefined; constructor(message: string, rulesetName?: string | undefined); } /** 规则集校验错误(JSON 格式不合法) */ export declare class RulesetValidationError extends Error { readonly errors: string[]; constructor(message: string, errors: string[]); } /** * 校验规则集 JSON 结构完整性 * * @param raw 原始 JSON 对象 * @throws RulesetValidationError 当结构不合法时 */ export declare function validateRuleset(raw: unknown): asserts raw is Ruleset; /** * 从 JSON 文件路径加载单个规则集 * * @param filePath JSON 文件路径 * @returns 解析后的规则集 * @throws RulesetLoadError 文件不存在或读取失败 * @throws RulesetValidationError JSON 格式不合法 */ export declare function loadRulesetFile(filePath: string): Ruleset; /** * 按名称加载内置规则集 * * 内置规则集名称: * - sofagent:完整规则集(24 条模式规则,覆盖安全/质量/工程规范) * - security:安全子集(仅安全相关规则,适合 CI 严格模式) * * @param name 规则集名称(sofagent / security) * @returns 解析后的规则集 * @throws RulesetLoadError 内置规则集不存在 */ export declare function loadRuleset(name: string): Ruleset; /** * 从本地目录加载规则集 * * 目录结构:每个 .json 文件是一个规则集,文件名(不含 .json)即规则集名称。 * 如果目录中有 index.json,则只加载该文件。 * * @param dirPath 本地规则集目录 * @param name 可选规则集名称(不传则加载目录下 index.json 或第一个 .json) * @returns 解析后的规则集 * @throws RulesetLoadError 目录不存在或无规则集文件 */ export declare function loadRulesetFromPath(dirPath: string, name?: string): Ruleset; /** * 列出内置规则集名称 * * @returns 内置规则集名称数组 */ export declare function listBuiltinRulesetNames(): string[]; /** * 列出本地目录中的规则集名称 * * @param dirPath 本地规则集目录 * @returns 规则集名称数组 */ export declare function listLocalRulesetNames(dirPath: string): string[]; /** * 列出所有可用规则集(内置 + 本地,如有本地路径) * * @param localPath 可选的本地规则集目录 * @returns 规则集信息数组 */ export interface RulesetInfo { name: string; source: 'builtin' | 'local'; description?: string; } export declare function listAvailableRulesets(localPath?: string): RulesetInfo[]; /** * 静态检测邪恶 pattern——嵌套量词是 catastrophic backtracking 的经典模式 * * @returns 检测到的危险描述(null = 安全) */ export declare function detectReDoSPattern(pattern: string): string | null; /** * 运行时 ReDoS timeout 检测——用一段对抗性输入测试 pattern 是否会挂死 * * @param regex 已编译的正则 * @param ruleName 规则名(用于告警) * @returns true = 安全(未超时),false = 危险(超时) */ export declare function isPatternReDoSSafe(regex: RegExp, ruleName?: string): boolean; /** * 执行单条 pattern 类型规则 * * 对 diff 中每个文件的新增行(以 + 开头,非 +++)做正则匹配,命中则收集为 detail。 * DiffFile.lines 是原始 diff 行,如 "+const key = 'xxx'" / "-old line" / " context"。 * * @param rule 规则集规则定义 * @param diffFiles diff 文件列表 * @returns 规则检查结果 */ export declare function runPatternRule(rule: RulesetRule, diffFiles: DiffFile[]): RuleCheck; /** * 执行整个规则集,返回所有规则的检查结果 * * pattern 类型规则同步执行(正则匹配), * plugin 类型规则委托给 plugin-runner 异步加载执行。 * * @param diffFiles diff 文件列表 * @param ruleset 加载的规则集 * @returns 规则检查结果数组 */ export declare function runRulesetRules(diffFiles: DiffFile[], ruleset: Ruleset): RuleCheck[]; /** * 从规则检查结果数组计算退出码 * * @param results 规则检查结果数组 * @returns 退出码(0=全通过,1=有警告,2=有违规) */ export declare function computeExitCode(results: RuleCheck[]): number; /** * 格式化规则集列表为可读字符串(供 --list-rulesets 输出) * * @param infos 规则集信息数组 * @returns 可读的规则集列表字符串 */ export declare function formatRulesetList(infos: RulesetInfo[]): string; //# sourceMappingURL=ruleset-loader.d.ts.map