@houtini/lm 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +273 -0
- package/LICENSE +21 -0
- package/README.md +203 -0
- package/dist/cache/analysis-cache.d.ts +33 -0
- package/dist/cache/analysis-cache.d.ts.map +1 -0
- package/dist/cache/analysis-cache.js +56 -0
- package/dist/cache/analysis-cache.js.map +1 -0
- package/dist/cache/cache-manager.d.ts +29 -0
- package/dist/cache/cache-manager.d.ts.map +1 -0
- package/dist/cache/cache-manager.js +85 -0
- package/dist/cache/cache-manager.js.map +1 -0
- package/dist/cache/index.d.ts +16 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +17 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/prompt-cache.d.ts +33 -0
- package/dist/cache/prompt-cache.d.ts.map +1 -0
- package/dist/cache/prompt-cache.js +61 -0
- package/dist/cache/prompt-cache.js.map +1 -0
- package/dist/config.d.ts +43 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +70 -0
- package/dist/config.js.map +1 -0
- package/dist/core/ThreeStagePromptManager.d.ts +39 -0
- package/dist/core/ThreeStagePromptManager.d.ts.map +1 -0
- package/dist/core/ThreeStagePromptManager.js +176 -0
- package/dist/core/ThreeStagePromptManager.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +230 -0
- package/dist/index.js.map +1 -0
- package/dist/plugins/base-plugin.d.ts +47 -0
- package/dist/plugins/base-plugin.d.ts.map +1 -0
- package/dist/plugins/base-plugin.js +90 -0
- package/dist/plugins/base-plugin.js.map +1 -0
- package/dist/plugins/index.d.ts +58 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +161 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/types.d.ts +5 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +5 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/prompts/analyze/code-quality.d.ts +116 -0
- package/dist/prompts/analyze/code-quality.d.ts.map +1 -0
- package/dist/prompts/analyze/code-quality.js +433 -0
- package/dist/prompts/analyze/code-quality.js.map +1 -0
- package/dist/prompts/analyze/compare-integration.d.ts +130 -0
- package/dist/prompts/analyze/compare-integration.d.ts.map +1 -0
- package/dist/prompts/analyze/compare-integration.js +543 -0
- package/dist/prompts/analyze/compare-integration.js.map +1 -0
- package/dist/prompts/analyze/count-files.d.ts +109 -0
- package/dist/prompts/analyze/count-files.d.ts.map +1 -0
- package/dist/prompts/analyze/count-files.js +399 -0
- package/dist/prompts/analyze/count-files.js.map +1 -0
- package/dist/prompts/analyze/database-queries.d.ts +156 -0
- package/dist/prompts/analyze/database-queries.d.ts.map +1 -0
- package/dist/prompts/analyze/database-queries.js +759 -0
- package/dist/prompts/analyze/database-queries.js.map +1 -0
- package/dist/prompts/analyze/dependencies.d.ts +97 -0
- package/dist/prompts/analyze/dependencies.d.ts.map +1 -0
- package/dist/prompts/analyze/dependencies.js +333 -0
- package/dist/prompts/analyze/dependencies.js.map +1 -0
- package/dist/prompts/analyze/diff-signatures.d.ts +139 -0
- package/dist/prompts/analyze/diff-signatures.d.ts.map +1 -0
- package/dist/prompts/analyze/diff-signatures.js +702 -0
- package/dist/prompts/analyze/diff-signatures.js.map +1 -0
- package/dist/prompts/analyze/find-patterns.d.ts +128 -0
- package/dist/prompts/analyze/find-patterns.d.ts.map +1 -0
- package/dist/prompts/analyze/find-patterns.js +520 -0
- package/dist/prompts/analyze/find-patterns.js.map +1 -0
- package/dist/prompts/analyze/find-unused-css.d.ts +151 -0
- package/dist/prompts/analyze/find-unused-css.d.ts.map +1 -0
- package/dist/prompts/analyze/find-unused-css.js +754 -0
- package/dist/prompts/analyze/find-unused-css.js.map +1 -0
- package/dist/prompts/analyze/n8n-workflow.d.ts +137 -0
- package/dist/prompts/analyze/n8n-workflow.d.ts.map +1 -0
- package/dist/prompts/analyze/n8n-workflow.js +529 -0
- package/dist/prompts/analyze/n8n-workflow.js.map +1 -0
- package/dist/prompts/analyze/project-structure.d.ts +126 -0
- package/dist/prompts/analyze/project-structure.d.ts.map +1 -0
- package/dist/prompts/analyze/project-structure.js +569 -0
- package/dist/prompts/analyze/project-structure.js.map +1 -0
- package/dist/prompts/analyze/security-audit.d.ts +142 -0
- package/dist/prompts/analyze/security-audit.d.ts.map +1 -0
- package/dist/prompts/analyze/security-audit.js +637 -0
- package/dist/prompts/analyze/security-audit.js.map +1 -0
- package/dist/prompts/analyze/single-file.d.ts +162 -0
- package/dist/prompts/analyze/single-file.d.ts.map +1 -0
- package/dist/prompts/analyze/single-file.js +665 -0
- package/dist/prompts/analyze/single-file.js.map +1 -0
- package/dist/prompts/analyze/trace-execution.d.ts +126 -0
- package/dist/prompts/analyze/trace-execution.d.ts.map +1 -0
- package/dist/prompts/analyze/trace-execution.js +609 -0
- package/dist/prompts/analyze/trace-execution.js.map +1 -0
- package/dist/prompts/analyze/wordpress-plugin-audit.d.ts +116 -0
- package/dist/prompts/analyze/wordpress-plugin-audit.d.ts.map +1 -0
- package/dist/prompts/analyze/wordpress-plugin-audit.js +454 -0
- package/dist/prompts/analyze/wordpress-plugin-audit.js.map +1 -0
- package/dist/prompts/analyze/wordpress-security.d.ts +146 -0
- package/dist/prompts/analyze/wordpress-security.d.ts.map +1 -0
- package/dist/prompts/analyze/wordpress-security.js +698 -0
- package/dist/prompts/analyze/wordpress-security.js.map +1 -0
- package/dist/prompts/analyze/wordpress-theme-audit.d.ts +114 -0
- package/dist/prompts/analyze/wordpress-theme-audit.d.ts.map +1 -0
- package/dist/prompts/analyze/wordpress-theme-audit.js +538 -0
- package/dist/prompts/analyze/wordpress-theme-audit.js.map +1 -0
- package/dist/prompts/custom/custom-prompt.d.ts +135 -0
- package/dist/prompts/custom/custom-prompt.d.ts.map +1 -0
- package/dist/prompts/custom/custom-prompt.js +419 -0
- package/dist/prompts/custom/custom-prompt.js.map +1 -0
- package/dist/prompts/fun/arcade-game.d.ts +152 -0
- package/dist/prompts/fun/arcade-game.d.ts.map +1 -0
- package/dist/prompts/fun/arcade-game.js +653 -0
- package/dist/prompts/fun/arcade-game.js.map +1 -0
- package/dist/prompts/fun/create_text_adventure.d.ts +100 -0
- package/dist/prompts/fun/create_text_adventure.d.ts.map +1 -0
- package/dist/prompts/fun/create_text_adventure.js +397 -0
- package/dist/prompts/fun/create_text_adventure.js.map +1 -0
- package/dist/prompts/fun/css-art-generator.d.ts +168 -0
- package/dist/prompts/fun/css-art-generator.d.ts.map +1 -0
- package/dist/prompts/fun/css-art-generator.js +827 -0
- package/dist/prompts/fun/css-art-generator.js.map +1 -0
- package/dist/prompts/generate/project-documentation.d.ts +137 -0
- package/dist/prompts/generate/project-documentation.d.ts.map +1 -0
- package/dist/prompts/generate/project-documentation.js +666 -0
- package/dist/prompts/generate/project-documentation.js.map +1 -0
- package/dist/prompts/generate/refactoring.d.ts +164 -0
- package/dist/prompts/generate/refactoring.d.ts.map +1 -0
- package/dist/prompts/generate/refactoring.js +621 -0
- package/dist/prompts/generate/refactoring.js.map +1 -0
- package/dist/prompts/generate/responsive-component.d.ts +147 -0
- package/dist/prompts/generate/responsive-component.d.ts.map +1 -0
- package/dist/prompts/generate/responsive-component.js +955 -0
- package/dist/prompts/generate/responsive-component.js.map +1 -0
- package/dist/prompts/generate/typescript-conversion.d.ts +144 -0
- package/dist/prompts/generate/typescript-conversion.d.ts.map +1 -0
- package/dist/prompts/generate/typescript-conversion.js +527 -0
- package/dist/prompts/generate/typescript-conversion.js.map +1 -0
- package/dist/prompts/generate/unit-tests.d.ts +139 -0
- package/dist/prompts/generate/unit-tests.d.ts.map +1 -0
- package/dist/prompts/generate/unit-tests.js +578 -0
- package/dist/prompts/generate/unit-tests.js.map +1 -0
- package/dist/prompts/generate/wordpress-plugin.d.ts +179 -0
- package/dist/prompts/generate/wordpress-plugin.d.ts.map +1 -0
- package/dist/prompts/generate/wordpress-plugin.js +763 -0
- package/dist/prompts/generate/wordpress-plugin.js.map +1 -0
- package/dist/prompts/generate/wordpress-theme-from-static.d.ts +177 -0
- package/dist/prompts/generate/wordpress-theme-from-static.d.ts.map +1 -0
- package/dist/prompts/generate/wordpress-theme-from-static.js +695 -0
- package/dist/prompts/generate/wordpress-theme-from-static.js.map +1 -0
- package/dist/prompts/shared/cache-manager.d.ts +45 -0
- package/dist/prompts/shared/cache-manager.d.ts.map +1 -0
- package/dist/prompts/shared/cache-manager.js +129 -0
- package/dist/prompts/shared/cache-manager.js.map +1 -0
- package/dist/prompts/shared/helpers.d.ts +39 -0
- package/dist/prompts/shared/helpers.d.ts.map +1 -0
- package/dist/prompts/shared/helpers.js +151 -0
- package/dist/prompts/shared/helpers.js.map +1 -0
- package/dist/prompts/shared/templates.d.ts +35 -0
- package/dist/prompts/shared/templates.d.ts.map +1 -0
- package/dist/prompts/shared/templates.js +77 -0
- package/dist/prompts/shared/templates.js.map +1 -0
- package/dist/prompts/shared/types.d.ts +112 -0
- package/dist/prompts/shared/types.d.ts.map +1 -0
- package/dist/prompts/shared/types.js +5 -0
- package/dist/prompts/shared/types.js.map +1 -0
- package/dist/prompts/system/find-unused-files.d.ts +106 -0
- package/dist/prompts/system/find-unused-files.d.ts.map +1 -0
- package/dist/prompts/system/find-unused-files.js +353 -0
- package/dist/prompts/system/find-unused-files.js.map +1 -0
- package/dist/security/index.d.ts +39 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +46 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/integration-helpers.d.ts +121 -0
- package/dist/security/integration-helpers.d.ts.map +1 -0
- package/dist/security/integration-helpers.js +190 -0
- package/dist/security/integration-helpers.js.map +1 -0
- package/dist/security/output-encoder.d.ts +94 -0
- package/dist/security/output-encoder.d.ts.map +1 -0
- package/dist/security/output-encoder.js +295 -0
- package/dist/security/output-encoder.js.map +1 -0
- package/dist/security/prompt-injection-guard.d.ts +59 -0
- package/dist/security/prompt-injection-guard.d.ts.map +1 -0
- package/dist/security/prompt-injection-guard.js +249 -0
- package/dist/security/prompt-injection-guard.js.map +1 -0
- package/dist/security/sanitisation.d.ts +67 -0
- package/dist/security/sanitisation.d.ts.map +1 -0
- package/dist/security/sanitisation.js +398 -0
- package/dist/security/sanitisation.js.map +1 -0
- package/dist/security/security-service.d.ts +103 -0
- package/dist/security/security-service.d.ts.map +1 -0
- package/dist/security/security-service.js +303 -0
- package/dist/security/security-service.js.map +1 -0
- package/dist/security-config.d.ts +45 -0
- package/dist/security-config.d.ts.map +1 -0
- package/dist/security-config.js +63 -0
- package/dist/security-config.js.map +1 -0
- package/dist/system/function-list.d.ts +61 -0
- package/dist/system/function-list.d.ts.map +1 -0
- package/dist/system/function-list.js +111 -0
- package/dist/system/function-list.js.map +1 -0
- package/dist/system/function-registry.d.ts +23 -0
- package/dist/system/function-registry.d.ts.map +1 -0
- package/dist/system/function-registry.js +136 -0
- package/dist/system/function-registry.js.map +1 -0
- package/dist/system/health-check.d.ts +33 -0
- package/dist/system/health-check.d.ts.map +1 -0
- package/dist/system/health-check.js +98 -0
- package/dist/system/health-check.js.map +1 -0
- package/dist/system/path-resolver.d.ts +55 -0
- package/dist/system/path-resolver.d.ts.map +1 -0
- package/dist/system/path-resolver.js +90 -0
- package/dist/system/path-resolver.js.map +1 -0
- package/dist/templates/plugin-template.d.ts +121 -0
- package/dist/templates/plugin-template.d.ts.map +1 -0
- package/dist/templates/plugin-template.js +450 -0
- package/dist/templates/plugin-template.js.map +1 -0
- package/dist/types/chunking-types.d.ts +88 -0
- package/dist/types/chunking-types.d.ts.map +1 -0
- package/dist/types/chunking-types.js +18 -0
- package/dist/types/chunking-types.js.map +1 -0
- package/dist/types/prompt-stages.d.ts +42 -0
- package/dist/types/prompt-stages.d.ts.map +1 -0
- package/dist/types/prompt-stages.js +6 -0
- package/dist/types/prompt-stages.js.map +1 -0
- package/dist/types.d.ts +46 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/css-parser.d.ts +26 -0
- package/dist/utils/css-parser.d.ts.map +1 -0
- package/dist/utils/css-parser.js +117 -0
- package/dist/utils/css-parser.js.map +1 -0
- package/dist/utils/path-resolver.d.ts +13 -0
- package/dist/utils/path-resolver.d.ts.map +1 -0
- package/dist/utils/path-resolver.js +78 -0
- package/dist/utils/path-resolver.js.map +1 -0
- package/dist/utils/plugin-utilities.d.ts +171 -0
- package/dist/utils/plugin-utilities.d.ts.map +1 -0
- package/dist/utils/plugin-utilities.js +221 -0
- package/dist/utils/plugin-utilities.js.map +1 -0
- package/dist/utils/streamHandler.d.ts +3 -0
- package/dist/utils/streamHandler.d.ts.map +1 -0
- package/dist/utils/streamHandler.js +137 -0
- package/dist/utils/streamHandler.js.map +1 -0
- package/dist/validation/output-validator.d.ts +136 -0
- package/dist/validation/output-validator.d.ts.map +1 -0
- package/dist/validation/output-validator.js +262 -0
- package/dist/validation/output-validator.js.map +1 -0
- package/dist/validation/response-factory.d.ts +44 -0
- package/dist/validation/response-factory.d.ts.map +1 -0
- package/dist/validation/response-factory.js +202 -0
- package/dist/validation/response-factory.js.map +1 -0
- package/dist/validation/schemas.d.ts +519 -0
- package/dist/validation/schemas.d.ts.map +1 -0
- package/dist/validation/schemas.js +6 -0
- package/dist/validation/schemas.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin Template - Modern v4.3 (Improved)
|
|
3
|
+
*
|
|
4
|
+
* Universal template that intelligently handles both single-file and multi-file analysis
|
|
5
|
+
* Automatically detects analysis type based on provided parameters
|
|
6
|
+
*
|
|
7
|
+
* Copy this template for creating any new plugin - it adapts to your needs
|
|
8
|
+
*/
|
|
9
|
+
import { BasePlugin } from '../../plugins/base-plugin.js';
|
|
10
|
+
import { IPromptPlugin } from '../shared/types.js';
|
|
11
|
+
import { PromptStages } from '../../types/prompt-stages.js';
|
|
12
|
+
export declare class CodeQualityAnalyzer extends BasePlugin implements IPromptPlugin {
|
|
13
|
+
name: string;
|
|
14
|
+
category: "analyze";
|
|
15
|
+
description: string;
|
|
16
|
+
parameters: {
|
|
17
|
+
code: {
|
|
18
|
+
type: "string";
|
|
19
|
+
description: string;
|
|
20
|
+
required: boolean;
|
|
21
|
+
};
|
|
22
|
+
filePath: {
|
|
23
|
+
type: "string";
|
|
24
|
+
description: string;
|
|
25
|
+
required: boolean;
|
|
26
|
+
};
|
|
27
|
+
projectPath: {
|
|
28
|
+
type: "string";
|
|
29
|
+
description: string;
|
|
30
|
+
required: boolean;
|
|
31
|
+
};
|
|
32
|
+
files: {
|
|
33
|
+
type: "array";
|
|
34
|
+
description: string;
|
|
35
|
+
required: boolean;
|
|
36
|
+
items: {
|
|
37
|
+
type: "string";
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
maxDepth: {
|
|
41
|
+
type: "number";
|
|
42
|
+
description: string;
|
|
43
|
+
required: boolean;
|
|
44
|
+
default: number;
|
|
45
|
+
};
|
|
46
|
+
language: {
|
|
47
|
+
type: "string";
|
|
48
|
+
description: string;
|
|
49
|
+
required: boolean;
|
|
50
|
+
default: string;
|
|
51
|
+
};
|
|
52
|
+
analysisDepth: {
|
|
53
|
+
type: "string";
|
|
54
|
+
description: string;
|
|
55
|
+
enum: string[];
|
|
56
|
+
default: string;
|
|
57
|
+
required: boolean;
|
|
58
|
+
};
|
|
59
|
+
analysisType: {
|
|
60
|
+
type: "string";
|
|
61
|
+
description: string;
|
|
62
|
+
enum: string[];
|
|
63
|
+
default: string;
|
|
64
|
+
required: boolean;
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
private analysisCache;
|
|
68
|
+
private multiFileAnalysis;
|
|
69
|
+
constructor();
|
|
70
|
+
execute(params: any, llmClient: any): Promise<any>;
|
|
71
|
+
/**
|
|
72
|
+
* Auto-detect whether this is single-file or multi-file analysis
|
|
73
|
+
*
|
|
74
|
+
* DETECTION GUIDE:
|
|
75
|
+
* Single-file: code, filePath provided → analyze individual file
|
|
76
|
+
* Multi-file: projectPath, files, maxDepth provided → analyze project/multiple files
|
|
77
|
+
* Default: Choose based on your plugin's primary use case
|
|
78
|
+
*/
|
|
79
|
+
private detectAnalysisMode;
|
|
80
|
+
/**
|
|
81
|
+
* Validate parameters based on detected analysis mode
|
|
82
|
+
*/
|
|
83
|
+
private validateParameters;
|
|
84
|
+
/**
|
|
85
|
+
* Execute single-file analysis
|
|
86
|
+
*/
|
|
87
|
+
private executeSingleFileAnalysis;
|
|
88
|
+
/**
|
|
89
|
+
* Execute multi-file analysis
|
|
90
|
+
*/
|
|
91
|
+
private executeMultiFileAnalysis;
|
|
92
|
+
/**
|
|
93
|
+
* Single-file code quality analysis
|
|
94
|
+
*/
|
|
95
|
+
private getSingleFilePromptStages;
|
|
96
|
+
/**
|
|
97
|
+
* Multi-file project quality analysis
|
|
98
|
+
*/
|
|
99
|
+
private getMultiFilePromptStages;
|
|
100
|
+
/**
|
|
101
|
+
* Backwards compatibility method
|
|
102
|
+
*/
|
|
103
|
+
getPromptStages(params: any): PromptStages;
|
|
104
|
+
private discoverRelevantFiles;
|
|
105
|
+
private performMultiFileAnalysis;
|
|
106
|
+
private analyzeIndividualFile;
|
|
107
|
+
private getFileExtensions;
|
|
108
|
+
private estimateComplexity;
|
|
109
|
+
private estimateQualityScore;
|
|
110
|
+
private calculateAverageComplexity;
|
|
111
|
+
private analyzeQualityDistribution;
|
|
112
|
+
private identifyCommonIssues;
|
|
113
|
+
private generateCacheKey;
|
|
114
|
+
}
|
|
115
|
+
export default CodeQualityAnalyzer;
|
|
116
|
+
//# sourceMappingURL=code-quality.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-quality.d.ts","sourceRoot":"","sources":["../../../src/prompts/analyze/code-quality.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAgB5D,qBAAa,mBAAoB,SAAQ,UAAW,YAAW,aAAa;IAC1E,IAAI,SAA0B;IAC9B,QAAQ,EAAG,SAAS,CAAU;IAC9B,WAAW,SAA8F;IAGzG,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAqDR;IAEF,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,iBAAiB,CAA2B;;IAO9C,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG;IAyBzC;;;;;;;OAOG;IACH,OAAO,CAAC,kBAAkB;IAe1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAa1B;;OAEG;YACW,yBAAyB;IA0CvC;;OAEG;YACW,wBAAwB;IA0CtC;;OAEG;IACH,OAAO,CAAC,yBAAyB;IA0DjC;;OAEG;IACH,OAAO,CAAC,wBAAwB;IA2DhC;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,GAAG,GAAG,YAAY;YAW5B,qBAAqB;YASrB,wBAAwB;YA0CxB,qBAAqB;IAgBnC,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,kBAAkB;IAiB1B,OAAO,CAAC,oBAAoB;IAY5B,OAAO,CAAC,0BAA0B;IAKlC,OAAO,CAAC,0BAA0B;IAalC,OAAO,CAAC,oBAAoB;IAgB5B,OAAO,CAAC,gBAAgB;CAKzB;AAED,eAAe,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin Template - Modern v4.3 (Improved)
|
|
3
|
+
*
|
|
4
|
+
* Universal template that intelligently handles both single-file and multi-file analysis
|
|
5
|
+
* Automatically detects analysis type based on provided parameters
|
|
6
|
+
*
|
|
7
|
+
* Copy this template for creating any new plugin - it adapts to your needs
|
|
8
|
+
*/
|
|
9
|
+
import { BasePlugin } from '../../plugins/base-plugin.js';
|
|
10
|
+
import { ThreeStagePromptManager } from '../../core/ThreeStagePromptManager.js';
|
|
11
|
+
import { withSecurity } from '../../security/integration-helpers.js';
|
|
12
|
+
import { readFileContent } from '../shared/helpers.js';
|
|
13
|
+
import { ModelSetup, ResponseProcessor, ParameterValidator, ErrorHandler, MultiFileAnalysis } from '../../utils/plugin-utilities.js';
|
|
14
|
+
import { getAnalysisCache } from '../../cache/index.js';
|
|
15
|
+
// Common Node.js modules - Use these instead of require()
|
|
16
|
+
import { basename, extname, relative } from 'path';
|
|
17
|
+
export class CodeQualityAnalyzer extends BasePlugin {
|
|
18
|
+
constructor() {
|
|
19
|
+
super();
|
|
20
|
+
this.name = 'analyze_code_quality';
|
|
21
|
+
this.category = 'analyze';
|
|
22
|
+
this.description = 'Analyze code quality including complexity, maintainability, and best practices adherence';
|
|
23
|
+
// Universal parameter set - supports both single and multi-file scenarios
|
|
24
|
+
this.parameters = {
|
|
25
|
+
// Single-file parameters
|
|
26
|
+
code: {
|
|
27
|
+
type: 'string',
|
|
28
|
+
description: 'The code to analyze (for single-file analysis)',
|
|
29
|
+
required: false
|
|
30
|
+
},
|
|
31
|
+
filePath: {
|
|
32
|
+
type: 'string',
|
|
33
|
+
description: 'Path to single file to analyze',
|
|
34
|
+
required: false
|
|
35
|
+
},
|
|
36
|
+
// Multi-file parameters
|
|
37
|
+
projectPath: {
|
|
38
|
+
type: 'string',
|
|
39
|
+
description: 'Path to project root (for multi-file analysis)',
|
|
40
|
+
required: false
|
|
41
|
+
},
|
|
42
|
+
files: {
|
|
43
|
+
type: 'array',
|
|
44
|
+
description: 'Array of specific file paths (for multi-file analysis)',
|
|
45
|
+
required: false,
|
|
46
|
+
items: { type: 'string' }
|
|
47
|
+
},
|
|
48
|
+
maxDepth: {
|
|
49
|
+
type: 'number',
|
|
50
|
+
description: 'Maximum directory depth for multi-file discovery (1-5)',
|
|
51
|
+
required: false,
|
|
52
|
+
default: 3
|
|
53
|
+
},
|
|
54
|
+
// Universal parameters
|
|
55
|
+
language: {
|
|
56
|
+
type: 'string',
|
|
57
|
+
description: 'Programming language',
|
|
58
|
+
required: false,
|
|
59
|
+
default: 'javascript'
|
|
60
|
+
},
|
|
61
|
+
analysisDepth: {
|
|
62
|
+
type: 'string',
|
|
63
|
+
description: 'Level of analysis detail',
|
|
64
|
+
enum: ['basic', 'detailed', 'comprehensive'],
|
|
65
|
+
default: 'detailed',
|
|
66
|
+
required: false
|
|
67
|
+
},
|
|
68
|
+
analysisType: {
|
|
69
|
+
type: 'string',
|
|
70
|
+
description: 'Type of analysis to perform',
|
|
71
|
+
enum: ['complexity', 'maintainability', 'comprehensive'],
|
|
72
|
+
default: 'comprehensive',
|
|
73
|
+
required: false
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
this.analysisCache = getAnalysisCache();
|
|
77
|
+
this.multiFileAnalysis = new MultiFileAnalysis();
|
|
78
|
+
// Cache and analysis utilities are initialized above
|
|
79
|
+
}
|
|
80
|
+
async execute(params, llmClient) {
|
|
81
|
+
return await withSecurity(this, params, llmClient, async (secureParams) => {
|
|
82
|
+
try {
|
|
83
|
+
// 1. Auto-detect analysis mode based on parameters
|
|
84
|
+
const analysisMode = this.detectAnalysisMode(secureParams);
|
|
85
|
+
// 2. Validate parameters based on detected mode
|
|
86
|
+
this.validateParameters(secureParams, analysisMode);
|
|
87
|
+
// 3. Setup model
|
|
88
|
+
const { model, contextLength } = await ModelSetup.getReadyModel(llmClient);
|
|
89
|
+
// 4. Route to appropriate analysis method
|
|
90
|
+
if (analysisMode === 'single-file') {
|
|
91
|
+
return await this.executeSingleFileAnalysis(secureParams, model, contextLength);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
return await this.executeMultiFileAnalysis(secureParams, model, contextLength);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
return ErrorHandler.createExecutionError('analyze_code_quality', error);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Auto-detect whether this is single-file or multi-file analysis
|
|
104
|
+
*
|
|
105
|
+
* DETECTION GUIDE:
|
|
106
|
+
* Single-file: code, filePath provided → analyze individual file
|
|
107
|
+
* Multi-file: projectPath, files, maxDepth provided → analyze project/multiple files
|
|
108
|
+
* Default: Choose based on your plugin's primary use case
|
|
109
|
+
*/
|
|
110
|
+
detectAnalysisMode(params) {
|
|
111
|
+
// Single-file indicators take priority
|
|
112
|
+
if (params.code || params.filePath) {
|
|
113
|
+
return 'single-file';
|
|
114
|
+
}
|
|
115
|
+
// Multi-file indicators
|
|
116
|
+
if (params.projectPath || params.files) {
|
|
117
|
+
return 'multi-file';
|
|
118
|
+
}
|
|
119
|
+
// For code quality, default to single-file (analyze individual files)
|
|
120
|
+
return 'single-file';
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Validate parameters based on detected analysis mode
|
|
124
|
+
*/
|
|
125
|
+
validateParameters(params, mode) {
|
|
126
|
+
if (mode === 'single-file') {
|
|
127
|
+
ParameterValidator.validateCodeOrFile(params);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
ParameterValidator.validateProjectPath(params);
|
|
131
|
+
ParameterValidator.validateDepth(params);
|
|
132
|
+
}
|
|
133
|
+
// Universal validations
|
|
134
|
+
ParameterValidator.validateEnum(params, 'analysisType', ['complexity', 'maintainability', 'comprehensive']);
|
|
135
|
+
ParameterValidator.validateEnum(params, 'analysisDepth', ['basic', 'detailed', 'comprehensive']);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Execute single-file analysis
|
|
139
|
+
*/
|
|
140
|
+
async executeSingleFileAnalysis(params, model, contextLength) {
|
|
141
|
+
// Process single file input
|
|
142
|
+
let codeToAnalyze = params.code;
|
|
143
|
+
if (params.filePath) {
|
|
144
|
+
codeToAnalyze = await readFileContent(params.filePath);
|
|
145
|
+
}
|
|
146
|
+
// Generate prompt stages for single file
|
|
147
|
+
const promptStages = this.getSingleFilePromptStages({
|
|
148
|
+
...params,
|
|
149
|
+
code: codeToAnalyze
|
|
150
|
+
});
|
|
151
|
+
// Execute with appropriate method
|
|
152
|
+
const promptManager = new ThreeStagePromptManager(contextLength);
|
|
153
|
+
const needsChunking = promptManager.needsChunking(promptStages);
|
|
154
|
+
if (needsChunking) {
|
|
155
|
+
const conversation = promptManager.createChunkedConversation(promptStages);
|
|
156
|
+
const messages = [
|
|
157
|
+
conversation.systemMessage,
|
|
158
|
+
...conversation.dataMessages,
|
|
159
|
+
conversation.analysisMessage
|
|
160
|
+
];
|
|
161
|
+
return await ResponseProcessor.executeChunked(messages, model, contextLength, 'analyze_code_quality', 'single');
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
return await ResponseProcessor.executeDirect(promptStages, model, contextLength, 'analyze_code_quality');
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Execute multi-file analysis
|
|
169
|
+
*/
|
|
170
|
+
async executeMultiFileAnalysis(params, model, contextLength) {
|
|
171
|
+
// Discover files
|
|
172
|
+
let filesToAnalyze = params.files ||
|
|
173
|
+
await this.discoverRelevantFiles(params.projectPath, params.maxDepth, params.analysisType);
|
|
174
|
+
// Perform multi-file analysis with caching
|
|
175
|
+
const analysisResult = await this.performMultiFileAnalysis(filesToAnalyze, params, model, contextLength);
|
|
176
|
+
// Generate prompt stages for multi-file
|
|
177
|
+
const promptStages = this.getMultiFilePromptStages({
|
|
178
|
+
...params,
|
|
179
|
+
analysisResult,
|
|
180
|
+
fileCount: filesToAnalyze.length
|
|
181
|
+
});
|
|
182
|
+
// Always use chunking for multi-file
|
|
183
|
+
const promptManager = new ThreeStagePromptManager(contextLength);
|
|
184
|
+
const conversation = promptManager.createChunkedConversation(promptStages);
|
|
185
|
+
const messages = [
|
|
186
|
+
conversation.systemMessage,
|
|
187
|
+
...conversation.dataMessages,
|
|
188
|
+
conversation.analysisMessage
|
|
189
|
+
];
|
|
190
|
+
return await ResponseProcessor.executeChunked(messages, model, contextLength, 'analyze_code_quality', 'multifile');
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Single-file code quality analysis
|
|
194
|
+
*/
|
|
195
|
+
getSingleFilePromptStages(params) {
|
|
196
|
+
const { code, language, analysisDepth, analysisType } = params;
|
|
197
|
+
const systemAndContext = `You are an expert code quality analyst specializing in ${analysisDepth} ${analysisType} analysis.
|
|
198
|
+
|
|
199
|
+
Analysis Context:
|
|
200
|
+
- Language: ${language}
|
|
201
|
+
- Analysis Depth: ${analysisDepth}
|
|
202
|
+
- Analysis Type: ${analysisType}
|
|
203
|
+
- Mode: Single File Quality Analysis
|
|
204
|
+
|
|
205
|
+
Your task is to analyze code quality metrics including complexity, maintainability, readability, and adherence to best practices for this individual file.`;
|
|
206
|
+
const dataPayload = `Code to analyze:
|
|
207
|
+
|
|
208
|
+
\`\`\`${language}
|
|
209
|
+
${code}
|
|
210
|
+
\`\`\``;
|
|
211
|
+
const outputInstructions = `Provide comprehensive code quality analysis including:
|
|
212
|
+
|
|
213
|
+
**Quality Assessment Overview**
|
|
214
|
+
- Overall quality evaluation with numerical scoring out of 10
|
|
215
|
+
- Complexity assessment focusing on cyclomatic complexity and maintainability
|
|
216
|
+
- Readability evaluation covering naming conventions, code organization, and clarity
|
|
217
|
+
- Maintainability score considering future modification ease
|
|
218
|
+
|
|
219
|
+
**Detailed Quality Analysis**
|
|
220
|
+
- Cyclomatic complexity assessment with specific complexity hotspots
|
|
221
|
+
- Function and method length analysis identifying overly complex functions
|
|
222
|
+
- Variable naming consistency and clarity evaluation
|
|
223
|
+
- Code organization patterns and structural assessment
|
|
224
|
+
- Documentation quality and inline comment effectiveness
|
|
225
|
+
|
|
226
|
+
**Best Practices Adherence Evaluation**
|
|
227
|
+
- SOLID principles compliance with specific examples and scoring
|
|
228
|
+
- DRY principle adherence identifying code duplication patterns
|
|
229
|
+
- Error handling consistency and robustness assessment
|
|
230
|
+
- Language-specific best practices and idiom usage
|
|
231
|
+
- Performance considerations and optimization opportunities
|
|
232
|
+
|
|
233
|
+
**Quality Issues and Recommendations**
|
|
234
|
+
- Critical quality issues requiring immediate attention with specific line references
|
|
235
|
+
- Important improvements for maintainability and readability enhancement
|
|
236
|
+
- Minor refinements and polish opportunities for code excellence
|
|
237
|
+
- Prioritized recommendation list focusing on highest impact improvements first
|
|
238
|
+
|
|
239
|
+
**Implementation Guidance**
|
|
240
|
+
- Specific actionable steps for addressing identified quality issues
|
|
241
|
+
- Code refactoring suggestions with examples where applicable
|
|
242
|
+
- Long-term quality improvement strategies and practices
|
|
243
|
+
- Confidence assessment of the analysis accuracy and completeness
|
|
244
|
+
|
|
245
|
+
Focus on providing actionable insights that developers can implement immediately to improve code quality, maintainability, and team productivity.`;
|
|
246
|
+
return { systemAndContext, dataPayload, outputInstructions };
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Multi-file project quality analysis
|
|
250
|
+
*/
|
|
251
|
+
getMultiFilePromptStages(params) {
|
|
252
|
+
const { analysisResult, analysisType, analysisDepth, fileCount } = params;
|
|
253
|
+
const systemAndContext = `You are an expert project code quality analyst specializing in ${analysisDepth} ${analysisType} analysis.
|
|
254
|
+
|
|
255
|
+
Analysis Context:
|
|
256
|
+
- Analysis Type: ${analysisType}
|
|
257
|
+
- Analysis Depth: ${analysisDepth}
|
|
258
|
+
- Files Analyzed: ${fileCount}
|
|
259
|
+
- Mode: Project-wide Quality Analysis
|
|
260
|
+
|
|
261
|
+
Your task is to provide comprehensive code quality assessment across the entire project, identifying patterns, consistency issues, and quality metrics.`;
|
|
262
|
+
const dataPayload = `Project quality analysis results:
|
|
263
|
+
|
|
264
|
+
${JSON.stringify(analysisResult, null, 2)}`;
|
|
265
|
+
const outputInstructions = `Provide comprehensive project-wide code quality analysis including:
|
|
266
|
+
|
|
267
|
+
**Project Quality Overview**
|
|
268
|
+
- Overall project quality assessment with numerical scoring and quality maturity evaluation
|
|
269
|
+
- Quality consistency analysis across the entire codebase identifying patterns and variations
|
|
270
|
+
- Project maintainability assessment focusing on long-term sustainability and evolution capability
|
|
271
|
+
|
|
272
|
+
**Quality Distribution Analysis**
|
|
273
|
+
- Quality variance across files identifying high-performing and problematic areas
|
|
274
|
+
- Consistency patterns in coding standards, naming conventions, and structural approaches
|
|
275
|
+
- Quality hotspots requiring immediate attention and areas of excellence to replicate
|
|
276
|
+
|
|
277
|
+
**Cross-File Quality Patterns**
|
|
278
|
+
- Consistent quality patterns and practices implemented well across multiple files
|
|
279
|
+
- Inconsistent areas showing quality variations that impact team productivity
|
|
280
|
+
- Systematic quality issues affecting multiple components or architectural layers
|
|
281
|
+
- Code quality trends and evolution patterns throughout the project structure
|
|
282
|
+
|
|
283
|
+
**Strategic Quality Issues**
|
|
284
|
+
- Critical systemic problems affecting multiple files requiring architectural attention
|
|
285
|
+
- Quality consistency issues creating maintenance burden and reducing team velocity
|
|
286
|
+
- Technical debt accumulation patterns and their impact on project sustainability
|
|
287
|
+
- Cross-cutting concerns and quality patterns that span multiple modules or components
|
|
288
|
+
|
|
289
|
+
**Project Quality Recommendations**
|
|
290
|
+
- Immediate action items for addressing urgent quality problems across the project
|
|
291
|
+
- Quality standards and coding guidelines recommendations for team adoption
|
|
292
|
+
- Tooling and automation suggestions for maintaining consistent quality levels
|
|
293
|
+
- Refactoring prioritization strategy focusing on highest impact quality improvements
|
|
294
|
+
- Long-term quality improvement roadmap and architectural evolution guidance
|
|
295
|
+
|
|
296
|
+
**Implementation Strategy**
|
|
297
|
+
- Phase-based approach to implementing quality improvements across the project
|
|
298
|
+
- Team adoption strategies for quality standards and best practices
|
|
299
|
+
- Measurement and monitoring approaches for tracking quality improvements over time
|
|
300
|
+
- Project quality maturity assessment and growth pathway recommendations
|
|
301
|
+
|
|
302
|
+
Focus on providing strategic, actionable insights that improve overall project quality, team productivity, and long-term maintainability across the entire codebase.`;
|
|
303
|
+
return { systemAndContext, dataPayload, outputInstructions };
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Backwards compatibility method
|
|
307
|
+
*/
|
|
308
|
+
getPromptStages(params) {
|
|
309
|
+
const mode = this.detectAnalysisMode(params);
|
|
310
|
+
if (mode === 'single-file') {
|
|
311
|
+
return this.getSingleFilePromptStages(params);
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
return this.getMultiFilePromptStages(params);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
// Multi-file helper methods
|
|
318
|
+
async discoverRelevantFiles(projectPath, maxDepth, analysisType) {
|
|
319
|
+
const extensions = this.getFileExtensions(analysisType);
|
|
320
|
+
return await this.multiFileAnalysis.discoverFiles(projectPath, extensions, maxDepth);
|
|
321
|
+
}
|
|
322
|
+
async performMultiFileAnalysis(files, params, model, contextLength) {
|
|
323
|
+
const cacheKey = this.analysisCache.generateKey('analyze_code_quality', params, files);
|
|
324
|
+
const cached = await this.analysisCache.get(cacheKey);
|
|
325
|
+
if (cached)
|
|
326
|
+
return cached;
|
|
327
|
+
const fileAnalysisResults = await this.multiFileAnalysis.analyzeBatch(files, (file) => this.analyzeIndividualFile(file, params, model), contextLength);
|
|
328
|
+
// Aggregate results for quality analysis
|
|
329
|
+
const aggregatedResult = {
|
|
330
|
+
summary: `Code quality analysis of ${files.length} files`,
|
|
331
|
+
findings: fileAnalysisResults,
|
|
332
|
+
qualityMetrics: {
|
|
333
|
+
totalFiles: files.length,
|
|
334
|
+
averageComplexity: this.calculateAverageComplexity(fileAnalysisResults),
|
|
335
|
+
qualityDistribution: this.analyzeQualityDistribution(fileAnalysisResults),
|
|
336
|
+
commonIssues: this.identifyCommonIssues(fileAnalysisResults)
|
|
337
|
+
}
|
|
338
|
+
};
|
|
339
|
+
await this.analysisCache.cacheAnalysis(cacheKey, aggregatedResult, {
|
|
340
|
+
modelUsed: model.identifier || 'unknown',
|
|
341
|
+
executionTime: Date.now() - Date.now(),
|
|
342
|
+
timestamp: new Date().toISOString()
|
|
343
|
+
});
|
|
344
|
+
return aggregatedResult;
|
|
345
|
+
}
|
|
346
|
+
async analyzeIndividualFile(file, params, model) {
|
|
347
|
+
const content = await import('fs/promises').then(fs => fs.readFile(file, 'utf-8'));
|
|
348
|
+
const stats = await import('fs/promises').then(fs => fs.stat(file));
|
|
349
|
+
return {
|
|
350
|
+
filePath: file,
|
|
351
|
+
fileName: basename(file), // ✅ Use imported basename instead of require('path').basename
|
|
352
|
+
size: content.length,
|
|
353
|
+
lines: content.split('\n').length,
|
|
354
|
+
extension: extname(file), // ✅ Use imported extname
|
|
355
|
+
relativePath: relative(params.projectPath || '', file), // ✅ Use imported relative
|
|
356
|
+
complexity: this.estimateComplexity(content),
|
|
357
|
+
qualityScore: this.estimateQualityScore(content)
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
getFileExtensions(analysisType) {
|
|
361
|
+
// Updated extensions for code quality analysis
|
|
362
|
+
const extensionMap = {
|
|
363
|
+
'complexity': ['.js', '.ts', '.jsx', '.tsx', '.py', '.java', '.cs'],
|
|
364
|
+
'maintainability': ['.js', '.ts', '.jsx', '.tsx', '.py', '.java', '.cs', '.php'],
|
|
365
|
+
'comprehensive': ['.js', '.ts', '.jsx', '.tsx', '.py', '.java', '.cs', '.php', '.rb', '.go']
|
|
366
|
+
};
|
|
367
|
+
return extensionMap[analysisType] || extensionMap.comprehensive;
|
|
368
|
+
}
|
|
369
|
+
// Quality analysis helper methods
|
|
370
|
+
estimateComplexity(content) {
|
|
371
|
+
const complexityPatterns = [
|
|
372
|
+
/if\s*\(/g, /else/g, /while\s*\(/g, /for\s*\(/g,
|
|
373
|
+
/switch\s*\(/g, /case\s+/g, /catch\s*\(/g, /\?\s*:/g
|
|
374
|
+
];
|
|
375
|
+
let complexity = 1;
|
|
376
|
+
complexityPatterns.forEach(pattern => {
|
|
377
|
+
const matches = content.match(pattern);
|
|
378
|
+
if (matches) {
|
|
379
|
+
complexity += matches.length;
|
|
380
|
+
}
|
|
381
|
+
});
|
|
382
|
+
return complexity;
|
|
383
|
+
}
|
|
384
|
+
estimateQualityScore(content) {
|
|
385
|
+
let score = 10; // Start with perfect score
|
|
386
|
+
// Deduct points for quality issues
|
|
387
|
+
if (content.includes('console.log'))
|
|
388
|
+
score -= 1; // Debug statements
|
|
389
|
+
if (content.includes('TODO') || content.includes('FIXME'))
|
|
390
|
+
score -= 1; // Incomplete code
|
|
391
|
+
if (content.length > 1000 && !content.includes('\n\n'))
|
|
392
|
+
score -= 1; // Lack of spacing
|
|
393
|
+
if (!/\/\*\*|\*\/|\/\//.test(content))
|
|
394
|
+
score -= 2; // No comments
|
|
395
|
+
return Math.max(0, score);
|
|
396
|
+
}
|
|
397
|
+
calculateAverageComplexity(results) {
|
|
398
|
+
const totalComplexity = results.reduce((sum, result) => sum + (result.complexity || 0), 0);
|
|
399
|
+
return results.length > 0 ? totalComplexity / results.length : 0;
|
|
400
|
+
}
|
|
401
|
+
analyzeQualityDistribution(results) {
|
|
402
|
+
const distribution = { high: 0, medium: 0, low: 0 };
|
|
403
|
+
results.forEach(result => {
|
|
404
|
+
const score = result.qualityScore || 0;
|
|
405
|
+
if (score >= 8)
|
|
406
|
+
distribution.high++;
|
|
407
|
+
else if (score >= 6)
|
|
408
|
+
distribution.medium++;
|
|
409
|
+
else
|
|
410
|
+
distribution.low++;
|
|
411
|
+
});
|
|
412
|
+
return distribution;
|
|
413
|
+
}
|
|
414
|
+
identifyCommonIssues(results) {
|
|
415
|
+
const issues = [];
|
|
416
|
+
const highComplexityFiles = results.filter(r => (r.complexity || 0) > 10).length;
|
|
417
|
+
if (highComplexityFiles > results.length * 0.2) {
|
|
418
|
+
issues.push('High complexity in multiple files');
|
|
419
|
+
}
|
|
420
|
+
const lowQualityFiles = results.filter(r => (r.qualityScore || 0) < 6).length;
|
|
421
|
+
if (lowQualityFiles > results.length * 0.1) {
|
|
422
|
+
issues.push('Quality issues across multiple files');
|
|
423
|
+
}
|
|
424
|
+
return issues;
|
|
425
|
+
}
|
|
426
|
+
generateCacheKey(files, params) {
|
|
427
|
+
const fileHash = files.join('|');
|
|
428
|
+
const paramHash = JSON.stringify(params);
|
|
429
|
+
return `${fileHash}_${paramHash}`.substring(0, 64);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
export default CodeQualityAnalyzer;
|
|
433
|
+
//# sourceMappingURL=code-quality.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-quality.js","sourceRoot":"","sources":["../../../src/prompts/analyze/code-quality.ts"],"names":[],"mappings":"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"}
|