@stackguide/mcp-server 2.4.0 → 3.1.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 +150 -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/astAnalyzer.d.ts +21 -0
- package/dist/services/astAnalyzer.d.ts.map +1 -0
- package/dist/services/astAnalyzer.js +593 -0
- package/dist/services/astAnalyzer.js.map +1 -0
- package/dist/services/codeAnalyzer.d.ts +109 -30
- package/dist/services/codeAnalyzer.d.ts.map +1 -1
- package/dist/services/codeAnalyzer.js +519 -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 +2 -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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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AST Analyzer Service - Phase 2
|
|
3
|
+
* Provides semantic code analysis using ts-morph
|
|
4
|
+
*/
|
|
5
|
+
import { SourceFile, Node, SyntaxKind } from 'ts-morph';
|
|
6
|
+
import { ASTRule, CodeIssue } from '../config/types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Clear the cached project (useful for testing or memory management)
|
|
9
|
+
*/
|
|
10
|
+
export declare function clearASTCache(): void;
|
|
11
|
+
/**
|
|
12
|
+
* Parse source code into a ts-morph SourceFile
|
|
13
|
+
*/
|
|
14
|
+
export declare function parseCode(filePath: string, content: string): SourceFile | null;
|
|
15
|
+
/**
|
|
16
|
+
* Run AST rules against a source file
|
|
17
|
+
*/
|
|
18
|
+
export declare function analyzeWithAST(filePath: string, content: string, rules: ASTRule[]): CodeIssue[];
|
|
19
|
+
export declare const BUILTIN_AST_RULES: ASTRule[];
|
|
20
|
+
export { SyntaxKind, Node, SourceFile };
|
|
21
|
+
//# sourceMappingURL=astAnalyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"astAnalyzer.d.ts","sourceRoot":"","sources":["../../src/services/astAnalyzer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAW,UAAU,EAAE,IAAI,EAAE,UAAU,EAAM,MAAM,UAAU,CAAC;AAErE,OAAO,EAAE,OAAO,EAAmC,SAAS,EAAiB,MAAM,oBAAoB,CAAC;AA6BxG;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAMpC;AAMD;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAkB9E;AAoFD;;GAEG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,OAAO,EAAE,GACf,SAAS,EAAE,CAmEb;AAMD,eAAO,MAAM,iBAAiB,EAAE,OAAO,EAybtC,CAAC;AAMF,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC"}
|