@gulibs/safe-coder 0.0.26 → 0.0.27
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 +678 -994
- package/dist/cache/cache-manager.d.ts +71 -0
- package/dist/cache/cache-manager.d.ts.map +1 -0
- package/dist/cache/cache-manager.js +244 -0
- package/dist/cache/cache-manager.js.map +1 -0
- package/dist/executor/cli-executor.d.ts +106 -0
- package/dist/executor/cli-executor.d.ts.map +1 -0
- package/dist/executor/cli-executor.js +133 -0
- package/dist/executor/cli-executor.js.map +1 -0
- package/dist/executor/dependency-checker.d.ts +23 -0
- package/dist/executor/dependency-checker.d.ts.map +1 -0
- package/dist/executor/dependency-checker.js +62 -0
- package/dist/executor/dependency-checker.js.map +1 -0
- package/dist/index.js +3 -4
- package/dist/index.js.map +1 -1
- package/dist/processor/content-processor.d.ts +76 -0
- package/dist/processor/content-processor.d.ts.map +1 -0
- package/dist/processor/content-processor.js +182 -0
- package/dist/processor/content-processor.js.map +1 -0
- package/dist/processor/guide-generator.d.ts +68 -0
- package/dist/processor/guide-generator.d.ts.map +1 -0
- package/dist/processor/guide-generator.js +189 -0
- package/dist/processor/guide-generator.js.map +1 -0
- package/dist/server/safe-coder-mcp.d.ts +18 -0
- package/dist/server/safe-coder-mcp.d.ts.map +1 -0
- package/dist/server/safe-coder-mcp.js +164 -0
- package/dist/server/safe-coder-mcp.js.map +1 -0
- package/dist/tools/cache-tools.d.ts +42 -0
- package/dist/tools/cache-tools.d.ts.map +1 -0
- package/dist/tools/cache-tools.js +70 -0
- package/dist/tools/cache-tools.js.map +1 -0
- package/dist/tools/crawl-documentation.d.ts +57 -0
- package/dist/tools/crawl-documentation.d.ts.map +1 -0
- package/dist/tools/crawl-documentation.js +96 -0
- package/dist/tools/crawl-documentation.js.map +1 -0
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/save-skill.d.ts +49 -0
- package/dist/tools/save-skill.d.ts.map +1 -0
- package/dist/tools/save-skill.js +207 -0
- package/dist/tools/save-skill.js.map +1 -0
- package/package.json +18 -28
- package/dist/documentation/browser-doc-browser.d.ts +0 -41
- package/dist/documentation/browser-doc-browser.d.ts.map +0 -1
- package/dist/documentation/browser-doc-browser.js +0 -357
- package/dist/documentation/browser-doc-browser.js.map +0 -1
- package/dist/documentation/browser-manager.d.ts +0 -51
- package/dist/documentation/browser-manager.d.ts.map +0 -1
- package/dist/documentation/browser-manager.js +0 -260
- package/dist/documentation/browser-manager.js.map +0 -1
- package/dist/documentation/cache.d.ts +0 -13
- package/dist/documentation/cache.d.ts.map +0 -1
- package/dist/documentation/cache.js +0 -48
- package/dist/documentation/cache.js.map +0 -1
- package/dist/documentation/checkpoint-manager.d.ts +0 -38
- package/dist/documentation/checkpoint-manager.d.ts.map +0 -1
- package/dist/documentation/checkpoint-manager.js +0 -101
- package/dist/documentation/checkpoint-manager.js.map +0 -1
- package/dist/documentation/doc-crawler.d.ts +0 -221
- package/dist/documentation/doc-crawler.d.ts.map +0 -1
- package/dist/documentation/doc-crawler.js +0 -1415
- package/dist/documentation/doc-crawler.js.map +0 -1
- package/dist/documentation/github-client.d.ts +0 -13
- package/dist/documentation/github-client.d.ts.map +0 -1
- package/dist/documentation/github-client.js +0 -90
- package/dist/documentation/github-client.js.map +0 -1
- package/dist/documentation/http-fetcher.d.ts +0 -8
- package/dist/documentation/http-fetcher.d.ts.map +0 -1
- package/dist/documentation/http-fetcher.js +0 -31
- package/dist/documentation/http-fetcher.js.map +0 -1
- package/dist/documentation/index.d.ts +0 -16
- package/dist/documentation/index.d.ts.map +0 -1
- package/dist/documentation/index.js +0 -159
- package/dist/documentation/index.js.map +0 -1
- package/dist/documentation/llms-txt/detector.d.ts +0 -31
- package/dist/documentation/llms-txt/detector.d.ts.map +0 -1
- package/dist/documentation/llms-txt/detector.js +0 -77
- package/dist/documentation/llms-txt/detector.js.map +0 -1
- package/dist/documentation/llms-txt/downloader.d.ts +0 -30
- package/dist/documentation/llms-txt/downloader.d.ts.map +0 -1
- package/dist/documentation/llms-txt/downloader.js +0 -84
- package/dist/documentation/llms-txt/downloader.js.map +0 -1
- package/dist/documentation/llms-txt/index.d.ts +0 -4
- package/dist/documentation/llms-txt/index.d.ts.map +0 -1
- package/dist/documentation/llms-txt/index.js +0 -4
- package/dist/documentation/llms-txt/index.js.map +0 -1
- package/dist/documentation/llms-txt/parser.d.ts +0 -43
- package/dist/documentation/llms-txt/parser.d.ts.map +0 -1
- package/dist/documentation/llms-txt/parser.js +0 -177
- package/dist/documentation/llms-txt/parser.js.map +0 -1
- package/dist/documentation/normalizer.d.ts +0 -6
- package/dist/documentation/normalizer.d.ts.map +0 -1
- package/dist/documentation/normalizer.js +0 -38
- package/dist/documentation/normalizer.js.map +0 -1
- package/dist/documentation/npm-client.d.ts +0 -19
- package/dist/documentation/npm-client.d.ts.map +0 -1
- package/dist/documentation/npm-client.js +0 -182
- package/dist/documentation/npm-client.js.map +0 -1
- package/dist/documentation/skill-generator.d.ts +0 -108
- package/dist/documentation/skill-generator.d.ts.map +0 -1
- package/dist/documentation/skill-generator.js +0 -642
- package/dist/documentation/skill-generator.js.map +0 -1
- package/dist/documentation/web-doc-browser.d.ts +0 -67
- package/dist/documentation/web-doc-browser.d.ts.map +0 -1
- package/dist/documentation/web-doc-browser.js +0 -555
- package/dist/documentation/web-doc-browser.js.map +0 -1
- package/dist/errors/api-validator.d.ts +0 -9
- package/dist/errors/api-validator.d.ts.map +0 -1
- package/dist/errors/api-validator.js +0 -57
- package/dist/errors/api-validator.js.map +0 -1
- package/dist/errors/contextual-analysis.d.ts +0 -14
- package/dist/errors/contextual-analysis.d.ts.map +0 -1
- package/dist/errors/contextual-analysis.js +0 -173
- package/dist/errors/contextual-analysis.js.map +0 -1
- package/dist/errors/cross-file-analyzer.d.ts +0 -16
- package/dist/errors/cross-file-analyzer.d.ts.map +0 -1
- package/dist/errors/cross-file-analyzer.js +0 -172
- package/dist/errors/cross-file-analyzer.js.map +0 -1
- package/dist/errors/eslint-integration.d.ts +0 -9
- package/dist/errors/eslint-integration.d.ts.map +0 -1
- package/dist/errors/eslint-integration.js +0 -131
- package/dist/errors/eslint-integration.js.map +0 -1
- package/dist/errors/framework-detector.d.ts +0 -10
- package/dist/errors/framework-detector.d.ts.map +0 -1
- package/dist/errors/framework-detector.js +0 -126
- package/dist/errors/framework-detector.js.map +0 -1
- package/dist/errors/index.d.ts +0 -18
- package/dist/errors/index.d.ts.map +0 -1
- package/dist/errors/index.js +0 -134
- package/dist/errors/index.js.map +0 -1
- package/dist/errors/pattern-matcher.d.ts +0 -25
- package/dist/errors/pattern-matcher.d.ts.map +0 -1
- package/dist/errors/pattern-matcher.js +0 -44
- package/dist/errors/pattern-matcher.js.map +0 -1
- package/dist/errors/patterns.d.ts +0 -11
- package/dist/errors/patterns.d.ts.map +0 -1
- package/dist/errors/patterns.js +0 -351
- package/dist/errors/patterns.js.map +0 -1
- package/dist/errors/performance-detector.d.ts +0 -11
- package/dist/errors/performance-detector.d.ts.map +0 -1
- package/dist/errors/performance-detector.js +0 -119
- package/dist/errors/performance-detector.js.map +0 -1
- package/dist/errors/runtime-detector.d.ts +0 -7
- package/dist/errors/runtime-detector.d.ts.map +0 -1
- package/dist/errors/runtime-detector.js +0 -86
- package/dist/errors/runtime-detector.js.map +0 -1
- package/dist/errors/security-detector.d.ts +0 -6
- package/dist/errors/security-detector.d.ts.map +0 -1
- package/dist/errors/security-detector.js +0 -75
- package/dist/errors/security-detector.js.map +0 -1
- package/dist/errors/typescript-integration.d.ts +0 -6
- package/dist/errors/typescript-integration.d.ts.map +0 -1
- package/dist/errors/typescript-integration.js +0 -46
- package/dist/errors/typescript-integration.js.map +0 -1
- package/dist/server/mcp-server.d.ts +0 -14
- package/dist/server/mcp-server.d.ts.map +0 -1
- package/dist/server/mcp-server.js +0 -793
- package/dist/server/mcp-server.js.map +0 -1
- package/dist/types/documentation.d.ts +0 -26
- package/dist/types/documentation.d.ts.map +0 -1
- package/dist/types/documentation.js +0 -2
- package/dist/types/documentation.js.map +0 -1
- package/dist/utils/config.d.ts +0 -21
- package/dist/utils/config.d.ts.map +0 -1
- package/dist/utils/config.js +0 -34
- package/dist/utils/config.js.map +0 -1
- package/dist/utils/http-client.d.ts +0 -17
- package/dist/utils/http-client.d.ts.map +0 -1
- package/dist/utils/http-client.js +0 -62
- package/dist/utils/http-client.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -36
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -128
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/rate-limiter.d.ts +0 -9
- package/dist/utils/rate-limiter.d.ts.map +0 -1
- package/dist/utils/rate-limiter.js +0 -26
- package/dist/utils/rate-limiter.js.map +0 -1
- package/dist/validation/auto-fix.d.ts +0 -15
- package/dist/validation/auto-fix.d.ts.map +0 -1
- package/dist/validation/auto-fix.js +0 -49
- package/dist/validation/auto-fix.js.map +0 -1
- package/dist/validation/index.d.ts +0 -21
- package/dist/validation/index.d.ts.map +0 -1
- package/dist/validation/index.js +0 -45
- package/dist/validation/index.js.map +0 -1
- package/dist/validation/resolution-db.d.ts +0 -15
- package/dist/validation/resolution-db.d.ts.map +0 -1
- package/dist/validation/resolution-db.js +0 -62
- package/dist/validation/resolution-db.js.map +0 -1
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { ProcessedContent } from '../processor/content-processor.js';
|
|
2
|
+
import type { SkillGenerationGuide } from '../processor/guide-generator.js';
|
|
3
|
+
/**
|
|
4
|
+
* Cached data structure
|
|
5
|
+
*/
|
|
6
|
+
export interface CachedData {
|
|
7
|
+
url: string;
|
|
8
|
+
timestamp: number;
|
|
9
|
+
data: ProcessedContent;
|
|
10
|
+
guide: SkillGenerationGuide;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Cache entry metadata
|
|
14
|
+
*/
|
|
15
|
+
export interface CacheEntry {
|
|
16
|
+
url: string;
|
|
17
|
+
timestamp: number;
|
|
18
|
+
age: string;
|
|
19
|
+
size: number;
|
|
20
|
+
pageCount: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Cache manager for storing crawl results
|
|
24
|
+
*/
|
|
25
|
+
export declare class CacheManager {
|
|
26
|
+
private cacheDir;
|
|
27
|
+
private maxAge;
|
|
28
|
+
constructor(cacheDir?: string, maxAgeDays?: number);
|
|
29
|
+
/**
|
|
30
|
+
* Get cached data for a URL
|
|
31
|
+
*/
|
|
32
|
+
get(url: string): Promise<CachedData | null>;
|
|
33
|
+
/**
|
|
34
|
+
* Set cached data for a URL
|
|
35
|
+
*/
|
|
36
|
+
set(url: string, data: ProcessedContent, guide: SkillGenerationGuide): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* List all cached entries
|
|
39
|
+
*/
|
|
40
|
+
list(): Promise<CacheEntry[]>;
|
|
41
|
+
/**
|
|
42
|
+
* Clear cache (all or by pattern)
|
|
43
|
+
*/
|
|
44
|
+
clear(urlPattern?: string): Promise<number>;
|
|
45
|
+
/**
|
|
46
|
+
* Clear expired cache entries
|
|
47
|
+
*/
|
|
48
|
+
clearExpired(): Promise<number>;
|
|
49
|
+
/**
|
|
50
|
+
* Get cache statistics
|
|
51
|
+
*/
|
|
52
|
+
getStats(): Promise<{
|
|
53
|
+
totalEntries: number;
|
|
54
|
+
totalSize: number;
|
|
55
|
+
oldestEntry?: Date;
|
|
56
|
+
newestEntry?: Date;
|
|
57
|
+
}>;
|
|
58
|
+
/**
|
|
59
|
+
* Ensure cache directory exists
|
|
60
|
+
*/
|
|
61
|
+
private ensureCacheDir;
|
|
62
|
+
/**
|
|
63
|
+
* Generate cache key from URL
|
|
64
|
+
*/
|
|
65
|
+
private getCacheKey;
|
|
66
|
+
/**
|
|
67
|
+
* Format age in human-readable format
|
|
68
|
+
*/
|
|
69
|
+
private formatAge;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=cache-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-manager.d.ts","sourceRoot":"","sources":["../../src/cache/cache-manager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAE5E;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE,oBAAoB,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAS;gBAGrB,QAAQ,CAAC,EAAE,MAAM,EACjB,UAAU,GAAE,MAAU;IAMxB;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAiClD;;OAEG;IACG,GAAG,CACP,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,IAAI,CAAC;IAqBhB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IA2CnC;;OAEG;IACG,KAAK,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA2CjD;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAqCrC;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC;QACxB,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,IAAI,CAAC;QACnB,WAAW,CAAC,EAAE,IAAI,CAAC;KACpB,CAAC;IAuBF;;OAEG;YACW,cAAc;IAQ5B;;OAEG;IACH,OAAO,CAAC,WAAW;IAKnB;;OAEG;IACH,OAAO,CAAC,SAAS;CAWlB"}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import fs from 'fs/promises';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
/**
|
|
5
|
+
* Cache manager for storing crawl results
|
|
6
|
+
*/
|
|
7
|
+
export class CacheManager {
|
|
8
|
+
cacheDir;
|
|
9
|
+
maxAge; // Maximum age in milliseconds
|
|
10
|
+
constructor(cacheDir, maxAgeDays = 7) {
|
|
11
|
+
this.cacheDir = cacheDir || path.join(os.homedir(), '.safe-coder', 'cache');
|
|
12
|
+
this.maxAge = maxAgeDays * 24 * 60 * 60 * 1000; // Convert days to milliseconds
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Get cached data for a URL
|
|
16
|
+
*/
|
|
17
|
+
async get(url) {
|
|
18
|
+
try {
|
|
19
|
+
await this.ensureCacheDir();
|
|
20
|
+
const cacheKey = this.getCacheKey(url);
|
|
21
|
+
const cachePath = path.join(this.cacheDir, `${cacheKey}.json`);
|
|
22
|
+
// Check if cache file exists
|
|
23
|
+
try {
|
|
24
|
+
await fs.access(cachePath);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return null; // File doesn't exist
|
|
28
|
+
}
|
|
29
|
+
// Read cache file
|
|
30
|
+
const data = await fs.readFile(cachePath, 'utf-8');
|
|
31
|
+
const cached = JSON.parse(data);
|
|
32
|
+
// Check if expired
|
|
33
|
+
const age = Date.now() - cached.timestamp;
|
|
34
|
+
if (age > this.maxAge) {
|
|
35
|
+
// Delete expired cache
|
|
36
|
+
await fs.unlink(cachePath).catch(() => { });
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
return cached;
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
console.error('Error reading cache:', error);
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Set cached data for a URL
|
|
48
|
+
*/
|
|
49
|
+
async set(url, data, guide) {
|
|
50
|
+
try {
|
|
51
|
+
await this.ensureCacheDir();
|
|
52
|
+
const cacheKey = this.getCacheKey(url);
|
|
53
|
+
const cachePath = path.join(this.cacheDir, `${cacheKey}.json`);
|
|
54
|
+
const cached = {
|
|
55
|
+
url,
|
|
56
|
+
timestamp: Date.now(),
|
|
57
|
+
data,
|
|
58
|
+
guide,
|
|
59
|
+
};
|
|
60
|
+
await fs.writeFile(cachePath, JSON.stringify(cached, null, 2), 'utf-8');
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
console.error('Error writing cache:', error);
|
|
64
|
+
throw error;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* List all cached entries
|
|
69
|
+
*/
|
|
70
|
+
async list() {
|
|
71
|
+
try {
|
|
72
|
+
await this.ensureCacheDir();
|
|
73
|
+
const files = await fs.readdir(this.cacheDir);
|
|
74
|
+
const entries = [];
|
|
75
|
+
for (const file of files) {
|
|
76
|
+
if (!file.endsWith('.json'))
|
|
77
|
+
continue;
|
|
78
|
+
const filePath = path.join(this.cacheDir, file);
|
|
79
|
+
try {
|
|
80
|
+
const stats = await fs.stat(filePath);
|
|
81
|
+
const data = await fs.readFile(filePath, 'utf-8');
|
|
82
|
+
const cached = JSON.parse(data);
|
|
83
|
+
const age = Date.now() - cached.timestamp;
|
|
84
|
+
const ageStr = this.formatAge(age);
|
|
85
|
+
entries.push({
|
|
86
|
+
url: cached.url,
|
|
87
|
+
timestamp: cached.timestamp,
|
|
88
|
+
age: ageStr,
|
|
89
|
+
size: stats.size,
|
|
90
|
+
pageCount: cached.data.statistics.totalPages,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
// Skip invalid cache files
|
|
95
|
+
console.error(`Error reading cache file ${file}:`, error);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Sort by timestamp (newest first)
|
|
99
|
+
entries.sort((a, b) => b.timestamp - a.timestamp);
|
|
100
|
+
return entries;
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
console.error('Error listing cache:', error);
|
|
104
|
+
return [];
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Clear cache (all or by pattern)
|
|
109
|
+
*/
|
|
110
|
+
async clear(urlPattern) {
|
|
111
|
+
try {
|
|
112
|
+
await this.ensureCacheDir();
|
|
113
|
+
const files = await fs.readdir(this.cacheDir);
|
|
114
|
+
let deletedCount = 0;
|
|
115
|
+
for (const file of files) {
|
|
116
|
+
if (!file.endsWith('.json'))
|
|
117
|
+
continue;
|
|
118
|
+
const filePath = path.join(this.cacheDir, file);
|
|
119
|
+
// If pattern is provided, check if it matches
|
|
120
|
+
if (urlPattern) {
|
|
121
|
+
try {
|
|
122
|
+
const data = await fs.readFile(filePath, 'utf-8');
|
|
123
|
+
const cached = JSON.parse(data);
|
|
124
|
+
if (!cached.url.includes(urlPattern)) {
|
|
125
|
+
continue; // Skip files that don't match pattern
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
// Skip invalid files
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Delete file
|
|
134
|
+
try {
|
|
135
|
+
await fs.unlink(filePath);
|
|
136
|
+
deletedCount++;
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
console.error(`Error deleting ${file}:`, error);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return deletedCount;
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
console.error('Error clearing cache:', error);
|
|
146
|
+
return 0;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Clear expired cache entries
|
|
151
|
+
*/
|
|
152
|
+
async clearExpired() {
|
|
153
|
+
try {
|
|
154
|
+
await this.ensureCacheDir();
|
|
155
|
+
const files = await fs.readdir(this.cacheDir);
|
|
156
|
+
let deletedCount = 0;
|
|
157
|
+
for (const file of files) {
|
|
158
|
+
if (!file.endsWith('.json'))
|
|
159
|
+
continue;
|
|
160
|
+
const filePath = path.join(this.cacheDir, file);
|
|
161
|
+
try {
|
|
162
|
+
const data = await fs.readFile(filePath, 'utf-8');
|
|
163
|
+
const cached = JSON.parse(data);
|
|
164
|
+
const age = Date.now() - cached.timestamp;
|
|
165
|
+
if (age > this.maxAge) {
|
|
166
|
+
await fs.unlink(filePath);
|
|
167
|
+
deletedCount++;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
// Delete invalid cache files
|
|
172
|
+
try {
|
|
173
|
+
await fs.unlink(filePath);
|
|
174
|
+
deletedCount++;
|
|
175
|
+
}
|
|
176
|
+
catch { }
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return deletedCount;
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
console.error('Error clearing expired cache:', error);
|
|
183
|
+
return 0;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Get cache statistics
|
|
188
|
+
*/
|
|
189
|
+
async getStats() {
|
|
190
|
+
try {
|
|
191
|
+
const entries = await this.list();
|
|
192
|
+
if (entries.length === 0) {
|
|
193
|
+
return { totalEntries: 0, totalSize: 0 };
|
|
194
|
+
}
|
|
195
|
+
const totalSize = entries.reduce((sum, e) => sum + e.size, 0);
|
|
196
|
+
const timestamps = entries.map(e => e.timestamp);
|
|
197
|
+
return {
|
|
198
|
+
totalEntries: entries.length,
|
|
199
|
+
totalSize,
|
|
200
|
+
oldestEntry: new Date(Math.min(...timestamps)),
|
|
201
|
+
newestEntry: new Date(Math.max(...timestamps)),
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
catch (error) {
|
|
205
|
+
console.error('Error getting cache stats:', error);
|
|
206
|
+
return { totalEntries: 0, totalSize: 0 };
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Ensure cache directory exists
|
|
211
|
+
*/
|
|
212
|
+
async ensureCacheDir() {
|
|
213
|
+
try {
|
|
214
|
+
await fs.mkdir(this.cacheDir, { recursive: true });
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
// Ignore error if directory already exists
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Generate cache key from URL
|
|
222
|
+
*/
|
|
223
|
+
getCacheKey(url) {
|
|
224
|
+
// Use base64url encoding for safe filenames
|
|
225
|
+
return Buffer.from(url).toString('base64url');
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Format age in human-readable format
|
|
229
|
+
*/
|
|
230
|
+
formatAge(milliseconds) {
|
|
231
|
+
const seconds = Math.floor(milliseconds / 1000);
|
|
232
|
+
const minutes = Math.floor(seconds / 60);
|
|
233
|
+
const hours = Math.floor(minutes / 60);
|
|
234
|
+
const days = Math.floor(hours / 24);
|
|
235
|
+
if (days > 0)
|
|
236
|
+
return `${days} day${days > 1 ? 's' : ''}`;
|
|
237
|
+
if (hours > 0)
|
|
238
|
+
return `${hours} hour${hours > 1 ? 's' : ''}`;
|
|
239
|
+
if (minutes > 0)
|
|
240
|
+
return `${minutes} minute${minutes > 1 ? 's' : ''}`;
|
|
241
|
+
return `${seconds} second${seconds > 1 ? 's' : ''}`;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=cache-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-manager.js","sourceRoot":"","sources":["../../src/cache/cache-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import type { DependencyChecker } from './dependency-checker.js';
|
|
2
|
+
/**
|
|
3
|
+
* CLI Output format from safe-coder-cli
|
|
4
|
+
*/
|
|
5
|
+
export interface CLIOutput<T = any> {
|
|
6
|
+
success: boolean;
|
|
7
|
+
data?: T;
|
|
8
|
+
error?: {
|
|
9
|
+
code: string;
|
|
10
|
+
message: string;
|
|
11
|
+
details?: any;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Progress message from CLI
|
|
16
|
+
*/
|
|
17
|
+
export interface ProgressMessage {
|
|
18
|
+
type: 'progress';
|
|
19
|
+
message: string;
|
|
20
|
+
timestamp: string;
|
|
21
|
+
current?: number;
|
|
22
|
+
total?: number;
|
|
23
|
+
percentage?: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Crawl parameters
|
|
27
|
+
*/
|
|
28
|
+
export interface CrawlParams {
|
|
29
|
+
url: string;
|
|
30
|
+
maxPages?: number;
|
|
31
|
+
depth?: number;
|
|
32
|
+
maxDepth?: number;
|
|
33
|
+
workers?: number;
|
|
34
|
+
useBrowser?: boolean;
|
|
35
|
+
browser?: 'puppeteer' | 'playwright';
|
|
36
|
+
spaStrategy?: 'smart' | 'auto' | 'manual';
|
|
37
|
+
checkpoint?: boolean;
|
|
38
|
+
resume?: boolean;
|
|
39
|
+
rateLimit?: number;
|
|
40
|
+
includePaths?: string[];
|
|
41
|
+
excludePaths?: string[];
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Crawl result from CLI
|
|
45
|
+
*/
|
|
46
|
+
export interface CrawlResult {
|
|
47
|
+
source: {
|
|
48
|
+
url: string;
|
|
49
|
+
crawledAt: string;
|
|
50
|
+
pageCount: number;
|
|
51
|
+
depth: number;
|
|
52
|
+
};
|
|
53
|
+
pages: Array<{
|
|
54
|
+
url: string;
|
|
55
|
+
title: string;
|
|
56
|
+
content: string;
|
|
57
|
+
category?: string;
|
|
58
|
+
wordCount: number;
|
|
59
|
+
codeBlocks: number;
|
|
60
|
+
headings: string[];
|
|
61
|
+
}>;
|
|
62
|
+
metadata: {
|
|
63
|
+
technology?: string;
|
|
64
|
+
version?: string;
|
|
65
|
+
documentType?: string;
|
|
66
|
+
categories: string[];
|
|
67
|
+
};
|
|
68
|
+
statistics: {
|
|
69
|
+
totalPages: number;
|
|
70
|
+
maxDepthReached: number;
|
|
71
|
+
errors: number;
|
|
72
|
+
linkDiscovery?: {
|
|
73
|
+
totalLinksFound: number;
|
|
74
|
+
linksQueued: number;
|
|
75
|
+
pagesDiscovered: number;
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
skill?: {
|
|
79
|
+
skillMd: string;
|
|
80
|
+
quality: number;
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Progress callback function
|
|
85
|
+
*/
|
|
86
|
+
export type ProgressCallback = (message: ProgressMessage) => void;
|
|
87
|
+
/**
|
|
88
|
+
* CLI Executor that spawns safe-coder-cli and communicates via stdin/stdout
|
|
89
|
+
*/
|
|
90
|
+
export declare class CLIExecutor {
|
|
91
|
+
private dependencyChecker?;
|
|
92
|
+
constructor(dependencyChecker?: DependencyChecker);
|
|
93
|
+
/**
|
|
94
|
+
* Execute the crawl command
|
|
95
|
+
*/
|
|
96
|
+
executeCrawl(params: CrawlParams, onProgress?: ProgressCallback): Promise<CrawlResult>;
|
|
97
|
+
/**
|
|
98
|
+
* Execute error detection command (future use)
|
|
99
|
+
*/
|
|
100
|
+
executeErrorDetection(filePath: string): Promise<any>;
|
|
101
|
+
/**
|
|
102
|
+
* Execute code validation command (future use)
|
|
103
|
+
*/
|
|
104
|
+
executeValidation(filePath: string): Promise<any>;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=cli-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-executor.d.ts","sourceRoot":"","sources":["../../src/executor/cli-executor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE;;GAEG;AACH,MAAM,WAAW,SAAS,CAAC,CAAC,GAAG,GAAG;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,GAAG,CAAC;KACf,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,WAAW,GAAG,YAAY,CAAC;IACrC,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC1C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;QACZ,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,KAAK,EAAE,KAAK,CAAC;QACX,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC,CAAC;IACH,QAAQ,EAAE;QACR,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC;IACF,UAAU,EAAE;QACV,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,EAAE,MAAM,CAAC;QACxB,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,CAAC,EAAE;YACd,eAAe,EAAE,MAAM,CAAC;YACxB,WAAW,EAAE,MAAM,CAAC;YACpB,eAAe,EAAE,MAAM,CAAC;SACzB,CAAC;KACH,CAAC;IACF,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;AAElE;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,iBAAiB,CAAC,CAAoB;gBAElC,iBAAiB,CAAC,EAAE,iBAAiB;IAIjD;;OAEG;IACG,YAAY,CAChB,MAAM,EAAE,WAAW,EACnB,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,WAAW,CAAC;IAkIvB;;OAEG;IACG,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAK3D;;OAEG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;CAIxD"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { spawn } from 'child_process';
|
|
2
|
+
/**
|
|
3
|
+
* CLI Executor that spawns safe-coder-cli and communicates via stdin/stdout
|
|
4
|
+
*/
|
|
5
|
+
export class CLIExecutor {
|
|
6
|
+
dependencyChecker;
|
|
7
|
+
constructor(dependencyChecker) {
|
|
8
|
+
this.dependencyChecker = dependencyChecker;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Execute the crawl command
|
|
12
|
+
*/
|
|
13
|
+
async executeCrawl(params, onProgress) {
|
|
14
|
+
// Check if CLI is installed first (if checker is provided)
|
|
15
|
+
if (this.dependencyChecker) {
|
|
16
|
+
const check = await this.dependencyChecker.checkCLIInstalled();
|
|
17
|
+
if (!check.installed) {
|
|
18
|
+
throw new Error(check.message || 'safe-coder-cli is not installed');
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
// Build command arguments
|
|
22
|
+
const args = [
|
|
23
|
+
'crawl',
|
|
24
|
+
params.url,
|
|
25
|
+
'--output-format', 'json',
|
|
26
|
+
'--max-depth', String(params.maxDepth || params.depth || 3),
|
|
27
|
+
'--max-pages', String(params.maxPages || 200),
|
|
28
|
+
];
|
|
29
|
+
if (params.workers) {
|
|
30
|
+
args.push('--workers', String(params.workers));
|
|
31
|
+
}
|
|
32
|
+
if (params.browser) {
|
|
33
|
+
args.push('--browser', params.browser);
|
|
34
|
+
}
|
|
35
|
+
if (params.spaStrategy) {
|
|
36
|
+
args.push('--spa-strategy', params.spaStrategy);
|
|
37
|
+
}
|
|
38
|
+
if (params.checkpoint) {
|
|
39
|
+
args.push('--checkpoint');
|
|
40
|
+
}
|
|
41
|
+
if (params.resume) {
|
|
42
|
+
args.push('--resume');
|
|
43
|
+
}
|
|
44
|
+
if (params.rateLimit) {
|
|
45
|
+
args.push('--rate-limit', String(params.rateLimit));
|
|
46
|
+
}
|
|
47
|
+
if (params.includePaths && params.includePaths.length > 0) {
|
|
48
|
+
args.push('--include-paths', params.includePaths.join(','));
|
|
49
|
+
}
|
|
50
|
+
if (params.excludePaths && params.excludePaths.length > 0) {
|
|
51
|
+
args.push('--exclude-paths', params.excludePaths.join(','));
|
|
52
|
+
}
|
|
53
|
+
return new Promise((resolve, reject) => {
|
|
54
|
+
const child = spawn('safe-coder-cli', args, {
|
|
55
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
56
|
+
});
|
|
57
|
+
let stdout = '';
|
|
58
|
+
let stderr = '';
|
|
59
|
+
// Collect stdout (JSON result)
|
|
60
|
+
child.stdout.on('data', (data) => {
|
|
61
|
+
stdout += data.toString();
|
|
62
|
+
});
|
|
63
|
+
// Process stderr (progress and errors)
|
|
64
|
+
child.stderr.on('data', (data) => {
|
|
65
|
+
stderr += data.toString();
|
|
66
|
+
// Try to parse progress messages
|
|
67
|
+
if (onProgress) {
|
|
68
|
+
const lines = data.toString().split('\n');
|
|
69
|
+
for (const line of lines) {
|
|
70
|
+
if (!line.trim())
|
|
71
|
+
continue;
|
|
72
|
+
try {
|
|
73
|
+
const message = JSON.parse(line);
|
|
74
|
+
if (message.type === 'progress') {
|
|
75
|
+
onProgress(message);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// Ignore non-JSON stderr output
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
// Handle process completion
|
|
85
|
+
child.on('close', (code) => {
|
|
86
|
+
if (code === 0) {
|
|
87
|
+
try {
|
|
88
|
+
const output = JSON.parse(stdout);
|
|
89
|
+
if (output.success && output.data) {
|
|
90
|
+
resolve(output.data);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
reject(new Error(output.error?.message || 'Unknown error from CLI'));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
reject(new Error(`Failed to parse CLI output: ${err instanceof Error ? err.message : String(err)}\nOutput: ${stdout}`));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
// Try to parse error from stderr
|
|
102
|
+
try {
|
|
103
|
+
const errorOutput = JSON.parse(stderr);
|
|
104
|
+
reject(new Error(errorOutput.error?.message ||
|
|
105
|
+
`CLI failed with code ${code}`));
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
reject(new Error(`CLI failed with code ${code}: ${stderr}`));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
// Handle spawn errors
|
|
113
|
+
child.on('error', (err) => {
|
|
114
|
+
reject(new Error(`Failed to spawn CLI: ${err.message}`));
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Execute error detection command (future use)
|
|
120
|
+
*/
|
|
121
|
+
async executeErrorDetection(filePath) {
|
|
122
|
+
// TODO: Implement error detection via CLI
|
|
123
|
+
throw new Error('Not implemented yet');
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Execute code validation command (future use)
|
|
127
|
+
*/
|
|
128
|
+
async executeValidation(filePath) {
|
|
129
|
+
// TODO: Implement validation via CLI
|
|
130
|
+
throw new Error('Not implemented yet');
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=cli-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-executor.js","sourceRoot":"","sources":["../../src/executor/cli-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface CLICheckResult {
|
|
2
|
+
installed: boolean;
|
|
3
|
+
path?: string;
|
|
4
|
+
message?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Dependency checker for verifying CLI tools are installed
|
|
8
|
+
*/
|
|
9
|
+
export declare class DependencyChecker {
|
|
10
|
+
/**
|
|
11
|
+
* Check if safe-coder-cli is installed globally
|
|
12
|
+
*/
|
|
13
|
+
checkCLIInstalled(): Promise<CLICheckResult>;
|
|
14
|
+
/**
|
|
15
|
+
* Get friendly installation instructions
|
|
16
|
+
*/
|
|
17
|
+
private getInstallationMessage;
|
|
18
|
+
/**
|
|
19
|
+
* Check CLI version (optional, for future use)
|
|
20
|
+
*/
|
|
21
|
+
getCLIVersion(): Promise<string | null>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=dependency-checker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-checker.d.ts","sourceRoot":"","sources":["../../src/executor/dependency-checker.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,iBAAiB;IAC5B;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,cAAc,CAAC;IAelD;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAmB9B;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAY9C"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import which from 'which';
|
|
2
|
+
/**
|
|
3
|
+
* Dependency checker for verifying CLI tools are installed
|
|
4
|
+
*/
|
|
5
|
+
export class DependencyChecker {
|
|
6
|
+
/**
|
|
7
|
+
* Check if safe-coder-cli is installed globally
|
|
8
|
+
*/
|
|
9
|
+
async checkCLIInstalled() {
|
|
10
|
+
try {
|
|
11
|
+
const cliPath = await which('safe-coder-cli');
|
|
12
|
+
return {
|
|
13
|
+
installed: true,
|
|
14
|
+
path: cliPath,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return {
|
|
19
|
+
installed: false,
|
|
20
|
+
message: this.getInstallationMessage(),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get friendly installation instructions
|
|
26
|
+
*/
|
|
27
|
+
getInstallationMessage() {
|
|
28
|
+
return `
|
|
29
|
+
⚠️ safe-coder-cli is not installed.
|
|
30
|
+
|
|
31
|
+
The MCP Server requires safe-coder-cli to be installed globally.
|
|
32
|
+
|
|
33
|
+
Please install it first:
|
|
34
|
+
npm install -g @gulibs/safe-coder-cli
|
|
35
|
+
|
|
36
|
+
Or using yarn:
|
|
37
|
+
yarn global add @gulibs/safe-coder-cli
|
|
38
|
+
|
|
39
|
+
Or using pnpm:
|
|
40
|
+
pnpm add -g @gulibs/safe-coder-cli
|
|
41
|
+
|
|
42
|
+
After installation, restart Cursor/Claude Desktop.
|
|
43
|
+
`.trim();
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Check CLI version (optional, for future use)
|
|
47
|
+
*/
|
|
48
|
+
async getCLIVersion() {
|
|
49
|
+
try {
|
|
50
|
+
const { execSync } = await import('child_process');
|
|
51
|
+
const version = execSync('safe-coder-cli --version', {
|
|
52
|
+
encoding: 'utf-8',
|
|
53
|
+
stdio: ['pipe', 'pipe', 'ignore'],
|
|
54
|
+
}).trim();
|
|
55
|
+
return version;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=dependency-checker.js.map
|