autosnippet
Version:
Extract code patterns into a knowledge base for AI coding assistants
224 lines (223 loc) • 6.53 kB
TypeScript
/**
* RecipeProductionGateway — 统一 Recipe 生产入口
*
* 所有 Recipe 创建(Agent Tool / MCP / IDE Agent / Batch Import)
* 通过此 Gateway 的统一管道,保证前置校验一致:
*
* 1. Schema Validation (UnifiedValidator)
* 2. Similarity Check — 去重检测(可选跳过)
* 3. Consolidation Scan — 融合/重组建议(可选)
* 4. KnowledgeService.create() — 包含 ConfidenceRouter → staging / pending
* 5. Quality Scoring — 质量评分
* 6. Supersede Proposal — 创建替代提案
* 7. Audit — 统一审计
*/
/** Lightweight log interface — avoids importing static-only Logger class. */
interface GatewayLogger {
info(msg: string): void;
warn(msg: string): void;
}
export type GatewaySource = 'agent-tool' | 'mcp-external' | 'ide-agent' | 'batch-import';
export interface CreateRecipeItem {
title?: string;
description?: string;
content?: {
markdown?: string;
pattern?: string;
rationale?: string;
[key: string]: unknown;
};
trigger?: string;
kind?: string;
topicHint?: string;
whenClause?: string;
doClause?: string;
dontClause?: string;
coreCode?: string;
sourceRefs?: string[];
tags?: string[];
reasoning?: {
whyStandard?: string;
sources?: string[];
confidence?: number;
};
headers?: string[];
usageGuide?: string;
scope?: string;
complexity?: string;
sourceFile?: string;
knowledgeType?: string;
language?: string;
category?: string;
source?: string;
[key: string]: unknown;
}
export interface CreateRecipeRequest {
source: GatewaySource;
items: CreateRecipeItem[];
options?: {
/** 跳过相似度检测(仅 batch-import 可用) */
skipSimilarityCheck?: boolean;
/** 跳过 ConsolidationAdvisor 分析 */
skipConsolidation?: boolean;
/** 被替代的旧 Recipe ID */
supersedes?: string;
/** 相似度阈值,默认 0.7 */
similarityThreshold?: number;
/** 已提交标题集(批量去重用) */
existingTitles?: Set<string>;
/** 已提交指纹集(批量去重用) */
existingFingerprints?: Set<string>;
/** UnifiedValidator 跳过系统注入字段列表 */
systemInjectedFields?: string[];
/** 跳过唯一性校验 */
skipUniqueness?: boolean;
/** 操作用户 ID */
userId?: string;
};
}
export interface CreatedRecipeInfo {
id: string;
title: string;
lifecycle: string;
/** Raw saved entry from KnowledgeService.create() */
raw: Record<string, unknown>;
}
export interface RejectedRecipeInfo {
index: number;
title: string;
reason: string;
errors: string[];
warnings: string[];
}
export interface MergedRecipeInfo {
index: number;
proposalId: string;
type: string;
targetRecipeId: string;
targetTitle: string;
status: string;
expiresAt: number;
message: string;
}
export interface BlockedRecipeInfo {
index: number;
title: string;
consolidation: unknown;
}
export interface SimilarRecipeInfo {
index: number;
title: string;
similarTo: {
file: string;
title: string;
similarity: number;
}[];
}
export interface CreateRecipeResult {
created: CreatedRecipeInfo[];
rejected: RejectedRecipeInfo[];
merged: MergedRecipeInfo[];
blocked: BlockedRecipeInfo[];
duplicates: SimilarRecipeInfo[];
supersedeProposal: {
proposalId: string;
} | null;
}
interface GatewayKnowledgeService {
create(data: Record<string, unknown>, context: {
userId: string;
}): Promise<{
id: string;
title: string;
lifecycle: string;
kind?: string;
[key: string]: unknown;
}>;
updateQuality(id: string, context: {
userId: string;
}): Promise<unknown>;
}
interface GatewayConsolidationAdvisor {
analyzeBatch(candidates: Array<{
title: string;
category?: string;
[key: string]: unknown;
}>): {
items: Array<{
index: number;
advice: {
action: string;
confidence: number;
reason: string;
targetRecipe?: {
id: string;
title: string;
similarity: number;
};
reorganizeTargets?: {
id: string;
title: string;
similarity: number;
}[];
coveredBy?: {
id: string;
title: string;
similarity: number;
}[];
mergeDirection?: {
addedDimensions: string[];
summary: string;
};
};
}>;
};
}
interface GatewayProposalRepository {
create(data: Record<string, unknown>): {
id: string;
status: string;
expiresAt: number;
[key: string]: unknown;
} | null;
}
type GatewaySimilarityFn = (projectRoot: string, candidate: {
title: string;
summary: string;
code: string;
}, opts: {
threshold: number;
topK: number;
}) => {
file: string;
title: string;
similarity: number;
}[];
export interface GatewayDeps {
knowledgeService: GatewayKnowledgeService;
projectRoot: string;
logger?: GatewayLogger;
/** ConsolidationAdvisor(可选 — MCP 路径使用) */
consolidationAdvisor?: GatewayConsolidationAdvisor | null;
/** ProposalRepository(可选 — supersede 提案需要) */
proposalRepository?: GatewayProposalRepository | null;
/** 相似度检测函数(可选 — 默认导入 SimilarityService) */
findSimilarRecipes?: GatewaySimilarityFn | null;
}
export declare class RecipeProductionGateway {
#private;
constructor(deps: GatewayDeps);
/**
* 统一创建入口
*
* Pipeline:
* 1. Schema Validation (UnifiedValidator)
* 2. Similarity Check (除非 skipSimilarityCheck)
* 3. Consolidation Scan (除非 skipConsolidation)
* 4. KnowledgeService.create() — ConfidenceRouter → staging / pending
* 5. Quality Scoring
* 6. Supersede Proposal 创建 (if supersedes)
*/
create(request: CreateRecipeRequest): Promise<CreateRecipeResult>;
}
export {};