@stackguide/mcp-server 3.2.0 → 3.8.1
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 +315 -9
- 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/analyze.d.ts +11 -0
- package/dist/handlers/analyze.d.ts.map +1 -0
- package/dist/handlers/analyze.js +274 -0
- package/dist/handlers/analyze.js.map +1 -0
- 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/index.d.ts +1 -0
- package/dist/handlers/index.d.ts.map +1 -1
- package/dist/handlers/index.js +1 -0
- package/dist/handlers/index.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 +225 -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 +18 -1
- 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/handlers/setup.d.ts +1 -0
- package/dist/handlers/setup.d.ts.map +1 -1
- package/dist/handlers/setup.js +42 -0
- package/dist/handlers/setup.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29 -417
- 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/configGenerator.d.ts +28 -0
- package/dist/services/intelligence/configGenerator.d.ts.map +1 -0
- package/dist/services/intelligence/configGenerator.js +404 -0
- package/dist/services/intelligence/configGenerator.js.map +1 -0
- package/dist/services/intelligence/dependencyAdvisor.d.ts +24 -0
- package/dist/services/intelligence/dependencyAdvisor.d.ts.map +1 -0
- package/dist/services/intelligence/dependencyAdvisor.js +404 -0
- package/dist/services/intelligence/dependencyAdvisor.js.map +1 -0
- package/dist/services/intelligence/index.d.ts +12 -0
- package/dist/services/intelligence/index.d.ts.map +1 -0
- package/dist/services/intelligence/index.js +16 -0
- package/dist/services/intelligence/index.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/intelligence/projectIntelligence.d.ts +26 -0
- package/dist/services/intelligence/projectIntelligence.d.ts.map +1 -0
- package/dist/services/intelligence/projectIntelligence.js +344 -0
- package/dist/services/intelligence/projectIntelligence.js.map +1 -0
- package/dist/services/intelligence/structureAnalyzer.d.ts +27 -0
- package/dist/services/intelligence/structureAnalyzer.d.ts.map +1 -0
- package/dist/services/intelligence/structureAnalyzer.js +286 -0
- package/dist/services/intelligence/structureAnalyzer.js.map +1 -0
- package/dist/services/intelligence/templates.d.ts +22 -0
- package/dist/services/intelligence/templates.d.ts.map +1 -0
- package/dist/services/intelligence/templates.js +521 -0
- package/dist/services/intelligence/templates.js.map +1 -0
- package/dist/services/intelligence/types.d.ts +222 -0
- package/dist/services/intelligence/types.d.ts.map +1 -0
- package/dist/services/intelligence/types.js +7 -0
- package/dist/services/intelligence/types.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 +483 -0
- package/dist/services/rulesEngine.js.map +1 -0
- package/dist/services/webDocumentation.d.ts +9 -0
- package/dist/services/webDocumentation.d.ts.map +1 -1
- package/dist/services/webDocumentation.js +144 -1
- 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/tools/definitions.d.ts +87 -0
- package/dist/tools/definitions.d.ts.map +1 -1
- package/dist/tools/definitions.js +34 -0
- package/dist/tools/definitions.js.map +1 -1
- 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/validation.d.ts +3 -3
- 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 +341 -0
- package/dist/validation/schemas.d.ts.map +1 -0
- package/dist/validation/schemas.js +244 -0
- package/dist/validation/schemas.js.map +1 -0
- package/package.json +9 -2
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for Project Intelligence System
|
|
3
|
+
* Auto-Configuration Intelligence - Phase 4
|
|
4
|
+
* @version 3.3.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Project structure analysis result
|
|
8
|
+
*/
|
|
9
|
+
export interface StructureAnalysis {
|
|
10
|
+
/** Root directory of the project */
|
|
11
|
+
rootPath: string;
|
|
12
|
+
/** Detected project type */
|
|
13
|
+
projectType: string;
|
|
14
|
+
/** Overall structure health score (0-100) */
|
|
15
|
+
structureScore: number;
|
|
16
|
+
/** Existing directories */
|
|
17
|
+
existingDirs: string[];
|
|
18
|
+
/** Missing recommended directories */
|
|
19
|
+
missingDirs: DirectorySuggestion[];
|
|
20
|
+
/** Existing key files */
|
|
21
|
+
existingFiles: string[];
|
|
22
|
+
/** Missing recommended files */
|
|
23
|
+
missingFiles: FileSuggestion[];
|
|
24
|
+
/** Structure improvements */
|
|
25
|
+
improvements: StructureImprovement[];
|
|
26
|
+
}
|
|
27
|
+
export interface DirectorySuggestion {
|
|
28
|
+
path: string;
|
|
29
|
+
purpose: string;
|
|
30
|
+
priority: 'high' | 'medium' | 'low';
|
|
31
|
+
template?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface FileSuggestion {
|
|
34
|
+
path: string;
|
|
35
|
+
purpose: string;
|
|
36
|
+
priority: 'high' | 'medium' | 'low';
|
|
37
|
+
template?: string;
|
|
38
|
+
content?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface StructureImprovement {
|
|
41
|
+
type: 'reorganize' | 'create' | 'rename' | 'move';
|
|
42
|
+
description: string;
|
|
43
|
+
priority: 'high' | 'medium' | 'low';
|
|
44
|
+
from?: string;
|
|
45
|
+
to?: string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Configuration analysis and generation
|
|
49
|
+
*/
|
|
50
|
+
export interface ConfigAnalysis {
|
|
51
|
+
/** Existing configuration files */
|
|
52
|
+
existingConfigs: ConfigFile[];
|
|
53
|
+
/** Recommended configurations */
|
|
54
|
+
recommendedConfigs: ConfigRecommendation[];
|
|
55
|
+
/** Configuration issues found */
|
|
56
|
+
issues: ConfigIssue[];
|
|
57
|
+
/** Overall config health score */
|
|
58
|
+
configScore: number;
|
|
59
|
+
}
|
|
60
|
+
export interface ConfigFile {
|
|
61
|
+
path: string;
|
|
62
|
+
type: ConfigType;
|
|
63
|
+
isValid: boolean;
|
|
64
|
+
settings: Record<string, unknown>;
|
|
65
|
+
issues?: string[];
|
|
66
|
+
}
|
|
67
|
+
export type ConfigType = 'eslint' | 'prettier' | 'tsconfig' | 'jest' | 'vitest' | 'babel' | 'webpack' | 'vite' | 'rollup' | 'docker' | 'github-actions' | 'editorconfig' | 'gitignore' | 'env' | 'package-json' | 'pyproject' | 'cargo' | 'go-mod' | 'other';
|
|
68
|
+
export interface ConfigRecommendation {
|
|
69
|
+
type: ConfigType;
|
|
70
|
+
filename: string;
|
|
71
|
+
description: string;
|
|
72
|
+
priority: 'critical' | 'high' | 'medium' | 'low';
|
|
73
|
+
suggestedContent: string;
|
|
74
|
+
reason: string;
|
|
75
|
+
}
|
|
76
|
+
export interface ConfigIssue {
|
|
77
|
+
file: string;
|
|
78
|
+
type: ConfigType;
|
|
79
|
+
severity: 'error' | 'warning' | 'info';
|
|
80
|
+
message: string;
|
|
81
|
+
suggestion: string;
|
|
82
|
+
autoFixable: boolean;
|
|
83
|
+
fix?: ConfigFix;
|
|
84
|
+
}
|
|
85
|
+
export interface ConfigFix {
|
|
86
|
+
type: 'add' | 'remove' | 'modify';
|
|
87
|
+
path: string;
|
|
88
|
+
key?: string;
|
|
89
|
+
value?: unknown;
|
|
90
|
+
description: string;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Dependency analysis
|
|
94
|
+
*/
|
|
95
|
+
export interface DependencyAnalysis {
|
|
96
|
+
/** Package manager detected */
|
|
97
|
+
packageManager: 'npm' | 'yarn' | 'pnpm' | 'pip' | 'poetry' | 'cargo' | 'go' | 'bundler' | 'composer' | 'unknown';
|
|
98
|
+
/** Total dependencies count */
|
|
99
|
+
totalDependencies: number;
|
|
100
|
+
/** Direct dependencies */
|
|
101
|
+
directDependencies: DependencyInfo[];
|
|
102
|
+
/** Dev dependencies */
|
|
103
|
+
devDependencies: DependencyInfo[];
|
|
104
|
+
/** Outdated packages */
|
|
105
|
+
outdatedPackages: OutdatedPackage[];
|
|
106
|
+
/** Security vulnerabilities (if detectable) */
|
|
107
|
+
vulnerabilities: VulnerabilityInfo[];
|
|
108
|
+
/** Missing recommended dependencies */
|
|
109
|
+
recommendedAdditions: DependencyRecommendation[];
|
|
110
|
+
/** Unnecessary dependencies */
|
|
111
|
+
unnecessaryDependencies: string[];
|
|
112
|
+
/** Dependency health score */
|
|
113
|
+
dependencyScore: number;
|
|
114
|
+
}
|
|
115
|
+
export interface DependencyInfo {
|
|
116
|
+
name: string;
|
|
117
|
+
version: string;
|
|
118
|
+
type: 'production' | 'dev' | 'peer' | 'optional';
|
|
119
|
+
isLocal?: boolean;
|
|
120
|
+
}
|
|
121
|
+
export interface OutdatedPackage {
|
|
122
|
+
name: string;
|
|
123
|
+
currentVersion: string;
|
|
124
|
+
latestVersion: string;
|
|
125
|
+
type: 'major' | 'minor' | 'patch';
|
|
126
|
+
breaking: boolean;
|
|
127
|
+
}
|
|
128
|
+
export interface VulnerabilityInfo {
|
|
129
|
+
package: string;
|
|
130
|
+
severity: 'critical' | 'high' | 'medium' | 'low';
|
|
131
|
+
title: string;
|
|
132
|
+
fixedIn?: string;
|
|
133
|
+
url?: string;
|
|
134
|
+
}
|
|
135
|
+
export interface DependencyRecommendation {
|
|
136
|
+
name: string;
|
|
137
|
+
version?: string;
|
|
138
|
+
reason: string;
|
|
139
|
+
category: 'linting' | 'testing' | 'security' | 'performance' | 'dx' | 'types';
|
|
140
|
+
priority: 'high' | 'medium' | 'low';
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Full project intelligence report
|
|
144
|
+
*/
|
|
145
|
+
export interface IntelligenceReport {
|
|
146
|
+
/** Analysis timestamp */
|
|
147
|
+
timestamp: string;
|
|
148
|
+
/** Project path */
|
|
149
|
+
projectPath: string;
|
|
150
|
+
/** Detected project type */
|
|
151
|
+
projectType: string;
|
|
152
|
+
/** Detection confidence */
|
|
153
|
+
confidence: 'high' | 'medium' | 'low';
|
|
154
|
+
/** Overall intelligence score (0-100) */
|
|
155
|
+
overallScore: number;
|
|
156
|
+
/** Grade based on score */
|
|
157
|
+
grade: 'A' | 'B' | 'C' | 'D' | 'F';
|
|
158
|
+
/** Structure analysis */
|
|
159
|
+
structure: StructureAnalysis;
|
|
160
|
+
/** Configuration analysis */
|
|
161
|
+
configuration: ConfigAnalysis;
|
|
162
|
+
/** Dependency analysis */
|
|
163
|
+
dependencies: DependencyAnalysis;
|
|
164
|
+
/** Top priority actions */
|
|
165
|
+
priorityActions: PriorityAction[];
|
|
166
|
+
/** Suggested workflow */
|
|
167
|
+
suggestedWorkflow: WorkflowStep[];
|
|
168
|
+
/** Estimated effort to achieve optimal state */
|
|
169
|
+
estimatedEffort: 'minimal' | 'moderate' | 'significant';
|
|
170
|
+
}
|
|
171
|
+
export interface PriorityAction {
|
|
172
|
+
id: string;
|
|
173
|
+
category: 'structure' | 'config' | 'dependencies' | 'security';
|
|
174
|
+
priority: 'critical' | 'high' | 'medium' | 'low';
|
|
175
|
+
title: string;
|
|
176
|
+
description: string;
|
|
177
|
+
command?: string;
|
|
178
|
+
autoApplicable: boolean;
|
|
179
|
+
}
|
|
180
|
+
export interface WorkflowStep {
|
|
181
|
+
order: number;
|
|
182
|
+
title: string;
|
|
183
|
+
description: string;
|
|
184
|
+
command?: string;
|
|
185
|
+
estimatedTime: string;
|
|
186
|
+
optional: boolean;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Smart configuration templates
|
|
190
|
+
*/
|
|
191
|
+
export interface SmartConfig {
|
|
192
|
+
type: ConfigType;
|
|
193
|
+
filename: string;
|
|
194
|
+
content: string;
|
|
195
|
+
description: string;
|
|
196
|
+
customizations: ConfigCustomization[];
|
|
197
|
+
}
|
|
198
|
+
export interface ConfigCustomization {
|
|
199
|
+
key: string;
|
|
200
|
+
description: string;
|
|
201
|
+
options: ConfigOption[];
|
|
202
|
+
default: string | boolean | number;
|
|
203
|
+
}
|
|
204
|
+
export interface ConfigOption {
|
|
205
|
+
value: string | boolean | number;
|
|
206
|
+
label: string;
|
|
207
|
+
description: string;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Framework-specific template definitions
|
|
211
|
+
*/
|
|
212
|
+
export interface FrameworkTemplate {
|
|
213
|
+
projectType: string;
|
|
214
|
+
name: string;
|
|
215
|
+
requiredDirs: string[];
|
|
216
|
+
optionalDirs: string[];
|
|
217
|
+
requiredFiles: string[];
|
|
218
|
+
optionalFiles: string[];
|
|
219
|
+
recommendedDependencies: DependencyRecommendation[];
|
|
220
|
+
configTemplates: SmartConfig[];
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/intelligence/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/services/intelligence/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -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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"}
|