autosnippet
Version:
Extract code patterns into a knowledge base for AI coding assistants
93 lines (92 loc) • 3.05 kB
TypeScript
/**
* RecipeRelevanceAuditor — 基于代码证据验证 Recipe 当前相关性
*
* Rescan 时主动触发,检查每个保留 Recipe 的代码证据是否仍然存在:
* 1. 触发模式匹配 (trigger 引用的文件类型/路径模式是否有匹配)
* 2. 代码符号存活 (content.pattern 引用的类名/函数名是否在 AST 中)
* 3. 依赖关系完整 (涉及模块依赖是否在依赖图中)
* 4. 源代码文件存活 (reasoning.sources + content.codeChanges 的文件是否存在)
*
* 评分后驱动快速衰退:
* - healthy (80-100): 无操作
* - watch (60-79): 报告警告
* - decay (40-59): active → decaying (7d grace)
* - severe (20-39): active → decaying (3d grace)
* - dead (0-19): active → deprecated (immediate)
*
* 支持 Category 权重豁免:架构/规范类 Recipe 侧重触发模式而非具体符号。
*
* @module service/evolution/RecipeRelevanceAuditor
*/
import type { ProposalRepository } from '../../repository/evolution/ProposalRepository.js';
import type KnowledgeRepositoryImpl from '../../repository/knowledge/KnowledgeRepository.impl.js';
/** Logger 接口 */
interface AuditorLogger {
info(msg: string, meta?: Record<string, unknown>): void;
warn(msg: string, meta?: Record<string, unknown>): void;
}
/** 知识条目快照 (来自 CleanupService.snapshotRecipes) */
export interface RecipeSnapshotEntry {
id: string;
title: string;
trigger: string;
category: string;
dimensionId?: string;
sourceFile?: string;
lifecycle: string;
}
/** Phase 1-4 分析数据 */
export interface AnalysisData {
/** 项目所有文件的相对路径 */
fileList: string[];
/** AST 解析的代码实体 (类名/函数名/协议名等) */
codeEntities: Array<{
name: string;
kind?: string;
file?: string;
}>;
/** 依赖关系图 */
dependencyGraph: Array<{
from: string;
to: string;
}>;
}
/** 单个 Recipe 的审计结果 */
export interface RelevanceAuditResult {
recipeId: string;
title: string;
relevanceScore: number;
verdict: 'healthy' | 'watch' | 'decay' | 'severe' | 'dead';
evidence: {
triggerStillMatches: boolean;
symbolsAlive: number;
depsIntact: boolean;
codeFilesExist: number;
};
decayReasons: string[];
}
/** 审计汇总 */
export interface RelevanceAuditSummary {
totalAudited: number;
healthy: number;
watch: number;
decay: number;
severe: number;
dead: number;
results: RelevanceAuditResult[];
proposalsCreated: number;
immediateDeprecated: number;
}
export declare class RecipeRelevanceAuditor {
#private;
constructor(opts: {
knowledgeRepo: KnowledgeRepositoryImpl;
proposalRepo?: ProposalRepository;
logger?: AuditorLogger;
});
/**
* 审计所有保留 Recipe 的代码证据
*/
audit(recipes: RecipeSnapshotEntry[], analysisData: AnalysisData): Promise<RelevanceAuditSummary>;
}
export {};