code-insight-analyst
Version:
1,108 lines (1,092 loc) • 23.5 kB
text/typescript
export { run } from './cli/index.cjs';
/**
* 核心分析引擎
*/
/**
* 分析选项接口
*/
interface AnalysisOptions {
/**
* 要分析的项目目录路径
*/
directory: string;
/**
* 是否启用详细日志
*/
verbose?: boolean;
/**
* 输出报告路径
*/
outputPath?: string;
/**
* 分析类型列表
*/
analysisTypes: string[];
}
/**
* 分析引擎类
*/
declare class AnalysisEngine {
private options;
constructor(options: AnalysisOptions);
/**
* 执行分析
*/
analyze(): Promise<Record<string, unknown>>;
}
/**
* 任务类型
*/
type Task<TInput = unknown> = {
/**
* 任务ID
*/
id: string;
/**
* 任务处理函数的路径
* 相对于项目根目录的路径
*/
handlerPath: string;
/**
* 任务输入数据
*/
input: TInput;
/**
* 优先级
* 数值越低优先级越高
*/
priority?: number;
};
/**
* 任务结果
*/
type TaskResult<T = unknown> = {
/**
* 任务ID
*/
taskId: string;
/**
* 任务结果
*/
result: T;
/**
* 是否成功
*/
success: boolean;
/**
* 错误信息
*/
error?: string;
/**
* 执行时间(毫秒)
*/
executionTime: number;
};
/**
* 并行处理器类
* 使用worker_threads实现多进程任务处理
*/
declare class ParallelProcessor {
private maxWorkers;
private workerScript;
/**
* 工作线程池
*/
private workers;
/**
* 任务队列
*/
private taskQueue;
/**
* 任务结果
*/
private results;
/**
* 事件发射器
*/
private emitter;
/**
* 正在处理中的任务数
*/
private processingTasks;
/**
* 是否正在运行
*/
private isRunning;
/**
* 构造函数
*
* @param maxWorkers - 最大工作线程数
* @param workerScript - 工作线程脚本路径
*/
constructor(maxWorkers?: number, workerScript?: string);
/**
* 初始化工作线程池
*/
private initializeWorkers;
/**
* 添加任务
*
* @param task - 任务
* @returns 任务ID
*/
addTask<TInput>(task: Task<TInput>): string;
/**
* 添加多个任务
*
* @param tasks - 任务列表
* @returns 任务ID列表
*/
addTasks<TInput>(tasks: Task<TInput>[]): string[];
/**
* 处理下一个任务
*
* @param worker - 工作线程
*/
private processNextTask;
/**
* 启动处理器
*/
start(): void;
/**
* 停止处理器
*/
stop(): Promise<void>;
/**
* 等待任务完成
*
* @param taskId - 任务ID
* @returns 任务结果
*/
waitForTask<T>(taskId: string): Promise<TaskResult<T>>;
/**
* 等待所有任务完成
*
* @returns 所有任务的结果
*/
waitForAll<T>(): Promise<TaskResult<T>[]>;
/**
* 执行任务集合
*
* @param tasks - 任务列表
* @returns 任务结果列表
*/
execute<TInput, TResult>(tasks: Task<TInput>[]): Promise<TaskResult<TResult>[]>;
/**
* 获取待处理任务数量
*
* @returns 待处理任务数量
*/
getPendingTaskCount(): number;
/**
* 获取处理中任务数量
*
* @returns 处理中任务数量
*/
getProcessingTaskCount(): number;
}
/**
* 单个文件的分析位置信息
*/
interface ILocation {
/**
* 文件路径
*/
filePath: string;
/**
* 开始行号
*/
startLine?: number;
/**
* 结束行号
*/
endLine?: number;
/**
* 开始列号
*/
startColumn?: number;
/**
* 结束列号
*/
endColumn?: number;
}
/**
* 代码覆盖率分析结果
*/
interface ICoverageResult {
/**
* 文件路径
*/
filePath: string;
/**
* 行覆盖率
*/
lineCoverage: number;
/**
* 语句覆盖率
*/
statementCoverage: number;
/**
* 分支覆盖率
*/
branchCoverage: number;
/**
* 函数覆盖率
*/
functionCoverage: number;
/**
* 未覆盖的行
*/
uncoveredLines: number[];
}
/**
* 重复代码分析结果
*/
interface IDuplicateResult {
/**
* 重复代码块
*/
duplicates: Array<{
/**
* 重复代码的位置信息
*/
locations: ILocation[];
/**
* 重复代码的行数
*/
lines: number;
/**
* 重复代码的相似度
*/
similarity: number;
/**
* 重复代码的片段
*/
snippet?: string;
}>;
/**
* 总重复率
*/
totalDuplicationRate: number;
}
/**
* 未使用代码分析结果
*/
interface IUnusedCodeResult {
/**
* 未使用的导入
*/
unusedImports: ILocation[];
/**
* 未使用的变量
*/
unusedVariables: ILocation[];
/**
* 未使用的函数
*/
unusedFunctions: ILocation[];
/**
* 未使用的类
*/
unusedClasses: ILocation[];
/**
* 未使用的导出
*/
unusedExports: ILocation[];
}
/**
* 依赖关系分析结果
*/
interface IDependencyResult {
/**
* 依赖图(邻接表表示)
*/
dependencyGraph: Record<string, string[]>;
/**
* 循环依赖
*/
circularDependencies: Array<string[]>;
/**
* 未使用的依赖
*/
unusedDependencies: string[];
/**
* 缺失的依赖
*/
missingDependencies: string[];
}
/**
* 内存泄漏分析结果
*/
interface IMemoryLeakResult {
/**
* 可能导致内存泄漏的代码
*/
potentialLeaks: Array<{
/**
* 位置信息
*/
location: ILocation;
/**
* 泄漏风险级别
*/
riskLevel: 'low' | 'medium' | 'high';
/**
* 泄漏类型
*/
type: string;
/**
* 描述
*/
description: string;
}>;
}
/**
* 死循环检测结果
*/
interface IInfiniteLoopResult {
/**
* 可能的无限循环
*/
potentialInfiniteLoops: Array<{
/**
* 位置信息
*/
location: ILocation;
/**
* 风险级别
*/
riskLevel: 'low' | 'medium' | 'high';
/**
* 原因
*/
reason: string;
/**
* 修复建议
*/
suggestion?: string;
}>;
}
/**
* 增量分析相关信息
*/
interface IIncrementalInfo {
/**
* 基准提交 SHA
*/
baseCommit?: string;
/**
* 当前提交 SHA
*/
currentCommit?: string;
/**
* 改动文件列表
*/
changedFiles: string[];
/**
* 与基准对比的变化趋势
*/
trends?: {
/**
* 代码覆盖率变化
*/
coverageTrend?: number;
/**
* 重复代码变化
*/
duplicationTrend?: number;
/**
* 未使用代码变化
*/
unusedCodeTrend?: number;
/**
* 循环依赖变化
*/
circularDependenciesTrend?: number;
};
}
/**
* 自定义规则分析结果
*/
interface ICustomRuleResult {
/**
* 规则名称
*/
ruleName: string;
/**
* 规则描述
*/
description: string;
/**
* 触发的问题
*/
issues: Array<{
/**
* 位置信息
*/
location: ILocation;
/**
* 严重性
*/
severity: 'info' | 'warning' | 'error';
/**
* 消息
*/
message: string;
/**
* 修复建议
*/
suggestion?: string;
}>;
}
/**
* 分析结果的统计信息
*/
interface IAnalysisStats {
/**
* 总文件数量
*/
totalFiles: number;
/**
* 总代码行数
*/
totalLines: number;
/**
* 分析开始时间
*/
startTime: Date;
/**
* 分析结束时间
*/
endTime: Date;
/**
* 分析耗时(毫秒)
*/
duration: number;
}
/**
* 完整分析结果
*/
interface IAnalysisResult {
/**
* 项目名称
*/
projectName: string;
/**
* 分析统计信息
*/
stats: IAnalysisStats;
/**
* 代码覆盖率结果
*/
coverage?: ICoverageResult[];
/**
* 重复代码结果
*/
duplicates?: IDuplicateResult;
/**
* 未使用代码结果
*/
unusedCode?: IUnusedCodeResult;
/**
* 依赖关系结果
*/
dependencies?: IDependencyResult;
/**
* 内存泄漏结果
*/
memoryLeaks?: IMemoryLeakResult;
/**
* 死循环检测结果
*/
infiniteLoops?: IInfiniteLoopResult;
/**
* 自定义规则结果
*/
customRules?: ICustomRuleResult[];
/**
* 增量分析信息
*/
incrementalInfo?: IIncrementalInfo;
}
/**
* 报告生成器选项接口
*/
interface IReportOptions {
/**
* 输出路径
*/
outputPath?: string;
/**
* 报告标题
*/
title?: string;
/**
* 是否包含详细信息
*/
detailed?: boolean;
/**
* 是否包含图表
*/
includeCharts?: boolean;
/**
* 项目名称
*/
projectName?: string;
/**
* 生成时间
*/
timestamp?: Date;
/**
* 自定义模板路径
*/
templatePath?: string;
}
/**
* 图表数据类型
*/
interface IChartData {
/**
* 图表标题
*/
title: string;
/**
* 图表类型
*/
type: 'bar' | 'line' | 'pie' | 'doughnut' | 'radar';
/**
* 图表标签
*/
labels: string[];
/**
* 图表数据集
*/
datasets: Array<{
/**
* 数据集标签
*/
label?: string;
/**
* 数据集数据
*/
data: number[];
/**
* 背景颜色
*/
backgroundColor?: string | string[];
/**
* 边框颜色
*/
borderColor?: string | string[];
}>;
}
/**
* 报告生成器接口
*/
interface IReportGenerator {
/**
* 生成报告
* @param results 分析结果
* @returns 报告文件路径
*/
generate(results: IAnalysisResult): Promise<string | null>;
/**
* 准备图表数据
* @param results 分析结果
* @returns 图表数据
*/
prepareChartData?(results: IAnalysisResult): IChartData[];
}
/**
* 基础报告生成器
*/
declare abstract class BaseReportGenerator implements IReportGenerator {
protected options: IReportOptions;
constructor(options?: IReportOptions);
/**
* 生成报告
* @param results 分析结果
*/
abstract generate(results: IAnalysisResult): Promise<string | null>;
/**
* 确保输出目录存在
*/
protected ensureOutputDir(): Promise<void>;
/**
* 格式化日期时间
* @param date 日期对象
* @returns 格式化的日期时间字符串
*/
protected formatDateTime(date: Date): string;
/**
* 格式化持续时间
* @param ms 毫秒数
* @returns 格式化的持续时间字符串
*/
protected formatDuration(ms: number): string;
/**
* 生成报告文件名
* @param extension 文件扩展名
* @returns 报告文件名
*/
protected getReportFileName(extension: string): string;
/**
* 生成报告完整路径
* @param fileName 文件名
* @returns 报告完整路径
*/
protected getReportPath(fileName: string): string;
/**
* 分析代码覆盖率图表数据
* @param results 分析结果
* @returns 覆盖率图表数据
*/
protected getCoverageChartData(results: IAnalysisResult): IChartData | null;
/**
* 分析重复代码图表数据
* @param results 分析结果
* @returns 重复代码图表数据
*/
protected getDuplicatesChartData(results: IAnalysisResult): IChartData | null;
/**
* 分析未使用代码图表数据
* @param results 分析结果
* @returns 未使用代码图表数据
*/
protected getUnusedCodeChartData(results: IAnalysisResult): IChartData | null;
/**
* 分析依赖图表数据
* @param results 分析结果
* @returns 依赖图表数据
*/
protected getDependencyChartData(results: IAnalysisResult): IChartData | null;
/**
* 分析风险图表数据
* @param results 分析结果
* @returns 风险图表数据
*/
protected getRiskChartData(results: IAnalysisResult): IChartData | null;
/**
* 分析增量变化图表数据
* @param results 分析结果
* @returns 增量变化图表数据
*/
protected getIncrementalChartData(results: IAnalysisResult): IChartData | null;
/**
* 准备所有图表数据
* @param results 分析结果
* @returns 所有图表数据
*/
prepareChartData(results: IAnalysisResult): IChartData[];
}
/**
* HTML报告生成器
*/
declare class HTMLReportGenerator extends BaseReportGenerator {
private defaultTemplatePath;
constructor(options?: IReportOptions);
/**
* 生成HTML报告
* @param results 分析结果
* @returns 报告文件路径
*/
generate(results: IAnalysisResult): Promise<string | null>;
}
/**
* JSON报告生成器
*/
declare class JSONReportGenerator extends BaseReportGenerator {
constructor(options?: IReportOptions);
/**
* 生成JSON报告
* @param results 分析结果
* @returns 报告文件路径
*/
generate(results: IAnalysisResult): Promise<string | null>;
}
/**
* 控制台报告生成器
*/
declare class ConsoleReportGenerator extends BaseReportGenerator {
constructor(options?: IReportOptions);
/**
* 生成控制台报告
* @param results 分析结果
* @returns null (控制台输出不生成文件)
*/
generate(results: IAnalysisResult): Promise<string | null>;
/**
* 打印报告头部
* @param results 分析结果
*/
private printHeader;
/**
* 打印总体摘要
* @param results 分析结果
*/
private printSummary;
/**
* 打印覆盖率摘要
* @param results 分析结果
*/
private printCoverageSummary;
/**
* 打印重复代码摘要
* @param duplicates 重复代码结果
*/
private printDuplicatesSummary;
/**
* 打印未使用代码摘要
* @param unusedCode 未使用代码结果
*/
private printUnusedCodeSummary;
/**
* 打印依赖关系摘要
* @param dependencies 依赖关系结果
*/
private printDependenciesSummary;
/**
* 打印风险摘要(内存泄漏或死循环)
* @param title 标题
* @param items 风险项列表
*/
private printRiskSummary;
/**
* 打印增量分析信息
* @param incrementalInfo 增量分析信息
*/
private printIncrementalInfo;
/**
* 打印报告底部
*/
private printFooter;
}
type ReportFormat = 'html' | 'json' | 'console';
/**
* 报告生成器工厂
* 根据指定格式创建相应的报告生成器
*/
declare class ReportGeneratorFactory {
/**
* 创建报告生成器实例
* @param format 报告格式
* @param options 报告选项
* @returns 报告生成器实例
*/
static create(format: ReportFormat, options?: IReportOptions): HTMLReportGenerator | JSONReportGenerator | ConsoleReportGenerator;
/**
* 生成多种格式的报告
* @param results 分析结果
* @param formats 需要生成的报告格式
* @param options 报告选项
* @returns 生成的报告文件路径
*/
static generateReports(results: IAnalysisResult, formats?: ReportFormat[], options?: IReportOptions): Promise<string[]>;
}
/**
* 图表可视化器类
* 用于生成Chart.js配置和选项
*/
declare class ChartVisualizer {
/**
* 生成Chart.js配置
* @param chartData 图表数据
* @returns Chart.js配置对象
*/
static generateChartConfig(chartData: IChartData): any;
/**
* 生成HTML内容初始化图表
* @param chartData 图表数据列表
* @returns 包含初始化脚本的HTML字符串
*/
static generateChartInitScript(chartData: IChartData[]): string;
/**
* 生成图表HTML容器
* @param index 图表索引
* @param chartData 图表数据
* @returns 图表容器HTML
*/
static generateChartContainer(index: number, chartData: IChartData): string;
/**
* 将所有图表包装在一个容器中
* @param chartData 图表数据列表
* @returns 包含所有图表的HTML
*/
static wrapChartsInContainer(chartData: IChartData[]): string;
/**
* 将图表排列成行
* @param chartData 图表数据列表
* @param chartsPerRow 每行图表数量
* @returns 排列后的HTML
*/
private static arrangeChartsInRows;
}
/**
* 增量分析器配置接口
*/
interface IIncrementalAnalyzerOptions {
/**
* 项目根目录
*/
projectRoot: string;
/**
* 基准提交SHA或分支名(默认为最近一次提交)
*/
baseCommit?: string;
/**
* 当前提交SHA或分支名(默认为工作区)
*/
currentCommit?: string;
/**
* 缓存目录(存储历史分析结果)
*/
cacheDir?: string;
/**
* 要分析的文件扩展名
*/
fileExtensions?: string[];
}
/**
* 增量分析器
* 提供Git版本间差异分析和结果对比功能
*/
declare class IncrementalAnalyzer {
private options;
private cacheDir;
constructor(options: IIncrementalAnalyzerOptions);
/**
* 获取增量分析信息
* @returns 增量分析信息
*/
getIncrementalInfo(): Promise<IIncrementalInfo>;
/**
* 保存分析结果到缓存
* @param commit 提交SHA
* @param results 分析结果
*/
saveResultsToCache(commit: string, results: any): Promise<void>;
/**
* 从缓存加载分析结果
* @param commit 提交SHA
* @returns 分析结果,如果不存在则返回null
*/
loadResultsFromCache(commit: string): Promise<any | null>;
/**
* 比较两次分析结果,计算变化趋势
* @param baseResults 基准分析结果
* @param currentResults 当前分析结果
* @returns 包含趋势信息的增量分析结果
*/
calculateTrends(baseResults: any, currentResults: any): IIncrementalInfo;
/**
* 生成文件内容的哈希
* @param filePath 文件路径
* @returns 文件哈希值
*/
generateFileHash(filePath: string): Promise<string>;
/**
* 确定是否需要重新分析文件
* @param filePath 文件路径
* @returns 是否需要重新分析
*/
shouldReanalyzeFile(filePath: string): Promise<boolean>;
/**
* 检查是否在Git仓库中
* @returns 是否在Git仓库中
*/
private isGitRepository;
/**
* 获取最近一次提交的哈希值
* @returns 提交哈希值
*/
private getLastCommitHash;
/**
* 获取当前提交的哈希值
* @returns 提交哈希值
*/
private getCurrentCommitHash;
/**
* 获取两次提交之间变更的文件列表
* @param baseCommit 基准提交
* @param currentCommit 当前提交
* @returns 变更文件列表
*/
private getChangedFiles;
/**
* 计算平均代码覆盖率
* @param coverageResults 覆盖率结果
* @returns 平均覆盖率(0-1之间)
*/
private calculateAverageCoverage;
/**
* 计算未使用代码项目总数
* @param unusedResults 未使用代码结果
* @returns 未使用项目总数
*/
private countUnusedItems;
}
/**
* 自定义规则配置接口
*/
interface IRule {
/**
* 规则名称
*/
name: string;
/**
* 规则描述
*/
description: string;
/**
* 规则启用状态
*/
enabled: boolean;
/**
* 规则配置
*/
config: Record<string, any>;
/**
* 规则执行函数
*/
execute: (context: IRuleContext) => Promise<IRuleIssue[]>;
}
/**
* 规则执行环境接口
*/
interface IRuleContext {
/**
* 项目根路径
*/
projectRoot: string;
/**
* 当前文件路径
*/
filePath?: string;
/**
* 当前文件内容
*/
fileContent?: string;
/**
* AST服务
*/
astService?: any;
/**
* 文件系统服务
*/
fsService?: any;
}
/**
* 规则检测到的问题
*/
interface IRuleIssue {
/**
* 文件路径
*/
filePath: string;
/**
* 开始行号
*/
startLine?: number;
/**
* 结束行号
*/
endLine?: number;
/**
* 开始列号
*/
startColumn?: number;
/**
* 结束列号
*/
endColumn?: number;
/**
* 严重性
*/
severity: 'info' | 'warning' | 'error';
/**
* 消息
*/
message: string;
/**
* 修复建议
*/
suggestion?: string;
}
/**
* 规则引擎配置接口
*/
interface IRuleEngineOptions {
/**
* 项目根路径
*/
projectRoot: string;
/**
* 规则目录路径
*/
rulesDir?: string;
/**
* 规则配置文件路径
*/
configPath?: string;
/**
* AST服务
*/
astService?: any;
/**
* 文件系统服务
*/
fsService?: any;
}
/**
* 自定义规则引擎
*/
declare class RuleEngine {
private rules;
private options;
constructor(options: IRuleEngineOptions);
/**
* 初始化规则引擎
*/
initialize(): Promise<void>;
/**
* 加载内置规则
*/
private loadBuiltinRules;
/**
* 加载自定义规则
*/
private loadCustomRules;
/**
* 应用配置文件中的规则设置
*/
private applyConfiguration;
/**
* 执行所有已启用的规则
* @param files 要分析的文件路径列表
* @returns 自定义规则分析结果
*/
executeRules(files: string[]): Promise<ICustomRuleResult[]>;
/**
* 添加自定义规则
* @param rule 自定义规则
*/
addRule(rule: IRule): void;
/**
* 获取规则
* @param name 规则名称
* @returns 规则对象
*/
getRule(name: string): IRule | undefined;
/**
* 获取所有规则
* @returns 所有规则对象的数组
*/
getAllRules(): IRule[];
}
/**
* Code Insight Analyst - 代码分析工具
* 主模块导出
*/
declare const version = "0.1.0";
declare function main(): Promise<void>;
export { AnalysisEngine, type AnalysisOptions, BaseReportGenerator, ChartVisualizer, type IIncrementalAnalyzerOptions, type IRule, type IRuleContext, type IRuleEngineOptions, type IRuleIssue, IncrementalAnalyzer, ParallelProcessor, type ReportFormat, ReportGeneratorFactory, RuleEngine, type Task, type TaskResult, main as default, version };