@gulibs/safe-coder 0.0.25 → 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.
Files changed (188) hide show
  1. package/README.md +682 -902
  2. package/dist/cache/cache-manager.d.ts +71 -0
  3. package/dist/cache/cache-manager.d.ts.map +1 -0
  4. package/dist/cache/cache-manager.js +244 -0
  5. package/dist/cache/cache-manager.js.map +1 -0
  6. package/dist/executor/cli-executor.d.ts +106 -0
  7. package/dist/executor/cli-executor.d.ts.map +1 -0
  8. package/dist/executor/cli-executor.js +133 -0
  9. package/dist/executor/cli-executor.js.map +1 -0
  10. package/dist/executor/dependency-checker.d.ts +23 -0
  11. package/dist/executor/dependency-checker.d.ts.map +1 -0
  12. package/dist/executor/dependency-checker.js +62 -0
  13. package/dist/executor/dependency-checker.js.map +1 -0
  14. package/dist/index.js +3 -4
  15. package/dist/index.js.map +1 -1
  16. package/dist/processor/content-processor.d.ts +76 -0
  17. package/dist/processor/content-processor.d.ts.map +1 -0
  18. package/dist/processor/content-processor.js +182 -0
  19. package/dist/processor/content-processor.js.map +1 -0
  20. package/dist/processor/guide-generator.d.ts +68 -0
  21. package/dist/processor/guide-generator.d.ts.map +1 -0
  22. package/dist/processor/guide-generator.js +189 -0
  23. package/dist/processor/guide-generator.js.map +1 -0
  24. package/dist/server/safe-coder-mcp.d.ts +18 -0
  25. package/dist/server/safe-coder-mcp.d.ts.map +1 -0
  26. package/dist/server/safe-coder-mcp.js +164 -0
  27. package/dist/server/safe-coder-mcp.js.map +1 -0
  28. package/dist/tools/cache-tools.d.ts +42 -0
  29. package/dist/tools/cache-tools.d.ts.map +1 -0
  30. package/dist/tools/cache-tools.js +70 -0
  31. package/dist/tools/cache-tools.js.map +1 -0
  32. package/dist/tools/crawl-documentation.d.ts +57 -0
  33. package/dist/tools/crawl-documentation.d.ts.map +1 -0
  34. package/dist/tools/crawl-documentation.js +96 -0
  35. package/dist/tools/crawl-documentation.js.map +1 -0
  36. package/dist/tools/index.d.ts +4 -0
  37. package/dist/tools/index.d.ts.map +1 -0
  38. package/dist/tools/index.js +4 -0
  39. package/dist/tools/index.js.map +1 -0
  40. package/dist/tools/save-skill.d.ts +49 -0
  41. package/dist/tools/save-skill.d.ts.map +1 -0
  42. package/dist/tools/save-skill.js +207 -0
  43. package/dist/tools/save-skill.js.map +1 -0
  44. package/package.json +18 -22
  45. package/dist/documentation/browser-doc-browser.d.ts +0 -41
  46. package/dist/documentation/browser-doc-browser.d.ts.map +0 -1
  47. package/dist/documentation/browser-doc-browser.js +0 -357
  48. package/dist/documentation/browser-doc-browser.js.map +0 -1
  49. package/dist/documentation/cache.d.ts +0 -13
  50. package/dist/documentation/cache.d.ts.map +0 -1
  51. package/dist/documentation/cache.js +0 -48
  52. package/dist/documentation/cache.js.map +0 -1
  53. package/dist/documentation/checkpoint-manager.d.ts +0 -38
  54. package/dist/documentation/checkpoint-manager.d.ts.map +0 -1
  55. package/dist/documentation/checkpoint-manager.js +0 -101
  56. package/dist/documentation/checkpoint-manager.js.map +0 -1
  57. package/dist/documentation/doc-crawler.d.ts +0 -185
  58. package/dist/documentation/doc-crawler.d.ts.map +0 -1
  59. package/dist/documentation/doc-crawler.js +0 -1162
  60. package/dist/documentation/doc-crawler.js.map +0 -1
  61. package/dist/documentation/github-client.d.ts +0 -13
  62. package/dist/documentation/github-client.d.ts.map +0 -1
  63. package/dist/documentation/github-client.js +0 -90
  64. package/dist/documentation/github-client.js.map +0 -1
  65. package/dist/documentation/http-fetcher.d.ts +0 -8
  66. package/dist/documentation/http-fetcher.d.ts.map +0 -1
  67. package/dist/documentation/http-fetcher.js +0 -31
  68. package/dist/documentation/http-fetcher.js.map +0 -1
  69. package/dist/documentation/index.d.ts +0 -16
  70. package/dist/documentation/index.d.ts.map +0 -1
  71. package/dist/documentation/index.js +0 -159
  72. package/dist/documentation/index.js.map +0 -1
  73. package/dist/documentation/llms-txt/detector.d.ts +0 -31
  74. package/dist/documentation/llms-txt/detector.d.ts.map +0 -1
  75. package/dist/documentation/llms-txt/detector.js +0 -77
  76. package/dist/documentation/llms-txt/detector.js.map +0 -1
  77. package/dist/documentation/llms-txt/downloader.d.ts +0 -30
  78. package/dist/documentation/llms-txt/downloader.d.ts.map +0 -1
  79. package/dist/documentation/llms-txt/downloader.js +0 -84
  80. package/dist/documentation/llms-txt/downloader.js.map +0 -1
  81. package/dist/documentation/llms-txt/index.d.ts +0 -4
  82. package/dist/documentation/llms-txt/index.d.ts.map +0 -1
  83. package/dist/documentation/llms-txt/index.js +0 -4
  84. package/dist/documentation/llms-txt/index.js.map +0 -1
  85. package/dist/documentation/llms-txt/parser.d.ts +0 -43
  86. package/dist/documentation/llms-txt/parser.d.ts.map +0 -1
  87. package/dist/documentation/llms-txt/parser.js +0 -177
  88. package/dist/documentation/llms-txt/parser.js.map +0 -1
  89. package/dist/documentation/normalizer.d.ts +0 -6
  90. package/dist/documentation/normalizer.d.ts.map +0 -1
  91. package/dist/documentation/normalizer.js +0 -38
  92. package/dist/documentation/normalizer.js.map +0 -1
  93. package/dist/documentation/npm-client.d.ts +0 -19
  94. package/dist/documentation/npm-client.d.ts.map +0 -1
  95. package/dist/documentation/npm-client.js +0 -182
  96. package/dist/documentation/npm-client.js.map +0 -1
  97. package/dist/documentation/skill-generator.d.ts +0 -108
  98. package/dist/documentation/skill-generator.d.ts.map +0 -1
  99. package/dist/documentation/skill-generator.js +0 -642
  100. package/dist/documentation/skill-generator.js.map +0 -1
  101. package/dist/documentation/web-doc-browser.d.ts +0 -67
  102. package/dist/documentation/web-doc-browser.d.ts.map +0 -1
  103. package/dist/documentation/web-doc-browser.js +0 -555
  104. package/dist/documentation/web-doc-browser.js.map +0 -1
  105. package/dist/errors/api-validator.d.ts +0 -9
  106. package/dist/errors/api-validator.d.ts.map +0 -1
  107. package/dist/errors/api-validator.js +0 -57
  108. package/dist/errors/api-validator.js.map +0 -1
  109. package/dist/errors/contextual-analysis.d.ts +0 -14
  110. package/dist/errors/contextual-analysis.d.ts.map +0 -1
  111. package/dist/errors/contextual-analysis.js +0 -173
  112. package/dist/errors/contextual-analysis.js.map +0 -1
  113. package/dist/errors/cross-file-analyzer.d.ts +0 -16
  114. package/dist/errors/cross-file-analyzer.d.ts.map +0 -1
  115. package/dist/errors/cross-file-analyzer.js +0 -172
  116. package/dist/errors/cross-file-analyzer.js.map +0 -1
  117. package/dist/errors/eslint-integration.d.ts +0 -9
  118. package/dist/errors/eslint-integration.d.ts.map +0 -1
  119. package/dist/errors/eslint-integration.js +0 -131
  120. package/dist/errors/eslint-integration.js.map +0 -1
  121. package/dist/errors/framework-detector.d.ts +0 -10
  122. package/dist/errors/framework-detector.d.ts.map +0 -1
  123. package/dist/errors/framework-detector.js +0 -126
  124. package/dist/errors/framework-detector.js.map +0 -1
  125. package/dist/errors/index.d.ts +0 -18
  126. package/dist/errors/index.d.ts.map +0 -1
  127. package/dist/errors/index.js +0 -134
  128. package/dist/errors/index.js.map +0 -1
  129. package/dist/errors/pattern-matcher.d.ts +0 -25
  130. package/dist/errors/pattern-matcher.d.ts.map +0 -1
  131. package/dist/errors/pattern-matcher.js +0 -44
  132. package/dist/errors/pattern-matcher.js.map +0 -1
  133. package/dist/errors/patterns.d.ts +0 -11
  134. package/dist/errors/patterns.d.ts.map +0 -1
  135. package/dist/errors/patterns.js +0 -351
  136. package/dist/errors/patterns.js.map +0 -1
  137. package/dist/errors/performance-detector.d.ts +0 -11
  138. package/dist/errors/performance-detector.d.ts.map +0 -1
  139. package/dist/errors/performance-detector.js +0 -119
  140. package/dist/errors/performance-detector.js.map +0 -1
  141. package/dist/errors/runtime-detector.d.ts +0 -7
  142. package/dist/errors/runtime-detector.d.ts.map +0 -1
  143. package/dist/errors/runtime-detector.js +0 -86
  144. package/dist/errors/runtime-detector.js.map +0 -1
  145. package/dist/errors/security-detector.d.ts +0 -6
  146. package/dist/errors/security-detector.d.ts.map +0 -1
  147. package/dist/errors/security-detector.js +0 -75
  148. package/dist/errors/security-detector.js.map +0 -1
  149. package/dist/errors/typescript-integration.d.ts +0 -6
  150. package/dist/errors/typescript-integration.d.ts.map +0 -1
  151. package/dist/errors/typescript-integration.js +0 -46
  152. package/dist/errors/typescript-integration.js.map +0 -1
  153. package/dist/server/mcp-server.d.ts +0 -14
  154. package/dist/server/mcp-server.d.ts.map +0 -1
  155. package/dist/server/mcp-server.js +0 -776
  156. package/dist/server/mcp-server.js.map +0 -1
  157. package/dist/types/documentation.d.ts +0 -26
  158. package/dist/types/documentation.d.ts.map +0 -1
  159. package/dist/types/documentation.js +0 -2
  160. package/dist/types/documentation.js.map +0 -1
  161. package/dist/utils/config.d.ts +0 -21
  162. package/dist/utils/config.d.ts.map +0 -1
  163. package/dist/utils/config.js +0 -34
  164. package/dist/utils/config.js.map +0 -1
  165. package/dist/utils/http-client.d.ts +0 -17
  166. package/dist/utils/http-client.d.ts.map +0 -1
  167. package/dist/utils/http-client.js +0 -62
  168. package/dist/utils/http-client.js.map +0 -1
  169. package/dist/utils/logger.d.ts +0 -36
  170. package/dist/utils/logger.d.ts.map +0 -1
  171. package/dist/utils/logger.js +0 -128
  172. package/dist/utils/logger.js.map +0 -1
  173. package/dist/utils/rate-limiter.d.ts +0 -9
  174. package/dist/utils/rate-limiter.d.ts.map +0 -1
  175. package/dist/utils/rate-limiter.js +0 -26
  176. package/dist/utils/rate-limiter.js.map +0 -1
  177. package/dist/validation/auto-fix.d.ts +0 -15
  178. package/dist/validation/auto-fix.d.ts.map +0 -1
  179. package/dist/validation/auto-fix.js +0 -49
  180. package/dist/validation/auto-fix.js.map +0 -1
  181. package/dist/validation/index.d.ts +0 -21
  182. package/dist/validation/index.d.ts.map +0 -1
  183. package/dist/validation/index.js +0 -45
  184. package/dist/validation/index.js.map +0 -1
  185. package/dist/validation/resolution-db.d.ts +0 -15
  186. package/dist/validation/resolution-db.d.ts.map +0 -1
  187. package/dist/validation/resolution-db.js +0 -62
  188. 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":"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"}
@@ -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