@stackguide/mcp-server 3.3.0 → 3.8.2
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 +259 -10
- package/dist/config/persistence.d.ts +16 -0
- package/dist/config/persistence.d.ts.map +1 -1
- package/dist/config/persistence.js +53 -0
- package/dist/config/persistence.js.map +1 -1
- package/dist/handlers/config.d.ts +1 -8
- package/dist/handlers/config.d.ts.map +1 -1
- package/dist/handlers/config.js +7 -1
- package/dist/handlers/config.js.map +1 -1
- package/dist/handlers/context.d.ts +1 -5
- package/dist/handlers/context.d.ts.map +1 -1
- package/dist/handlers/context.js +7 -1
- package/dist/handlers/context.js.map +1 -1
- package/dist/handlers/cursor.d.ts +1 -7
- package/dist/handlers/cursor.d.ts.map +1 -1
- package/dist/handlers/cursor.js +7 -1
- package/dist/handlers/cursor.js.map +1 -1
- package/dist/handlers/custom-rule.d.ts +1 -11
- package/dist/handlers/custom-rule.d.ts.map +1 -1
- package/dist/handlers/custom-rule.js +7 -1
- package/dist/handlers/custom-rule.js.map +1 -1
- package/dist/handlers/docs.d.ts +1 -8
- package/dist/handlers/docs.d.ts.map +1 -1
- package/dist/handlers/docs.js +7 -1
- package/dist/handlers/docs.js.map +1 -1
- package/dist/handlers/generate.d.ts +1 -13
- package/dist/handlers/generate.d.ts.map +1 -1
- package/dist/handlers/generate.js +6 -3
- package/dist/handlers/generate.js.map +1 -1
- package/dist/handlers/health.d.ts +1 -8
- package/dist/handlers/health.d.ts.map +1 -1
- package/dist/handlers/health.js +11 -3
- package/dist/handlers/health.js.map +1 -1
- package/dist/handlers/help.d.ts +1 -5
- package/dist/handlers/help.d.ts.map +1 -1
- package/dist/handlers/help.js +7 -1
- package/dist/handlers/help.js.map +1 -1
- package/dist/handlers/knowledge.d.ts +1 -8
- package/dist/handlers/knowledge.d.ts.map +1 -1
- package/dist/handlers/knowledge.js +7 -1
- package/dist/handlers/knowledge.js.map +1 -1
- package/dist/handlers/prompts.d.ts +31 -0
- package/dist/handlers/prompts.d.ts.map +1 -0
- package/dist/handlers/prompts.js +236 -0
- package/dist/handlers/prompts.js.map +1 -0
- package/dist/handlers/resources.d.ts +27 -0
- package/dist/handlers/resources.d.ts.map +1 -0
- package/dist/handlers/resources.js +210 -0
- package/dist/handlers/resources.js.map +1 -0
- package/dist/handlers/review.d.ts.map +1 -1
- package/dist/handlers/review.js +45 -4
- package/dist/handlers/review.js.map +1 -1
- package/dist/handlers/rules.d.ts +1 -9
- package/dist/handlers/rules.d.ts.map +1 -1
- package/dist/handlers/rules.js +7 -1
- package/dist/handlers/rules.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29 -419
- package/dist/index.js.map +1 -1
- package/dist/router/index.d.ts +69 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +151 -0
- package/dist/router/index.js.map +1 -0
- package/dist/services/ast/analyzer.d.ts +55 -0
- package/dist/services/ast/analyzer.d.ts.map +1 -0
- package/dist/services/ast/analyzer.js +268 -0
- package/dist/services/ast/analyzer.js.map +1 -0
- package/dist/services/ast/index.d.ts +10 -0
- package/dist/services/ast/index.d.ts.map +1 -0
- package/dist/services/ast/index.js +12 -0
- package/dist/services/ast/index.js.map +1 -0
- package/dist/services/ast/rules.d.ts +13 -0
- package/dist/services/ast/rules.d.ts.map +1 -0
- package/dist/services/ast/rules.js +358 -0
- package/dist/services/ast/rules.js.map +1 -0
- package/dist/services/ast/treeSitterParser.d.ts +54 -0
- package/dist/services/ast/treeSitterParser.d.ts.map +1 -0
- package/dist/services/ast/treeSitterParser.js +394 -0
- package/dist/services/ast/treeSitterParser.js.map +1 -0
- package/dist/services/ast/types.d.ts +167 -0
- package/dist/services/ast/types.d.ts.map +1 -0
- package/dist/services/ast/types.js +35 -0
- package/dist/services/ast/types.js.map +1 -0
- package/dist/services/codeAnalyzer.d.ts.map +1 -1
- package/dist/services/codeAnalyzer.js +43 -3
- package/dist/services/codeAnalyzer.js.map +1 -1
- package/dist/services/httpClient.d.ts +45 -0
- package/dist/services/httpClient.d.ts.map +1 -0
- package/dist/services/httpClient.js +309 -0
- package/dist/services/httpClient.js.map +1 -0
- package/dist/services/intelligence/projectFs.d.ts +11 -0
- package/dist/services/intelligence/projectFs.d.ts.map +1 -0
- package/dist/services/intelligence/projectFs.js +30 -0
- package/dist/services/intelligence/projectFs.js.map +1 -0
- package/dist/services/projectFs.d.ts +85 -0
- package/dist/services/projectFs.d.ts.map +1 -0
- package/dist/services/projectFs.js +287 -0
- package/dist/services/projectFs.js.map +1 -0
- package/dist/services/rulesEngine.d.ts +255 -0
- package/dist/services/rulesEngine.d.ts.map +1 -0
- package/dist/services/rulesEngine.js +523 -0
- package/dist/services/rulesEngine.js.map +1 -0
- package/dist/services/webDocumentation.d.ts +11 -0
- package/dist/services/webDocumentation.d.ts.map +1 -1
- package/dist/services/webDocumentation.js +231 -27
- package/dist/services/webDocumentation.js.map +1 -1
- package/dist/storage/index.d.ts +7 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +7 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/sqlite.d.ts +92 -0
- package/dist/storage/sqlite.d.ts.map +1 -0
- package/dist/storage/sqlite.js +471 -0
- package/dist/storage/sqlite.js.map +1 -0
- package/dist/storage/types.d.ts +147 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +13 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/utils/logger.d.ts +11 -2
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +30 -2
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/safeFetch.d.ts +12 -0
- package/dist/utils/safeFetch.d.ts.map +1 -0
- package/dist/utils/safeFetch.js +107 -0
- package/dist/utils/safeFetch.js.map +1 -0
- package/dist/utils/validation.d.ts +1 -1
- package/dist/validation/index.d.ts +8 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +19 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/schemas.d.ts +346 -0
- package/dist/validation/schemas.d.ts.map +1 -0
- package/dist/validation/schemas.js +256 -0
- package/dist/validation/schemas.js.map +1 -0
- package/package.json +9 -2
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ProjectFs - Injectable Filesystem Abstraction
|
|
3
|
+
* Enables real FS access in production, mocks in tests
|
|
4
|
+
* @version 3.4.0
|
|
5
|
+
*/
|
|
6
|
+
export interface FileInfo {
|
|
7
|
+
name: string;
|
|
8
|
+
path: string;
|
|
9
|
+
isDirectory: boolean;
|
|
10
|
+
isFile: boolean;
|
|
11
|
+
size?: number;
|
|
12
|
+
modifiedAt?: Date;
|
|
13
|
+
}
|
|
14
|
+
export interface DirectoryScanOptions {
|
|
15
|
+
maxDepth?: number;
|
|
16
|
+
ignorePatterns?: string[];
|
|
17
|
+
includeHidden?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface ProjectFs {
|
|
20
|
+
/** Check if path exists */
|
|
21
|
+
exists(filepath: string): Promise<boolean>;
|
|
22
|
+
/** Check if path is a directory */
|
|
23
|
+
isDirectory(filepath: string): Promise<boolean>;
|
|
24
|
+
/** Check if path is a file */
|
|
25
|
+
isFile(filepath: string): Promise<boolean>;
|
|
26
|
+
/** Read file contents */
|
|
27
|
+
readFile(filepath: string): Promise<string>;
|
|
28
|
+
/** Write file contents */
|
|
29
|
+
writeFile(filepath: string, content: string): Promise<void>;
|
|
30
|
+
/** Read directory entries */
|
|
31
|
+
readDir(dirpath: string): Promise<FileInfo[]>;
|
|
32
|
+
/** Recursively scan directory */
|
|
33
|
+
scanDir(dirpath: string, options?: DirectoryScanOptions): Promise<FileInfo[]>;
|
|
34
|
+
/** Get file/directory info */
|
|
35
|
+
stat(filepath: string): Promise<FileInfo | null>;
|
|
36
|
+
/** Resolve path relative to base */
|
|
37
|
+
resolve(...paths: string[]): string;
|
|
38
|
+
/** Join paths */
|
|
39
|
+
join(...paths: string[]): string;
|
|
40
|
+
/** Get base directory */
|
|
41
|
+
getBasePath(): string;
|
|
42
|
+
}
|
|
43
|
+
export declare class RealProjectFs implements ProjectFs {
|
|
44
|
+
private basePath;
|
|
45
|
+
constructor(basePath?: string);
|
|
46
|
+
exists(filepath: string): Promise<boolean>;
|
|
47
|
+
isDirectory(filepath: string): Promise<boolean>;
|
|
48
|
+
isFile(filepath: string): Promise<boolean>;
|
|
49
|
+
readFile(filepath: string): Promise<string>;
|
|
50
|
+
writeFile(filepath: string, content: string): Promise<void>;
|
|
51
|
+
readDir(dirpath: string): Promise<FileInfo[]>;
|
|
52
|
+
scanDir(dirpath: string, options?: DirectoryScanOptions): Promise<FileInfo[]>;
|
|
53
|
+
stat(filepath: string): Promise<FileInfo | null>;
|
|
54
|
+
resolve(...paths: string[]): string;
|
|
55
|
+
join(...paths: string[]): string;
|
|
56
|
+
getBasePath(): string;
|
|
57
|
+
}
|
|
58
|
+
export interface MockFileEntry {
|
|
59
|
+
content?: string;
|
|
60
|
+
isDirectory?: boolean;
|
|
61
|
+
}
|
|
62
|
+
export declare class MockProjectFs implements ProjectFs {
|
|
63
|
+
private basePath;
|
|
64
|
+
private files;
|
|
65
|
+
constructor(basePath?: string, initialFiles?: Record<string, MockFileEntry>);
|
|
66
|
+
addFile(filepath: string, content: string): void;
|
|
67
|
+
addDirectory(dirpath: string): void;
|
|
68
|
+
exists(filepath: string): Promise<boolean>;
|
|
69
|
+
isDirectory(filepath: string): Promise<boolean>;
|
|
70
|
+
isFile(filepath: string): Promise<boolean>;
|
|
71
|
+
readFile(filepath: string): Promise<string>;
|
|
72
|
+
writeFile(filepath: string, content: string): Promise<void>;
|
|
73
|
+
readDir(dirpath: string): Promise<FileInfo[]>;
|
|
74
|
+
scanDir(dirpath: string, options?: DirectoryScanOptions): Promise<FileInfo[]>;
|
|
75
|
+
stat(filepath: string): Promise<FileInfo | null>;
|
|
76
|
+
resolve(...paths: string[]): string;
|
|
77
|
+
join(...paths: string[]): string;
|
|
78
|
+
getBasePath(): string;
|
|
79
|
+
private hasChildrenAt;
|
|
80
|
+
}
|
|
81
|
+
export declare function createProjectFs(basePath?: string): ProjectFs;
|
|
82
|
+
export declare function getProjectFs(): ProjectFs;
|
|
83
|
+
export declare function setProjectFs(fs: ProjectFs): void;
|
|
84
|
+
export declare function resetProjectFs(): void;
|
|
85
|
+
//# sourceMappingURL=projectFs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectFs.d.ts","sourceRoot":"","sources":["../../src/services/projectFs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ProjectFs - Injectable Filesystem Abstraction
|
|
3
|
+
* Enables real FS access in production, mocks in tests
|
|
4
|
+
* @version 3.4.0
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from 'fs';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// Real Filesystem Implementation
|
|
10
|
+
// ============================================================================
|
|
11
|
+
const DEFAULT_IGNORE_PATTERNS = [
|
|
12
|
+
'node_modules',
|
|
13
|
+
'.git',
|
|
14
|
+
'.svn',
|
|
15
|
+
'.hg',
|
|
16
|
+
'__pycache__',
|
|
17
|
+
'.pytest_cache',
|
|
18
|
+
'.mypy_cache',
|
|
19
|
+
'target',
|
|
20
|
+
'dist',
|
|
21
|
+
'build',
|
|
22
|
+
'.next',
|
|
23
|
+
'.nuxt',
|
|
24
|
+
'coverage',
|
|
25
|
+
'.nyc_output',
|
|
26
|
+
'vendor',
|
|
27
|
+
'.idea',
|
|
28
|
+
'.vscode'
|
|
29
|
+
];
|
|
30
|
+
export class RealProjectFs {
|
|
31
|
+
basePath;
|
|
32
|
+
constructor(basePath = process.cwd()) {
|
|
33
|
+
this.basePath = path.resolve(basePath);
|
|
34
|
+
}
|
|
35
|
+
async exists(filepath) {
|
|
36
|
+
try {
|
|
37
|
+
const fullPath = this.resolve(filepath);
|
|
38
|
+
await fs.promises.access(fullPath);
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async isDirectory(filepath) {
|
|
46
|
+
try {
|
|
47
|
+
const fullPath = this.resolve(filepath);
|
|
48
|
+
const stats = await fs.promises.stat(fullPath);
|
|
49
|
+
return stats.isDirectory();
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async isFile(filepath) {
|
|
56
|
+
try {
|
|
57
|
+
const fullPath = this.resolve(filepath);
|
|
58
|
+
const stats = await fs.promises.stat(fullPath);
|
|
59
|
+
return stats.isFile();
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async readFile(filepath) {
|
|
66
|
+
const fullPath = this.resolve(filepath);
|
|
67
|
+
return fs.promises.readFile(fullPath, 'utf-8');
|
|
68
|
+
}
|
|
69
|
+
async writeFile(filepath, content) {
|
|
70
|
+
const fullPath = this.resolve(filepath);
|
|
71
|
+
const dir = path.dirname(fullPath);
|
|
72
|
+
// Ensure directory exists
|
|
73
|
+
await fs.promises.mkdir(dir, { recursive: true });
|
|
74
|
+
await fs.promises.writeFile(fullPath, content, 'utf-8');
|
|
75
|
+
}
|
|
76
|
+
async readDir(dirpath) {
|
|
77
|
+
const fullPath = this.resolve(dirpath);
|
|
78
|
+
const entries = await fs.promises.readdir(fullPath, { withFileTypes: true });
|
|
79
|
+
return entries.map(entry => ({
|
|
80
|
+
name: entry.name,
|
|
81
|
+
path: path.join(dirpath, entry.name),
|
|
82
|
+
isDirectory: entry.isDirectory(),
|
|
83
|
+
isFile: entry.isFile()
|
|
84
|
+
}));
|
|
85
|
+
}
|
|
86
|
+
async scanDir(dirpath, options = {}) {
|
|
87
|
+
const { maxDepth = 5, ignorePatterns = DEFAULT_IGNORE_PATTERNS, includeHidden = false } = options;
|
|
88
|
+
const results = [];
|
|
89
|
+
const scan = async (currentPath, depth) => {
|
|
90
|
+
if (depth > maxDepth)
|
|
91
|
+
return;
|
|
92
|
+
try {
|
|
93
|
+
const entries = await this.readDir(currentPath);
|
|
94
|
+
for (const entry of entries) {
|
|
95
|
+
// Skip hidden files unless requested
|
|
96
|
+
if (!includeHidden && entry.name.startsWith('.'))
|
|
97
|
+
continue;
|
|
98
|
+
// Skip ignored patterns
|
|
99
|
+
if (ignorePatterns.some(pattern => entry.name === pattern))
|
|
100
|
+
continue;
|
|
101
|
+
results.push(entry);
|
|
102
|
+
if (entry.isDirectory) {
|
|
103
|
+
await scan(entry.path, depth + 1);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
// Directory may not exist or be inaccessible
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
await scan(dirpath, 0);
|
|
112
|
+
return results;
|
|
113
|
+
}
|
|
114
|
+
async stat(filepath) {
|
|
115
|
+
try {
|
|
116
|
+
const fullPath = this.resolve(filepath);
|
|
117
|
+
const stats = await fs.promises.stat(fullPath);
|
|
118
|
+
return {
|
|
119
|
+
name: path.basename(filepath),
|
|
120
|
+
path: filepath,
|
|
121
|
+
isDirectory: stats.isDirectory(),
|
|
122
|
+
isFile: stats.isFile(),
|
|
123
|
+
size: stats.size,
|
|
124
|
+
modifiedAt: stats.mtime
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
resolve(...paths) {
|
|
132
|
+
if (paths.length === 0)
|
|
133
|
+
return this.basePath;
|
|
134
|
+
const firstPath = paths[0];
|
|
135
|
+
if (path.isAbsolute(firstPath)) {
|
|
136
|
+
return path.resolve(...paths);
|
|
137
|
+
}
|
|
138
|
+
return path.resolve(this.basePath, ...paths);
|
|
139
|
+
}
|
|
140
|
+
join(...paths) {
|
|
141
|
+
return path.join(...paths);
|
|
142
|
+
}
|
|
143
|
+
getBasePath() {
|
|
144
|
+
return this.basePath;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
export class MockProjectFs {
|
|
148
|
+
basePath;
|
|
149
|
+
files;
|
|
150
|
+
constructor(basePath = '/mock/project', initialFiles) {
|
|
151
|
+
this.basePath = basePath;
|
|
152
|
+
this.files = new Map(Object.entries(initialFiles || {}));
|
|
153
|
+
}
|
|
154
|
+
addFile(filepath, content) {
|
|
155
|
+
this.files.set(filepath, { content, isDirectory: false });
|
|
156
|
+
}
|
|
157
|
+
addDirectory(dirpath) {
|
|
158
|
+
this.files.set(dirpath, { isDirectory: true });
|
|
159
|
+
}
|
|
160
|
+
async exists(filepath) {
|
|
161
|
+
const resolved = this.resolve(filepath);
|
|
162
|
+
return this.files.has(resolved) || this.hasChildrenAt(resolved);
|
|
163
|
+
}
|
|
164
|
+
async isDirectory(filepath) {
|
|
165
|
+
const resolved = this.resolve(filepath);
|
|
166
|
+
const entry = this.files.get(resolved);
|
|
167
|
+
if (entry?.isDirectory)
|
|
168
|
+
return true;
|
|
169
|
+
return this.hasChildrenAt(resolved);
|
|
170
|
+
}
|
|
171
|
+
async isFile(filepath) {
|
|
172
|
+
const resolved = this.resolve(filepath);
|
|
173
|
+
const entry = this.files.get(resolved);
|
|
174
|
+
return entry?.content !== undefined;
|
|
175
|
+
}
|
|
176
|
+
async readFile(filepath) {
|
|
177
|
+
const resolved = this.resolve(filepath);
|
|
178
|
+
const entry = this.files.get(resolved);
|
|
179
|
+
if (!entry?.content) {
|
|
180
|
+
throw new Error(`ENOENT: no such file: ${resolved}`);
|
|
181
|
+
}
|
|
182
|
+
return entry.content;
|
|
183
|
+
}
|
|
184
|
+
async writeFile(filepath, content) {
|
|
185
|
+
const resolved = this.resolve(filepath);
|
|
186
|
+
this.files.set(resolved, { content, isDirectory: false });
|
|
187
|
+
}
|
|
188
|
+
async readDir(dirpath) {
|
|
189
|
+
const resolved = this.resolve(dirpath);
|
|
190
|
+
const results = [];
|
|
191
|
+
const seen = new Set();
|
|
192
|
+
for (const [filePath, entry] of this.files) {
|
|
193
|
+
if (filePath.startsWith(resolved + '/')) {
|
|
194
|
+
const relativePath = filePath.slice(resolved.length + 1);
|
|
195
|
+
const parts = relativePath.split('/');
|
|
196
|
+
const name = parts[0];
|
|
197
|
+
if (!seen.has(name)) {
|
|
198
|
+
seen.add(name);
|
|
199
|
+
results.push({
|
|
200
|
+
name,
|
|
201
|
+
path: path.join(dirpath, name),
|
|
202
|
+
isDirectory: parts.length > 1 || entry.isDirectory === true,
|
|
203
|
+
isFile: parts.length === 1 && entry.content !== undefined
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return results;
|
|
209
|
+
}
|
|
210
|
+
async scanDir(dirpath, options = {}) {
|
|
211
|
+
const { maxDepth = 5, ignorePatterns = [], includeHidden = false } = options;
|
|
212
|
+
const results = [];
|
|
213
|
+
const scan = async (currentPath, depth) => {
|
|
214
|
+
if (depth > maxDepth)
|
|
215
|
+
return;
|
|
216
|
+
const entries = await this.readDir(currentPath);
|
|
217
|
+
for (const entry of entries) {
|
|
218
|
+
if (!includeHidden && entry.name.startsWith('.'))
|
|
219
|
+
continue;
|
|
220
|
+
if (ignorePatterns.some(p => entry.name === p))
|
|
221
|
+
continue;
|
|
222
|
+
results.push(entry);
|
|
223
|
+
if (entry.isDirectory) {
|
|
224
|
+
await scan(entry.path, depth + 1);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
await scan(dirpath, 0);
|
|
229
|
+
return results;
|
|
230
|
+
}
|
|
231
|
+
async stat(filepath) {
|
|
232
|
+
const resolved = this.resolve(filepath);
|
|
233
|
+
const entry = this.files.get(resolved);
|
|
234
|
+
if (!entry && !this.hasChildrenAt(resolved))
|
|
235
|
+
return null;
|
|
236
|
+
return {
|
|
237
|
+
name: path.basename(filepath),
|
|
238
|
+
path: filepath,
|
|
239
|
+
isDirectory: entry?.isDirectory === true || this.hasChildrenAt(resolved),
|
|
240
|
+
isFile: entry?.content !== undefined,
|
|
241
|
+
size: entry?.content?.length || 0
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
resolve(...paths) {
|
|
245
|
+
if (paths.length === 0)
|
|
246
|
+
return this.basePath;
|
|
247
|
+
const firstPath = paths[0];
|
|
248
|
+
if (path.isAbsolute(firstPath)) {
|
|
249
|
+
return path.resolve(...paths);
|
|
250
|
+
}
|
|
251
|
+
return path.resolve(this.basePath, ...paths);
|
|
252
|
+
}
|
|
253
|
+
join(...paths) {
|
|
254
|
+
return path.join(...paths);
|
|
255
|
+
}
|
|
256
|
+
getBasePath() {
|
|
257
|
+
return this.basePath;
|
|
258
|
+
}
|
|
259
|
+
hasChildrenAt(dirpath) {
|
|
260
|
+
for (const filePath of this.files.keys()) {
|
|
261
|
+
if (filePath.startsWith(dirpath + '/')) {
|
|
262
|
+
return true;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return false;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
// ============================================================================
|
|
269
|
+
// Factory & Default Instance
|
|
270
|
+
// ============================================================================
|
|
271
|
+
let defaultFs = null;
|
|
272
|
+
export function createProjectFs(basePath) {
|
|
273
|
+
return new RealProjectFs(basePath);
|
|
274
|
+
}
|
|
275
|
+
export function getProjectFs() {
|
|
276
|
+
if (!defaultFs) {
|
|
277
|
+
defaultFs = createProjectFs();
|
|
278
|
+
}
|
|
279
|
+
return defaultFs;
|
|
280
|
+
}
|
|
281
|
+
export function setProjectFs(fs) {
|
|
282
|
+
defaultFs = fs;
|
|
283
|
+
}
|
|
284
|
+
export function resetProjectFs() {
|
|
285
|
+
defaultFs = null;
|
|
286
|
+
}
|
|
287
|
+
//# sourceMappingURL=projectFs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectFs.js","sourceRoot":"","sources":["../../src/services/projectFs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configurable Rules Engine
|
|
3
|
+
* Dynamic rule loading, validation, and configuration
|
|
4
|
+
* @version 3.7.0
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
/** Rule severity levels */
|
|
8
|
+
export declare const RuleSeveritySchema: z.ZodEnum<["error", "warning", "info", "suggestion"]>;
|
|
9
|
+
export type RuleSeverity = z.infer<typeof RuleSeveritySchema>;
|
|
10
|
+
/** Rule categories */
|
|
11
|
+
export declare const RuleCategorySchema: z.ZodEnum<["security", "performance", "best-practices", "maintainability", "architecture", "accessibility", "code-style"]>;
|
|
12
|
+
export type RuleCategory = z.infer<typeof RuleCategorySchema>;
|
|
13
|
+
/** Full rule definition schema */
|
|
14
|
+
export declare const RuleDefinitionSchema: z.ZodObject<{
|
|
15
|
+
id: z.ZodString;
|
|
16
|
+
name: z.ZodString;
|
|
17
|
+
description: z.ZodString;
|
|
18
|
+
category: z.ZodEnum<["security", "performance", "best-practices", "maintainability", "architecture", "accessibility", "code-style"]>;
|
|
19
|
+
severity: z.ZodEnum<["error", "warning", "info", "suggestion"]>;
|
|
20
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
21
|
+
languages: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
22
|
+
filePatterns: z.ZodOptional<z.ZodArray<z.ZodEffects<z.ZodString, string, string>, "many">>;
|
|
23
|
+
pattern: z.ZodEffects<z.ZodOptional<z.ZodString>, string | undefined, string | undefined>;
|
|
24
|
+
astQuery: z.ZodOptional<z.ZodString>;
|
|
25
|
+
message: z.ZodString;
|
|
26
|
+
suggestion: z.ZodOptional<z.ZodString>;
|
|
27
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
28
|
+
source: z.ZodDefault<z.ZodEnum<["builtin", "custom", "plugin"]>>;
|
|
29
|
+
version: z.ZodOptional<z.ZodString>;
|
|
30
|
+
autoFix: z.ZodOptional<z.ZodObject<{
|
|
31
|
+
replacement: z.ZodString;
|
|
32
|
+
description: z.ZodString;
|
|
33
|
+
}, "strip", z.ZodTypeAny, {
|
|
34
|
+
description: string;
|
|
35
|
+
replacement: string;
|
|
36
|
+
}, {
|
|
37
|
+
description: string;
|
|
38
|
+
replacement: string;
|
|
39
|
+
}>>;
|
|
40
|
+
}, "strip", z.ZodTypeAny, {
|
|
41
|
+
id: string;
|
|
42
|
+
name: string;
|
|
43
|
+
category: "best-practices" | "security" | "performance" | "architecture" | "accessibility" | "maintainability" | "code-style";
|
|
44
|
+
description: string;
|
|
45
|
+
enabled: boolean;
|
|
46
|
+
message: string;
|
|
47
|
+
source: "custom" | "builtin" | "plugin";
|
|
48
|
+
severity: "error" | "warning" | "info" | "suggestion";
|
|
49
|
+
suggestion?: string | undefined;
|
|
50
|
+
pattern?: string | undefined;
|
|
51
|
+
version?: string | undefined;
|
|
52
|
+
languages?: string[] | undefined;
|
|
53
|
+
tags?: string[] | undefined;
|
|
54
|
+
autoFix?: {
|
|
55
|
+
description: string;
|
|
56
|
+
replacement: string;
|
|
57
|
+
} | undefined;
|
|
58
|
+
filePatterns?: string[] | undefined;
|
|
59
|
+
astQuery?: string | undefined;
|
|
60
|
+
}, {
|
|
61
|
+
id: string;
|
|
62
|
+
name: string;
|
|
63
|
+
category: "best-practices" | "security" | "performance" | "architecture" | "accessibility" | "maintainability" | "code-style";
|
|
64
|
+
description: string;
|
|
65
|
+
message: string;
|
|
66
|
+
severity: "error" | "warning" | "info" | "suggestion";
|
|
67
|
+
suggestion?: string | undefined;
|
|
68
|
+
pattern?: string | undefined;
|
|
69
|
+
enabled?: boolean | undefined;
|
|
70
|
+
version?: string | undefined;
|
|
71
|
+
languages?: string[] | undefined;
|
|
72
|
+
source?: "custom" | "builtin" | "plugin" | undefined;
|
|
73
|
+
tags?: string[] | undefined;
|
|
74
|
+
autoFix?: {
|
|
75
|
+
description: string;
|
|
76
|
+
replacement: string;
|
|
77
|
+
} | undefined;
|
|
78
|
+
filePatterns?: string[] | undefined;
|
|
79
|
+
astQuery?: string | undefined;
|
|
80
|
+
}>;
|
|
81
|
+
export type RuleDefinition = z.infer<typeof RuleDefinitionSchema>;
|
|
82
|
+
/** Rule override (partial update) */
|
|
83
|
+
export declare const RuleOverrideSchema: z.ZodObject<{
|
|
84
|
+
enabled: z.ZodOptional<z.ZodBoolean>;
|
|
85
|
+
severity: z.ZodOptional<z.ZodEnum<["error", "warning", "info", "suggestion"]>>;
|
|
86
|
+
message: z.ZodOptional<z.ZodString>;
|
|
87
|
+
}, "strict", z.ZodTypeAny, {
|
|
88
|
+
enabled?: boolean | undefined;
|
|
89
|
+
message?: string | undefined;
|
|
90
|
+
severity?: "error" | "warning" | "info" | "suggestion" | undefined;
|
|
91
|
+
}, {
|
|
92
|
+
enabled?: boolean | undefined;
|
|
93
|
+
message?: string | undefined;
|
|
94
|
+
severity?: "error" | "warning" | "info" | "suggestion" | undefined;
|
|
95
|
+
}>;
|
|
96
|
+
export type RuleOverride = z.infer<typeof RuleOverrideSchema>;
|
|
97
|
+
export interface RuleConfig {
|
|
98
|
+
version: string;
|
|
99
|
+
rules: RuleDefinition[];
|
|
100
|
+
overrides: Record<string, RuleOverride>;
|
|
101
|
+
disabledCategories: RuleCategory[];
|
|
102
|
+
disabledRules: string[];
|
|
103
|
+
settings: RuleEngineSettings;
|
|
104
|
+
}
|
|
105
|
+
export interface RuleEngineSettings {
|
|
106
|
+
maxIssuesPerFile: number;
|
|
107
|
+
maxIssuesTotal: number;
|
|
108
|
+
failOnError: boolean;
|
|
109
|
+
failOnWarning: boolean;
|
|
110
|
+
autoFix: boolean;
|
|
111
|
+
verboseOutput: boolean;
|
|
112
|
+
}
|
|
113
|
+
declare class RulesRegistry {
|
|
114
|
+
private builtinRules;
|
|
115
|
+
private customRules;
|
|
116
|
+
private overrides;
|
|
117
|
+
private disabledCategories;
|
|
118
|
+
private disabledRules;
|
|
119
|
+
private settings;
|
|
120
|
+
constructor();
|
|
121
|
+
/**
|
|
122
|
+
* Register a builtin rule
|
|
123
|
+
*/
|
|
124
|
+
registerBuiltin(rule: RuleDefinition): this;
|
|
125
|
+
/**
|
|
126
|
+
* Register multiple builtin rules
|
|
127
|
+
*/
|
|
128
|
+
registerBuiltinRules(rules: RuleDefinition[]): this;
|
|
129
|
+
/**
|
|
130
|
+
* Add a custom rule
|
|
131
|
+
*/
|
|
132
|
+
addCustomRule(rule: RuleDefinition): {
|
|
133
|
+
success: boolean;
|
|
134
|
+
error?: string;
|
|
135
|
+
};
|
|
136
|
+
/**
|
|
137
|
+
* Remove a custom rule
|
|
138
|
+
*/
|
|
139
|
+
removeCustomRule(ruleId: string): boolean;
|
|
140
|
+
/**
|
|
141
|
+
* Override a rule's properties
|
|
142
|
+
*/
|
|
143
|
+
setOverride(ruleId: string, override: RuleOverride): {
|
|
144
|
+
success: boolean;
|
|
145
|
+
error?: string;
|
|
146
|
+
};
|
|
147
|
+
/**
|
|
148
|
+
* Remove a rule override
|
|
149
|
+
*/
|
|
150
|
+
removeOverride(ruleId: string): boolean;
|
|
151
|
+
/**
|
|
152
|
+
* Enable/disable a specific rule
|
|
153
|
+
*/
|
|
154
|
+
setRuleEnabled(ruleId: string, enabled: boolean): boolean;
|
|
155
|
+
/**
|
|
156
|
+
* Enable/disable a category
|
|
157
|
+
*/
|
|
158
|
+
setCategoryEnabled(category: RuleCategory, enabled: boolean): boolean;
|
|
159
|
+
/**
|
|
160
|
+
* Update settings
|
|
161
|
+
*/
|
|
162
|
+
updateSettings(settings: Partial<RuleEngineSettings>): void;
|
|
163
|
+
/**
|
|
164
|
+
* Get a rule by ID (with overrides applied)
|
|
165
|
+
*/
|
|
166
|
+
getRule(ruleId: string): RuleDefinition | null;
|
|
167
|
+
/**
|
|
168
|
+
* Get all rules (with filters)
|
|
169
|
+
*/
|
|
170
|
+
getRules(options?: {
|
|
171
|
+
category?: RuleCategory;
|
|
172
|
+
severity?: RuleSeverity;
|
|
173
|
+
language?: string;
|
|
174
|
+
enabledOnly?: boolean;
|
|
175
|
+
source?: 'builtin' | 'custom' | 'all';
|
|
176
|
+
}): RuleDefinition[];
|
|
177
|
+
/**
|
|
178
|
+
* Get rules for a specific file
|
|
179
|
+
*/
|
|
180
|
+
getRulesForFile(filePath: string, language?: string): RuleDefinition[];
|
|
181
|
+
/**
|
|
182
|
+
* Get settings
|
|
183
|
+
*/
|
|
184
|
+
getSettings(): RuleEngineSettings;
|
|
185
|
+
/**
|
|
186
|
+
* Get statistics
|
|
187
|
+
*/
|
|
188
|
+
getStats(): {
|
|
189
|
+
totalBuiltin: number;
|
|
190
|
+
totalCustom: number;
|
|
191
|
+
enabled: number;
|
|
192
|
+
disabled: number;
|
|
193
|
+
overridden: number;
|
|
194
|
+
byCategory: Record<string, number>;
|
|
195
|
+
bySeverity: Record<string, number>;
|
|
196
|
+
};
|
|
197
|
+
private saveToStorage;
|
|
198
|
+
private loadFromStorage;
|
|
199
|
+
/**
|
|
200
|
+
* Reset to defaults
|
|
201
|
+
*/
|
|
202
|
+
reset(): void;
|
|
203
|
+
/**
|
|
204
|
+
* Full reset including builtin rules (for testing)
|
|
205
|
+
*/
|
|
206
|
+
resetAll(): void;
|
|
207
|
+
/**
|
|
208
|
+
* Export configuration
|
|
209
|
+
*/
|
|
210
|
+
exportConfig(): RuleConfig;
|
|
211
|
+
/**
|
|
212
|
+
* Import configuration
|
|
213
|
+
*/
|
|
214
|
+
importConfig(config: RuleConfig): {
|
|
215
|
+
success: boolean;
|
|
216
|
+
imported: number;
|
|
217
|
+
errors: string[];
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
export declare const rulesRegistry: RulesRegistry;
|
|
221
|
+
export declare function registerBuiltinRule(rule: RuleDefinition): void;
|
|
222
|
+
export declare function registerBuiltinRules(rules: RuleDefinition[]): void;
|
|
223
|
+
export declare function addCustomRule(rule: RuleDefinition): {
|
|
224
|
+
success: boolean;
|
|
225
|
+
error?: string;
|
|
226
|
+
};
|
|
227
|
+
export declare function removeCustomRule(ruleId: string): boolean;
|
|
228
|
+
export declare function getRule(ruleId: string): RuleDefinition | null;
|
|
229
|
+
export declare function getRules(options?: Parameters<RulesRegistry['getRules']>[0]): RuleDefinition[];
|
|
230
|
+
export declare function getRulesForFile(filePath: string, language?: string): RuleDefinition[];
|
|
231
|
+
export declare function setRuleEnabled(ruleId: string, enabled: boolean): boolean;
|
|
232
|
+
export declare function setRuleOverride(ruleId: string, override: RuleOverride): {
|
|
233
|
+
success: boolean;
|
|
234
|
+
error?: string;
|
|
235
|
+
};
|
|
236
|
+
export declare function getRuleSettings(): RuleEngineSettings;
|
|
237
|
+
export declare function updateRuleSettings(settings: Partial<RuleEngineSettings>): void;
|
|
238
|
+
export declare function getRuleStats(): {
|
|
239
|
+
totalBuiltin: number;
|
|
240
|
+
totalCustom: number;
|
|
241
|
+
enabled: number;
|
|
242
|
+
disabled: number;
|
|
243
|
+
overridden: number;
|
|
244
|
+
byCategory: Record<string, number>;
|
|
245
|
+
bySeverity: Record<string, number>;
|
|
246
|
+
};
|
|
247
|
+
export declare function resetRulesEngine(): void;
|
|
248
|
+
export declare function exportRulesConfig(): RuleConfig;
|
|
249
|
+
export declare function importRulesConfig(config: RuleConfig): {
|
|
250
|
+
success: boolean;
|
|
251
|
+
imported: number;
|
|
252
|
+
errors: string[];
|
|
253
|
+
};
|
|
254
|
+
export {};
|
|
255
|
+
//# sourceMappingURL=rulesEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rulesEngine.d.ts","sourceRoot":"","sources":["../../src/services/rulesEngine.ts"],"names":[],"mappings":"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"}
|