@stackguide/mcp-server 2.4.0 → 3.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/README.md +82 -16
- package/dist/config/healthWeights.d.ts +87 -0
- package/dist/config/healthWeights.d.ts.map +1 -0
- package/dist/config/healthWeights.js +238 -0
- package/dist/config/healthWeights.js.map +1 -0
- package/dist/config/types.d.ts +104 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js.map +1 -1
- package/dist/handlers/generate.d.ts +6 -0
- package/dist/handlers/generate.d.ts.map +1 -1
- package/dist/handlers/generate.js +81 -5
- package/dist/handlers/generate.js.map +1 -1
- package/dist/handlers/health.d.ts +7 -0
- package/dist/handlers/health.d.ts.map +1 -1
- package/dist/handlers/health.js +151 -69
- package/dist/handlers/health.js.map +1 -1
- package/dist/handlers/review.d.ts +12 -0
- package/dist/handlers/review.d.ts.map +1 -1
- package/dist/handlers/review.js +220 -21
- package/dist/handlers/review.js.map +1 -1
- package/dist/services/analysisCache.d.ts +110 -0
- package/dist/services/analysisCache.d.ts.map +1 -0
- package/dist/services/analysisCache.js +233 -0
- package/dist/services/analysisCache.js.map +1 -0
- package/dist/services/codeAnalyzer.d.ts +73 -30
- package/dist/services/codeAnalyzer.d.ts.map +1 -1
- package/dist/services/codeAnalyzer.js +384 -36
- package/dist/services/codeAnalyzer.js.map +1 -1
- package/dist/services/conventionDetector.d.ts +40 -0
- package/dist/services/conventionDetector.d.ts.map +1 -0
- package/dist/services/conventionDetector.js +465 -0
- package/dist/services/conventionDetector.js.map +1 -0
- package/dist/services/cursorDirectory.d.ts +29 -2
- package/dist/services/cursorDirectory.d.ts.map +1 -1
- package/dist/services/cursorDirectory.js +260 -9
- package/dist/services/cursorDirectory.js.map +1 -1
- package/dist/utils/validation.d.ts +2 -2
- package/package.json +1 -1
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analysis Cache Service
|
|
3
|
+
* Caches code analysis results by file hash to avoid re-analyzing unchanged files
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'fs';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
import * as crypto from 'crypto';
|
|
8
|
+
import { logger } from '../utils/logger.js';
|
|
9
|
+
const CACHE_VERSION = '1.0.0';
|
|
10
|
+
const CACHE_TTL = 24 * 60 * 60 * 1000; // 24 hours
|
|
11
|
+
const CACHE_DIR = '.stackguide';
|
|
12
|
+
const CACHE_FILE = 'analysis-cache.json';
|
|
13
|
+
/**
|
|
14
|
+
* Compute SHA256 hash of file content
|
|
15
|
+
*/
|
|
16
|
+
export function computeFileHash(content) {
|
|
17
|
+
return crypto.createHash('sha256').update(content).digest('hex').slice(0, 16);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Get cache directory path for a project
|
|
21
|
+
*/
|
|
22
|
+
export function getCacheDir(projectPath) {
|
|
23
|
+
return path.join(projectPath, CACHE_DIR);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Get cache file path for a project
|
|
27
|
+
*/
|
|
28
|
+
export function getCacheFilePath(projectPath) {
|
|
29
|
+
return path.join(getCacheDir(projectPath), CACHE_FILE);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Load cache from disk
|
|
33
|
+
*/
|
|
34
|
+
export function loadCache(projectPath) {
|
|
35
|
+
const cachePath = getCacheFilePath(projectPath);
|
|
36
|
+
try {
|
|
37
|
+
if (fs.existsSync(cachePath)) {
|
|
38
|
+
const data = fs.readFileSync(cachePath, 'utf-8');
|
|
39
|
+
const cache = JSON.parse(data);
|
|
40
|
+
// Invalidate cache if version mismatch
|
|
41
|
+
if (cache.version !== CACHE_VERSION) {
|
|
42
|
+
logger.debug('Cache version mismatch, starting fresh');
|
|
43
|
+
return createEmptyCache();
|
|
44
|
+
}
|
|
45
|
+
return cache;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
logger.debug('Failed to load cache, starting fresh', { error });
|
|
50
|
+
}
|
|
51
|
+
return createEmptyCache();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Save cache to disk
|
|
55
|
+
*/
|
|
56
|
+
export function saveCache(projectPath, cache) {
|
|
57
|
+
const cacheDir = getCacheDir(projectPath);
|
|
58
|
+
const cachePath = getCacheFilePath(projectPath);
|
|
59
|
+
try {
|
|
60
|
+
// Ensure cache directory exists
|
|
61
|
+
if (!fs.existsSync(cacheDir)) {
|
|
62
|
+
fs.mkdirSync(cacheDir, { recursive: true });
|
|
63
|
+
}
|
|
64
|
+
// Clean expired entries before saving
|
|
65
|
+
const cleanedCache = cleanExpiredEntries(cache);
|
|
66
|
+
fs.writeFileSync(cachePath, JSON.stringify(cleanedCache, null, 2));
|
|
67
|
+
logger.debug('Cache saved', { entries: Object.keys(cleanedCache.entries).length });
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
logger.debug('Failed to save cache', { error });
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Create empty cache store
|
|
75
|
+
*/
|
|
76
|
+
export function createEmptyCache() {
|
|
77
|
+
return {
|
|
78
|
+
version: CACHE_VERSION,
|
|
79
|
+
entries: {}
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Clean expired entries from cache
|
|
84
|
+
*/
|
|
85
|
+
export function cleanExpiredEntries(cache) {
|
|
86
|
+
const now = Date.now();
|
|
87
|
+
const cleanedEntries = {};
|
|
88
|
+
for (const [filePath, entry] of Object.entries(cache.entries)) {
|
|
89
|
+
if (now - entry.timestamp < CACHE_TTL) {
|
|
90
|
+
cleanedEntries[filePath] = entry;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
version: cache.version,
|
|
95
|
+
entries: cleanedEntries
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Get cached analysis result if valid
|
|
100
|
+
*/
|
|
101
|
+
export function getCachedResult(cache, filePath, content) {
|
|
102
|
+
const entry = cache.entries[filePath];
|
|
103
|
+
if (!entry) {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
const currentHash = computeFileHash(content);
|
|
107
|
+
// Check if hash matches and entry is not expired
|
|
108
|
+
if (entry.hash === currentHash && Date.now() - entry.timestamp < CACHE_TTL) {
|
|
109
|
+
logger.debug('Cache hit', { filePath });
|
|
110
|
+
return entry.result;
|
|
111
|
+
}
|
|
112
|
+
logger.debug('Cache miss', { filePath, reason: entry.hash !== currentHash ? 'hash mismatch' : 'expired' });
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Store analysis result in cache
|
|
117
|
+
*/
|
|
118
|
+
export function setCachedResult(cache, filePath, content, result) {
|
|
119
|
+
cache.entries[filePath] = {
|
|
120
|
+
hash: computeFileHash(content),
|
|
121
|
+
result,
|
|
122
|
+
timestamp: Date.now(),
|
|
123
|
+
version: CACHE_VERSION
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Invalidate cache entry for a file
|
|
128
|
+
*/
|
|
129
|
+
export function invalidateCacheEntry(cache, filePath) {
|
|
130
|
+
delete cache.entries[filePath];
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Clear all cache entries
|
|
134
|
+
*/
|
|
135
|
+
export function clearCache(projectPath) {
|
|
136
|
+
const cachePath = getCacheFilePath(projectPath);
|
|
137
|
+
try {
|
|
138
|
+
if (fs.existsSync(cachePath)) {
|
|
139
|
+
fs.unlinkSync(cachePath);
|
|
140
|
+
logger.debug('Cache cleared');
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
logger.debug('Failed to clear cache', { error });
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Get cache statistics
|
|
149
|
+
*/
|
|
150
|
+
export function getCacheStats(cache) {
|
|
151
|
+
const now = Date.now();
|
|
152
|
+
let validEntries = 0;
|
|
153
|
+
let expiredEntries = 0;
|
|
154
|
+
let oldestEntry = null;
|
|
155
|
+
let newestEntry = null;
|
|
156
|
+
for (const entry of Object.values(cache.entries)) {
|
|
157
|
+
if (now - entry.timestamp < CACHE_TTL) {
|
|
158
|
+
validEntries++;
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
expiredEntries++;
|
|
162
|
+
}
|
|
163
|
+
if (oldestEntry === null || entry.timestamp < oldestEntry) {
|
|
164
|
+
oldestEntry = entry.timestamp;
|
|
165
|
+
}
|
|
166
|
+
if (newestEntry === null || entry.timestamp > newestEntry) {
|
|
167
|
+
newestEntry = entry.timestamp;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
totalEntries: Object.keys(cache.entries).length,
|
|
172
|
+
validEntries,
|
|
173
|
+
expiredEntries,
|
|
174
|
+
oldestEntry,
|
|
175
|
+
newestEntry
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* AnalysisCacheManager - High-level API for managing analysis cache
|
|
180
|
+
*/
|
|
181
|
+
export class AnalysisCacheManager {
|
|
182
|
+
projectPath;
|
|
183
|
+
cache;
|
|
184
|
+
dirty = false;
|
|
185
|
+
constructor(projectPath) {
|
|
186
|
+
this.projectPath = projectPath;
|
|
187
|
+
this.cache = loadCache(projectPath);
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Get cached result or null if not found/invalid
|
|
191
|
+
*/
|
|
192
|
+
get(filePath, content) {
|
|
193
|
+
return getCachedResult(this.cache, filePath, content);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Store result in cache
|
|
197
|
+
*/
|
|
198
|
+
set(filePath, content, result) {
|
|
199
|
+
setCachedResult(this.cache, filePath, content, result);
|
|
200
|
+
this.dirty = true;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Invalidate a specific file
|
|
204
|
+
*/
|
|
205
|
+
invalidate(filePath) {
|
|
206
|
+
invalidateCacheEntry(this.cache, filePath);
|
|
207
|
+
this.dirty = true;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Save cache to disk if modified
|
|
211
|
+
*/
|
|
212
|
+
save() {
|
|
213
|
+
if (this.dirty) {
|
|
214
|
+
saveCache(this.projectPath, this.cache);
|
|
215
|
+
this.dirty = false;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Get cache statistics
|
|
220
|
+
*/
|
|
221
|
+
getStats() {
|
|
222
|
+
return getCacheStats(this.cache);
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Clear all cache
|
|
226
|
+
*/
|
|
227
|
+
clear() {
|
|
228
|
+
clearCache(this.projectPath);
|
|
229
|
+
this.cache = createEmptyCache();
|
|
230
|
+
this.dirty = false;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=analysisCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analysisCache.js","sourceRoot":"","sources":["../../src/services/analysisCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,37 +1,74 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Code Analyzer Service
|
|
3
|
-
*
|
|
2
|
+
* Code Analyzer Service - v3.0.0
|
|
3
|
+
* Unified rule pipeline that supports builtin, user, and project rules
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
5
|
+
import { PatternRule, CodeIssue, AnalysisResult, QuickFix } from '../config/types.js';
|
|
6
|
+
export type { QuickFix, CodeIssue, AnalysisResult };
|
|
7
|
+
/**
|
|
8
|
+
* In-memory registry of all active rules
|
|
9
|
+
*/
|
|
10
|
+
declare class RuleRegistry {
|
|
11
|
+
private builtinRules;
|
|
12
|
+
private userRules;
|
|
13
|
+
private projectRules;
|
|
14
|
+
/**
|
|
15
|
+
* Get all builtin rules
|
|
16
|
+
*/
|
|
17
|
+
getBuiltinRules(): PatternRule[];
|
|
18
|
+
/**
|
|
19
|
+
* Get all user-defined rules
|
|
20
|
+
*/
|
|
21
|
+
getUserRules(): PatternRule[];
|
|
22
|
+
/**
|
|
23
|
+
* Get all project-specific rules
|
|
24
|
+
*/
|
|
25
|
+
getProjectRules(): PatternRule[];
|
|
26
|
+
/**
|
|
27
|
+
* Get all active rules, sorted by priority (highest first)
|
|
28
|
+
*/
|
|
29
|
+
getAllRules(): PatternRule[];
|
|
30
|
+
/**
|
|
31
|
+
* Register a user-defined pattern rule
|
|
32
|
+
*/
|
|
33
|
+
registerUserRule(rule: Omit<PatternRule, 'source' | 'type'>): void;
|
|
34
|
+
/**
|
|
35
|
+
* Register a project-specific pattern rule
|
|
36
|
+
*/
|
|
37
|
+
registerProjectRule(rule: Omit<PatternRule, 'source' | 'type'>): void;
|
|
38
|
+
/**
|
|
39
|
+
* Register multiple project rules at once
|
|
40
|
+
*/
|
|
41
|
+
registerProjectRules(rules: Array<Omit<PatternRule, 'source' | 'type'>>): void;
|
|
42
|
+
/**
|
|
43
|
+
* Clear all user rules
|
|
44
|
+
*/
|
|
45
|
+
clearUserRules(): void;
|
|
46
|
+
/**
|
|
47
|
+
* Clear all project rules
|
|
48
|
+
*/
|
|
49
|
+
clearProjectRules(): void;
|
|
50
|
+
/**
|
|
51
|
+
* Disable a builtin rule by ID
|
|
52
|
+
*/
|
|
53
|
+
disableBuiltinRule(ruleId: string): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Enable a builtin rule by ID
|
|
56
|
+
*/
|
|
57
|
+
enableBuiltinRule(ruleId: string): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Get statistics about registered rules
|
|
60
|
+
*/
|
|
61
|
+
getStats(): {
|
|
62
|
+
builtin: number;
|
|
63
|
+
user: number;
|
|
64
|
+
project: number;
|
|
65
|
+
total: number;
|
|
32
66
|
};
|
|
33
|
-
quickFixes?: QuickFix[];
|
|
34
67
|
}
|
|
68
|
+
export declare const ruleRegistry: RuleRegistry;
|
|
69
|
+
/**
|
|
70
|
+
* Analyze code using the unified rule pipeline
|
|
71
|
+
*/
|
|
35
72
|
export declare function analyzeCode(file: string, content: string, focus?: 'all' | 'security' | 'performance' | 'architecture' | 'coding-standards'): AnalysisResult;
|
|
36
73
|
export declare function analyzeMultipleFiles(files: Array<{
|
|
37
74
|
path: string;
|
|
@@ -43,7 +80,13 @@ export declare function analyzeMultipleFiles(files: Array<{
|
|
|
43
80
|
totalIssues: number;
|
|
44
81
|
averageScore: number;
|
|
45
82
|
summary: AnalysisResult['summary'];
|
|
83
|
+
rulesApplied: AnalysisResult['rulesApplied'];
|
|
46
84
|
};
|
|
47
85
|
};
|
|
48
86
|
export declare function formatAnalysisReport(result: AnalysisResult): string;
|
|
87
|
+
/**
|
|
88
|
+
* Parse a user-defined rule content to extract pattern rules
|
|
89
|
+
* This bridges the gap between RuleManager's documentation rules and analysis rules
|
|
90
|
+
*/
|
|
91
|
+
export declare function parseUserRuleToPatternRule(ruleId: string, content: string, category: string): PatternRule | null;
|
|
49
92
|
//# sourceMappingURL=codeAnalyzer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codeAnalyzer.d.ts","sourceRoot":"","sources":["../../src/services/codeAnalyzer.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"codeAnalyzer.d.ts","sourceRoot":"","sources":["../../src/services/codeAnalyzer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,WAAW,EACX,SAAS,EACT,cAAc,EACd,QAAQ,EAGT,MAAM,oBAAoB,CAAC;AAG5B,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;AAifpD;;GAEG;AACH,cAAM,YAAY;IAChB,OAAO,CAAC,YAAY,CAA6C;IACjE,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,YAAY,CAAqB;IAEzC;;OAEG;IACH,eAAe,IAAI,WAAW,EAAE;IAIhC;;OAEG;IACH,YAAY,IAAI,WAAW,EAAE;IAI7B;;OAEG;IACH,eAAe,IAAI,WAAW,EAAE;IAIhC;;OAEG;IACH,WAAW,IAAI,WAAW,EAAE;IAW5B;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,GAAG,MAAM,CAAC,GAAG,IAAI;IAclE;;OAEG;IACH,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,GAAG,MAAM,CAAC,GAAG,IAAI;IAcrE;;OAEG;IACH,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,GAAG,MAAM,CAAC,CAAC,GAAG,IAAI;IAM9E;;OAEG;IACH,cAAc,IAAI,IAAI;IAKtB;;OAEG;IACH,iBAAiB,IAAI,IAAI;IAKzB;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAU3C;;OAEG;IACH,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAU1C;;OAEG;IACH,QAAQ,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;CAM9E;AAGD,eAAO,MAAM,YAAY,cAAqB,CAAC;AA8B/C;;GAEG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,KAAK,GAAG,UAAU,GAAG,aAAa,GAAG,cAAc,GAAG,kBAA0B,GACtF,cAAc,CA8GhB;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,EAC/C,KAAK,GAAE,KAAK,GAAG,UAAU,GAAG,aAAa,GAAG,cAAc,GAAG,kBAA0B,GACtF;IACD,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,OAAO,EAAE;QACP,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;QACnC,YAAY,EAAE,cAAc,CAAC,cAAc,CAAC,CAAC;KAC9C,CAAC;CACH,CA+BA;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAmDnE;AAMD;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,WAAW,GAAG,IAAI,CA6CpB"}
|