snow-flow 2.0.2 → 2.0.3
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/{.claude/mcp-config.json → .mcp.json} +13 -12
- package/.releaserc.json +47 -0
- package/README.md +6 -0
- package/package.json +1 -1
- package/.claude/claude-settings.json +0 -15
- package/.claude/commands/analysis/README.md +0 -9
- package/.claude/commands/automation/README.md +0 -9
- package/.claude/commands/github/README.md +0 -11
- package/.claude/commands/helpers/standard-checkpoint-hooks.sh +0 -179
- package/.claude/commands/hooks/README.md +0 -11
- package/.claude/commands/monitoring/README.md +0 -9
- package/.claude/commands/optimization/README.md +0 -9
- package/.claude/commands/training/README.md +0 -9
- package/.claude/commands/workflows/README.md +0 -9
- package/.claude/config.json +0 -36
- package/.claude/helpers/github-setup.sh +0 -28
- package/.claude/helpers/quick-start.sh +0 -19
- package/.claude/helpers/setup-mcp.sh +0 -18
- package/.claude/settings.json +0 -114
- package/.claude/settings.local.json +0 -33
- package/.claude-flow/metrics/agent-metrics.json +0 -1
- package/.claude-flow/metrics/performance.json +0 -9
- package/.claude-flow/metrics/system-metrics.json +0 -15986
- package/.claude-flow/metrics/task-metrics.json +0 -10
- package/.roo/README.md +0 -402
- package/.roo/mcp-list.txt +0 -257
- package/.roo/mcp.json +0 -32
- package/.roo/workflows/basic-tdd.json +0 -32
- package/.roomodes +0 -201
- package/CLAUDE.md +0 -393
- package/bin/snow-flow.js +0 -3
- package/dist/cli.js.bak +0 -2052
- package/dist/config/snow-flow-config.d.ts +0 -1492
- package/dist/config/snow-flow-config.js +0 -938
- package/scripts/create-env.js +0 -91
- package/scripts/postinstall.js +0 -30
- package/scripts/register-mcp-servers.js +0 -210
- package/scripts/reset-mcp-servers.js +0 -246
- package/scripts/setup-mcp.js +0 -106
- package/scripts/update-version.js +0 -31
- package/src/agents/README.md +0 -192
- package/src/agents/base-agent.ts +0 -251
- package/src/agents/coordinator.ts +0 -971
- package/src/agents/index.ts +0 -18
- package/src/agents/queen-403-handler.ts +0 -230
- package/src/agents/queen-agent.ts +0 -1399
- package/src/agents/script-writer-agent.ts +0 -769
- package/src/agents/security-agent.ts +0 -726
- package/src/agents/widget-creator-agent.ts +0 -568
- package/src/api/error-handling.ts +0 -1758
- package/src/api/natural-language-mapper.ts +0 -630
- package/src/api/performance-optimizer.ts +0 -891
- package/src/api/transaction-manager.ts +0 -754
- package/src/cli/deploy-artifact.ts +0 -304
- package/src/cli/snow-flow-cli-integration.ts +0 -434
- package/src/cli.ts +0 -4455
- package/src/cli.ts.bak +0 -5616
- package/src/compliance/advanced-compliance-system.ts +0 -1268
- package/src/compliance/index.ts +0 -19
- package/src/config/snow-flow-config.ts +0 -1019
- package/src/documentation/index.ts +0 -16
- package/src/documentation/self-documenting-system.ts +0 -1421
- package/src/dynamic-version.ts +0 -44
- package/src/healing/index.ts +0 -20
- package/src/healing/self-healing-system.ts +0 -1435
- package/src/health/README.md +0 -161
- package/src/health/system-health.ts +0 -995
- package/src/index.ts +0 -60
- package/src/intelligence/acl-analyzer.ts +0 -377
- package/src/intelligence/auto-resolution-engine.ts +0 -643
- package/src/intelligence/gap-analysis-engine.ts +0 -488
- package/src/intelligence/manual-instructions-generator.ts +0 -744
- package/src/intelligence/mcp-coverage-analyzer.ts +0 -708
- package/src/intelligence/multi-pass-requirements-analyzer.ts +0 -603
- package/src/intelligence/performance-recommendations-engine.ts +0 -1223
- package/src/intelligence/requirements-analyzer.ts +0 -1148
- package/src/intelligence/task-analyzer.ts +0 -628
- package/src/managers/scope-manager.ts +0 -555
- package/src/mcp/advanced/servicenow-advanced-features-mcp.ts +0 -16110
- package/src/mcp/base-mcp-server.ts +0 -660
- package/src/mcp/http-transport-wrapper.ts +0 -426
- package/src/mcp/service-discovery-client.ts +0 -312
- package/src/mcp/servicenow-automation-mcp-refactored.ts +0 -678
- package/src/mcp/servicenow-automation-mcp.ts +0 -838
- package/src/mcp/servicenow-deployment-mcp-refactored.ts +0 -1292
- package/src/mcp/servicenow-deployment-mcp.ts +0 -7244
- package/src/mcp/servicenow-graph-memory-mcp-refactored.ts +0 -721
- package/src/mcp/servicenow-graph-memory-mcp.ts +0 -832
- package/src/mcp/servicenow-integration-mcp-refactored.ts +0 -655
- package/src/mcp/servicenow-integration-mcp.ts +0 -819
- package/src/mcp/servicenow-intelligent-mcp-refactored.ts +0 -977
- package/src/mcp/servicenow-intelligent-mcp.ts +0 -4638
- package/src/mcp/servicenow-mcp-server.ts +0 -728
- package/src/mcp/servicenow-memory-mcp.ts +0 -474
- package/src/mcp/servicenow-operations-mcp-refactored.ts +0 -1995
- package/src/mcp/servicenow-operations-mcp.ts +0 -3384
- package/src/mcp/servicenow-platform-development-mcp-refactored.ts +0 -611
- package/src/mcp/servicenow-platform-development-mcp.ts +0 -970
- package/src/mcp/servicenow-progressive-indexer.ts +0 -370
- package/src/mcp/servicenow-reporting-analytics-mcp-refactored.ts +0 -695
- package/src/mcp/servicenow-reporting-analytics-mcp.ts +0 -1123
- package/src/mcp/servicenow-security-compliance-mcp-refactored.ts +0 -642
- package/src/mcp/servicenow-security-compliance-mcp.ts +0 -1157
- package/src/mcp/servicenow-update-set-mcp-refactored.ts +0 -751
- package/src/mcp/servicenow-update-set-mcp.ts +0 -811
- package/src/mcp/shared/agent-context-provider.ts +0 -365
- package/src/mcp/shared/base-mcp-server.ts +0 -2463
- package/src/mcp/shared/mcp-memory-manager.ts +0 -540
- package/src/mcp/shared/mcp-resource-manager.ts +0 -367
- package/src/mcp/snow-flow-mcp.ts +0 -911
- package/src/mcp/start-all-mcp-servers.ts +0 -102
- package/src/mcp/start-servicenow-mcp.ts +0 -67
- package/src/monitoring/enhanced-monitoring-system.ts +0 -1345
- package/src/monitoring/performance-tracker.ts +0 -777
- package/src/optimization/cost-optimization-engine.ts +0 -1125
- package/src/optimization/index.ts +0 -10
- package/src/queen/README.md +0 -403
- package/src/queen/agent-factory.ts +0 -574
- package/src/queen/index.ts +0 -94
- package/src/queen/mcp-execution-bridge.ts +0 -681
- package/src/queen/neural-learning.ts +0 -319
- package/src/queen/parallel-agent-engine.ts +0 -848
- package/src/queen/queen-memory-system.ts +0 -490
- package/src/queen/queen-memory.ts +0 -456
- package/src/queen/servicenow-queen.ts +0 -1029
- package/src/queen/types.ts +0 -87
- package/src/rollback/smart-rollback-system.ts +0 -866
- package/src/schemas/deployment.schema.json +0 -58
- package/src/schemas/flow.schema.json +0 -79
- package/src/schemas/widget.schema.json +0 -72
- package/src/snow-flow-system.ts +0 -541
- package/src/sparc/sparc-help.ts +0 -49
- package/src/sparc/team-sparc.ts +0 -88
- package/src/strategies/global-scope-strategy.ts +0 -736
- package/src/templates/base/application.template.json +0 -45
- package/src/templates/base/business_rule.template.json +0 -33
- package/src/templates/base/script_include.template.json +0 -18
- package/src/templates/base/table.template.json +0 -64
- package/src/templates/base/widget.template.json +0 -25
- package/src/templates/patterns/composite.incident-management.template.json +0 -140
- package/src/templates/patterns/widget.dashboard.template.json +0 -238
- package/src/templates/patterns/widget.datatable.template.json +0 -292
- package/src/testing/integration-test-suite.ts +0 -1276
- package/src/types/index.ts +0 -183
- package/src/types/neo4j-driver.d.ts +0 -23
- package/src/types/servicenow.types.ts +0 -307
- package/src/types/snow-flow.types.ts +0 -186
- package/src/types/todo.types.ts +0 -70
- package/src/utils/action-type-cache.ts +0 -286
- package/src/utils/agent-detector.ts +0 -573
- package/src/utils/artifact-tracker.ts +0 -379
- package/src/utils/dependency-detector.ts +0 -233
- package/src/utils/deployment-metadata-handler.ts +0 -518
- package/src/utils/error-recovery.ts +0 -680
- package/src/utils/logger.ts +0 -60
- package/src/utils/mcp-auth-middleware.ts +0 -262
- package/src/utils/mcp-config-manager.ts +0 -270
- package/src/utils/mcp-server-manager.ts +0 -446
- package/src/utils/mcp-tool-registry.ts +0 -298
- package/src/utils/migrate-snow-flow.ts +0 -98
- package/src/utils/oauth-html-templates.ts +0 -188
- package/src/utils/scope-utils.ts +0 -443
- package/src/utils/servicenow-client.ts +0 -3321
- package/src/utils/servicenow-id-generator.ts +0 -181
- package/src/utils/snow-memory-manager.ts +0 -605
- package/src/utils/snow-oauth.ts +0 -797
- package/src/utils/template-engine.ts +0 -463
- package/src/utils/theme-manager.ts +0 -295
- package/src/utils/unified-auth-store.ts +0 -222
- package/src/utils/update-set-importer.ts +0 -422
- package/src/utils/update-set-xml-packager.ts +0 -371
- package/src/utils/widget-template-generator.ts +0 -1744
- package/src/version.ts +0 -1950
|
@@ -1,367 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MCP Resource Manager
|
|
3
|
-
* Comprehensive resource management for MCP servers
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { readFile, readdir, stat } from 'fs/promises';
|
|
7
|
-
import { join, extname, basename } from 'path';
|
|
8
|
-
import { Logger } from '../../utils/logger.js';
|
|
9
|
-
|
|
10
|
-
export interface MCPResource {
|
|
11
|
-
uri: string;
|
|
12
|
-
name: string;
|
|
13
|
-
description?: string;
|
|
14
|
-
mimeType: string;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export interface MCPResourceContent {
|
|
18
|
-
uri: string;
|
|
19
|
-
mimeType: string;
|
|
20
|
-
text: string;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export interface ResourceCategory {
|
|
24
|
-
name: string;
|
|
25
|
-
description: string;
|
|
26
|
-
basePath: string;
|
|
27
|
-
uriPrefix: string;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export class MCPResourceManager {
|
|
31
|
-
private logger: Logger;
|
|
32
|
-
private resourceCache: Map<string, MCPResourceContent> = new Map();
|
|
33
|
-
private resourceIndex: Map<string, MCPResource> = new Map();
|
|
34
|
-
private categories: ResourceCategory[] = [];
|
|
35
|
-
|
|
36
|
-
constructor(serverName: string = 'mcp-server') {
|
|
37
|
-
this.logger = new Logger(`ResourceManager:${serverName}`);
|
|
38
|
-
this.initializeCategories();
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Initialize resource categories
|
|
43
|
-
*/
|
|
44
|
-
private initializeCategories(): void {
|
|
45
|
-
const projectRoot = this.getProjectRoot();
|
|
46
|
-
|
|
47
|
-
this.categories = [
|
|
48
|
-
{
|
|
49
|
-
name: 'templates',
|
|
50
|
-
description: 'ServiceNow artifact templates (widgets, flows, scripts, etc.)',
|
|
51
|
-
basePath: join(projectRoot, 'src/templates'),
|
|
52
|
-
uriPrefix: 'servicenow://templates/'
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
name: 'documentation',
|
|
56
|
-
description: 'Setup guides, deployment documentation, and API references',
|
|
57
|
-
basePath: projectRoot,
|
|
58
|
-
uriPrefix: 'servicenow://docs/'
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
name: 'schemas',
|
|
62
|
-
description: 'Data validation schemas and API schemas',
|
|
63
|
-
basePath: join(projectRoot, 'src/schemas'),
|
|
64
|
-
uriPrefix: 'servicenow://schemas/'
|
|
65
|
-
},
|
|
66
|
-
{
|
|
67
|
-
name: 'examples',
|
|
68
|
-
description: 'Example implementations and sample data',
|
|
69
|
-
basePath: join(projectRoot, 'src/templates/examples'),
|
|
70
|
-
uriPrefix: 'servicenow://examples/'
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
name: 'help',
|
|
74
|
-
description: 'Help content and guidance documents',
|
|
75
|
-
basePath: join(projectRoot, 'src/sparc'),
|
|
76
|
-
uriPrefix: 'servicenow://help/'
|
|
77
|
-
}
|
|
78
|
-
];
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Get project root directory
|
|
83
|
-
*/
|
|
84
|
-
private getProjectRoot(): string {
|
|
85
|
-
// Use process.cwd() to get the current working directory
|
|
86
|
-
// This should be the project root when running the application
|
|
87
|
-
return process.cwd();
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* List all available resources
|
|
92
|
-
*/
|
|
93
|
-
async listResources(): Promise<MCPResource[]> {
|
|
94
|
-
if (this.resourceIndex.size === 0) {
|
|
95
|
-
await this.buildResourceIndex();
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
return Array.from(this.resourceIndex.values());
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Read a specific resource by URI
|
|
103
|
-
*/
|
|
104
|
-
async readResource(uri: string): Promise<MCPResourceContent> {
|
|
105
|
-
this.logger.debug(`Reading resource: ${uri}`);
|
|
106
|
-
|
|
107
|
-
// Check cache first
|
|
108
|
-
if (this.resourceCache.has(uri)) {
|
|
109
|
-
this.logger.debug(`Resource found in cache: ${uri}`);
|
|
110
|
-
return this.resourceCache.get(uri)!;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
// Parse URI and determine file path
|
|
114
|
-
const filePath = this.uriToFilePath(uri);
|
|
115
|
-
if (!filePath) {
|
|
116
|
-
throw new Error(`Invalid resource URI: ${uri}`);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
try {
|
|
120
|
-
const content = await this.loadResourceContent(filePath, uri);
|
|
121
|
-
|
|
122
|
-
// Cache the content
|
|
123
|
-
this.resourceCache.set(uri, content);
|
|
124
|
-
|
|
125
|
-
return content;
|
|
126
|
-
} catch (error) {
|
|
127
|
-
this.logger.error(`Failed to read resource ${uri}:`, error);
|
|
128
|
-
throw new Error(`Resource not found or inaccessible: ${uri}`);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* Build comprehensive resource index
|
|
134
|
-
*/
|
|
135
|
-
private async buildResourceIndex(): Promise<void> {
|
|
136
|
-
this.logger.info('Building resource index...');
|
|
137
|
-
|
|
138
|
-
for (const category of this.categories) {
|
|
139
|
-
try {
|
|
140
|
-
await this.indexCategory(category);
|
|
141
|
-
} catch (error) {
|
|
142
|
-
this.logger.warn(`Failed to index category ${category.name}:`, error);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
this.logger.info(`Resource index built: ${this.resourceIndex.size} resources`);
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/**
|
|
150
|
-
* Index resources in a specific category
|
|
151
|
-
*/
|
|
152
|
-
private async indexCategory(category: ResourceCategory): Promise<void> {
|
|
153
|
-
try {
|
|
154
|
-
const stats = await stat(category.basePath);
|
|
155
|
-
if (!stats.isDirectory()) {
|
|
156
|
-
this.logger.debug(`Category path is not a directory: ${category.basePath}`);
|
|
157
|
-
return;
|
|
158
|
-
}
|
|
159
|
-
} catch (error) {
|
|
160
|
-
this.logger.debug(`Category path does not exist: ${category.basePath}`);
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
if (category.name === 'documentation') {
|
|
165
|
-
await this.indexDocumentationFiles(category);
|
|
166
|
-
} else {
|
|
167
|
-
await this.indexDirectoryRecursive(category.basePath, category);
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
/**
|
|
172
|
-
* Index documentation files (special handling for .md files in root)
|
|
173
|
-
*/
|
|
174
|
-
private async indexDocumentationFiles(category: ResourceCategory): Promise<void> {
|
|
175
|
-
try {
|
|
176
|
-
const files = await readdir(category.basePath);
|
|
177
|
-
|
|
178
|
-
for (const file of files) {
|
|
179
|
-
if (file.endsWith('.md') && file.toUpperCase().includes('SERVICENOW')) {
|
|
180
|
-
const filePath = join(category.basePath, file);
|
|
181
|
-
const uri = `${category.uriPrefix}${file}`;
|
|
182
|
-
|
|
183
|
-
const resource: MCPResource = {
|
|
184
|
-
uri,
|
|
185
|
-
name: this.formatResourceName(file),
|
|
186
|
-
description: `ServiceNow documentation: ${this.formatResourceName(file)}`,
|
|
187
|
-
mimeType: this.getMimeType(file)
|
|
188
|
-
};
|
|
189
|
-
|
|
190
|
-
this.resourceIndex.set(uri, resource);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
} catch (error) {
|
|
194
|
-
this.logger.warn(`Failed to index documentation files:`, error);
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
/**
|
|
199
|
-
* Index directory recursively
|
|
200
|
-
*/
|
|
201
|
-
private async indexDirectoryRecursive(
|
|
202
|
-
dirPath: string,
|
|
203
|
-
category: ResourceCategory,
|
|
204
|
-
relativePath: string = ''
|
|
205
|
-
): Promise<void> {
|
|
206
|
-
try {
|
|
207
|
-
const entries = await readdir(dirPath);
|
|
208
|
-
|
|
209
|
-
for (const entry of entries) {
|
|
210
|
-
const fullPath = join(dirPath, entry);
|
|
211
|
-
const entryRelativePath = relativePath ? join(relativePath, entry) : entry;
|
|
212
|
-
|
|
213
|
-
try {
|
|
214
|
-
const stats = await stat(fullPath);
|
|
215
|
-
|
|
216
|
-
if (stats.isDirectory()) {
|
|
217
|
-
await this.indexDirectoryRecursive(fullPath, category, entryRelativePath);
|
|
218
|
-
} else if (this.isResourceFile(entry)) {
|
|
219
|
-
const uri = `${category.uriPrefix}${entryRelativePath.replace(/\\/g, '/')}`;
|
|
220
|
-
|
|
221
|
-
const resource: MCPResource = {
|
|
222
|
-
uri,
|
|
223
|
-
name: this.formatResourceName(entry),
|
|
224
|
-
description: this.generateResourceDescription(entry, category.name),
|
|
225
|
-
mimeType: this.getMimeType(entry)
|
|
226
|
-
};
|
|
227
|
-
|
|
228
|
-
this.resourceIndex.set(uri, resource);
|
|
229
|
-
}
|
|
230
|
-
} catch (error) {
|
|
231
|
-
this.logger.debug(`Failed to process ${fullPath}:`, error);
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
} catch (error) {
|
|
235
|
-
this.logger.warn(`Failed to read directory ${dirPath}:`, error);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
/**
|
|
240
|
-
* Check if file should be exposed as a resource
|
|
241
|
-
*/
|
|
242
|
-
private isResourceFile(filename: string): boolean {
|
|
243
|
-
const resourceExtensions = ['.json', '.md', '.yaml', '.yml', '.txt', '.ts', '.js'];
|
|
244
|
-
const ext = extname(filename).toLowerCase();
|
|
245
|
-
return resourceExtensions.includes(ext);
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
/**
|
|
249
|
-
* Convert URI to file path
|
|
250
|
-
*/
|
|
251
|
-
private uriToFilePath(uri: string): string | null {
|
|
252
|
-
for (const category of this.categories) {
|
|
253
|
-
if (uri.startsWith(category.uriPrefix)) {
|
|
254
|
-
const relativePath = uri.substring(category.uriPrefix.length);
|
|
255
|
-
|
|
256
|
-
if (category.name === 'documentation') {
|
|
257
|
-
// Documentation files are in root
|
|
258
|
-
return join(category.basePath, relativePath);
|
|
259
|
-
} else {
|
|
260
|
-
return join(category.basePath, relativePath);
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
return null;
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
/**
|
|
269
|
-
* Load resource content from file
|
|
270
|
-
*/
|
|
271
|
-
private async loadResourceContent(filePath: string, uri: string): Promise<MCPResourceContent> {
|
|
272
|
-
const content = await readFile(filePath, 'utf-8');
|
|
273
|
-
const mimeType = this.getMimeType(filePath);
|
|
274
|
-
|
|
275
|
-
return {
|
|
276
|
-
uri,
|
|
277
|
-
mimeType,
|
|
278
|
-
text: content
|
|
279
|
-
};
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
/**
|
|
283
|
-
* Get MIME type for file
|
|
284
|
-
*/
|
|
285
|
-
private getMimeType(filePath: string): string {
|
|
286
|
-
const ext = extname(filePath).toLowerCase();
|
|
287
|
-
|
|
288
|
-
const mimeTypes: { [key: string]: string } = {
|
|
289
|
-
'.json': 'application/json',
|
|
290
|
-
'.md': 'text/markdown',
|
|
291
|
-
'.yaml': 'application/yaml',
|
|
292
|
-
'.yml': 'application/yaml',
|
|
293
|
-
'.txt': 'text/plain',
|
|
294
|
-
'.ts': 'text/typescript',
|
|
295
|
-
'.js': 'text/javascript',
|
|
296
|
-
'.html': 'text/html',
|
|
297
|
-
'.css': 'text/css'
|
|
298
|
-
};
|
|
299
|
-
|
|
300
|
-
return mimeTypes[ext] || 'text/plain';
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
/**
|
|
304
|
-
* Format resource name for display
|
|
305
|
-
*/
|
|
306
|
-
private formatResourceName(filename: string): string {
|
|
307
|
-
const nameWithoutExt = basename(filename, extname(filename));
|
|
308
|
-
|
|
309
|
-
// Convert various naming conventions to readable names
|
|
310
|
-
return nameWithoutExt
|
|
311
|
-
.replace(/[-_]/g, ' ')
|
|
312
|
-
.replace(/\b\w/g, l => l.toUpperCase())
|
|
313
|
-
.replace(/\.(template|schema|example)/i, '');
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
/**
|
|
317
|
-
* Generate resource description based on filename and category
|
|
318
|
-
*/
|
|
319
|
-
private generateResourceDescription(filename: string, categoryName: string): string {
|
|
320
|
-
const name = this.formatResourceName(filename);
|
|
321
|
-
|
|
322
|
-
const descriptions: { [key: string]: string } = {
|
|
323
|
-
'templates': `ServiceNow ${name} template`,
|
|
324
|
-
'documentation': `Documentation: ${name}`,
|
|
325
|
-
'schemas': `Validation schema for ${name}`,
|
|
326
|
-
'examples': `Example implementation: ${name}`,
|
|
327
|
-
'help': `Help content: ${name}`
|
|
328
|
-
};
|
|
329
|
-
|
|
330
|
-
return descriptions[categoryName] || `Resource: ${name}`;
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
/**
|
|
334
|
-
* Clear resource cache
|
|
335
|
-
*/
|
|
336
|
-
clearCache(): void {
|
|
337
|
-
this.resourceCache.clear();
|
|
338
|
-
this.resourceIndex.clear();
|
|
339
|
-
this.logger.debug('Resource cache cleared');
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
/**
|
|
343
|
-
* Get resource statistics
|
|
344
|
-
*/
|
|
345
|
-
getResourceStats(): {
|
|
346
|
-
total: number;
|
|
347
|
-
cached: number;
|
|
348
|
-
categories: { [key: string]: number };
|
|
349
|
-
} {
|
|
350
|
-
const categories: { [key: string]: number } = {};
|
|
351
|
-
|
|
352
|
-
for (const resource of this.resourceIndex.values()) {
|
|
353
|
-
for (const category of this.categories) {
|
|
354
|
-
if (resource.uri.startsWith(category.uriPrefix)) {
|
|
355
|
-
categories[category.name] = (categories[category.name] || 0) + 1;
|
|
356
|
-
break;
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
return {
|
|
362
|
-
total: this.resourceIndex.size,
|
|
363
|
-
cached: this.resourceCache.size,
|
|
364
|
-
categories
|
|
365
|
-
};
|
|
366
|
-
}
|
|
367
|
-
}
|