@stackguide/mcp-server 1.0.0

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 (48) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +453 -0
  3. package/data/knowledge/python-django/architecture/architecture-patterns.md +201 -0
  4. package/data/knowledge/python-django/common-issues/common-issues.md +181 -0
  5. package/data/knowledge/python-django/patterns/drf-patterns.md +133 -0
  6. package/data/knowledge/react-node/architecture/node-architecture.md +257 -0
  7. package/data/knowledge/react-node/common-issues/common-issues.md +262 -0
  8. package/data/knowledge/react-node/patterns/react-patterns.md +244 -0
  9. package/data/rules/python-django/best-practices/django-best-practices.md +120 -0
  10. package/data/rules/python-django/coding-standards/django-standards.md +104 -0
  11. package/data/rules/python-django/security/security-guidelines.md +146 -0
  12. package/data/rules/react-node/best-practices/react-best-practices.md +195 -0
  13. package/data/rules/react-node/coding-standards/node-standards.md +192 -0
  14. package/data/rules/react-node/coding-standards/react-standards.md +155 -0
  15. package/data/rules/react-node/security/security-guidelines.md +228 -0
  16. package/dist/config/persistence.d.ts +15 -0
  17. package/dist/config/persistence.d.ts.map +1 -0
  18. package/dist/config/persistence.js +171 -0
  19. package/dist/config/persistence.js.map +1 -0
  20. package/dist/config/types.d.ts +47 -0
  21. package/dist/config/types.d.ts.map +1 -0
  22. package/dist/config/types.js +116 -0
  23. package/dist/config/types.js.map +1 -0
  24. package/dist/index.d.ts +3 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +1799 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/resources/knowledgeProvider.d.ts +10 -0
  29. package/dist/resources/knowledgeProvider.d.ts.map +1 -0
  30. package/dist/resources/knowledgeProvider.js +130 -0
  31. package/dist/resources/knowledgeProvider.js.map +1 -0
  32. package/dist/resources/rulesProvider.d.ts +10 -0
  33. package/dist/resources/rulesProvider.d.ts.map +1 -0
  34. package/dist/resources/rulesProvider.js +135 -0
  35. package/dist/resources/rulesProvider.js.map +1 -0
  36. package/dist/services/cursorDirectory.d.ts +55 -0
  37. package/dist/services/cursorDirectory.d.ts.map +1 -0
  38. package/dist/services/cursorDirectory.js +367 -0
  39. package/dist/services/cursorDirectory.js.map +1 -0
  40. package/dist/services/ruleManager.d.ts +18 -0
  41. package/dist/services/ruleManager.d.ts.map +1 -0
  42. package/dist/services/ruleManager.js +382 -0
  43. package/dist/services/ruleManager.js.map +1 -0
  44. package/dist/services/webDocumentation.d.ts +41 -0
  45. package/dist/services/webDocumentation.d.ts.map +1 -0
  46. package/dist/services/webDocumentation.js +237 -0
  47. package/dist/services/webDocumentation.js.map +1 -0
  48. package/package.json +46 -0
@@ -0,0 +1,367 @@
1
+ /**
2
+ * Cursor Directory Integration Service
3
+ *
4
+ * This service fetches and parses rules from cursor.directory,
5
+ * a popular community-driven repository of cursor rules for AI coding assistants.
6
+ */
7
+ // Categories available on cursor.directory
8
+ export const CURSOR_DIRECTORY_CATEGORIES = [
9
+ 'typescript',
10
+ 'python',
11
+ 'next.js',
12
+ 'react',
13
+ 'php',
14
+ 'javascript',
15
+ 'tailwindcss',
16
+ 'laravel',
17
+ 'c',
18
+ 'web-development',
19
+ 'game-development',
20
+ 'expo',
21
+ 'react-native',
22
+ 'flutter',
23
+ 'tailwind',
24
+ 'testing',
25
+ 'vite',
26
+ 'supabase',
27
+ 'vue',
28
+ 'svelte',
29
+ 'rust',
30
+ 'go',
31
+ 'swift',
32
+ 'kotlin',
33
+ 'java',
34
+ 'ruby',
35
+ 'django',
36
+ 'fastapi',
37
+ 'node.js',
38
+ 'express',
39
+ 'nestjs',
40
+ 'prisma',
41
+ 'mongodb',
42
+ 'postgresql',
43
+ 'graphql',
44
+ 'aws',
45
+ 'docker',
46
+ 'kubernetes'
47
+ ];
48
+ // Cache for fetched rules
49
+ const rulesCache = new Map();
50
+ const categoryCache = new Map();
51
+ // Base URL for cursor.directory
52
+ const BASE_URL = 'https://cursor.directory';
53
+ /**
54
+ * Extract rule content from cursor.directory HTML page
55
+ */
56
+ function extractRuleFromHtml(html, slug, category) {
57
+ try {
58
+ // Extract title
59
+ const titleMatch = html.match(/<h1[^>]*>([^<]+)<\/h1>/i)
60
+ || html.match(/<title[^>]*>([^<]+)<\/title>/i);
61
+ const title = titleMatch ? titleMatch[1].replace(' - cursor.directory', '').trim() : slug;
62
+ // Find the main rule content - usually in a pre or code block
63
+ let content = '';
64
+ // Look for rule content in various formats
65
+ const preMatch = html.match(/<pre[^>]*><code[^>]*>([\s\S]*?)<\/code><\/pre>/i);
66
+ if (preMatch) {
67
+ content = preMatch[1];
68
+ }
69
+ else {
70
+ // Try to find content in a div with specific classes
71
+ const contentMatch = html.match(/class="[^"]*prose[^"]*"[^>]*>([\s\S]*?)<\/div>/i);
72
+ if (contentMatch) {
73
+ content = contentMatch[1];
74
+ }
75
+ }
76
+ // Clean HTML from content
77
+ content = cleanHtmlContent(content);
78
+ // Extract description from meta or first paragraph
79
+ const descMatch = html.match(/<meta\s+name="description"\s+content="([^"]+)"/i)
80
+ || html.match(/<p[^>]*>([^<]+)<\/p>/i);
81
+ const description = descMatch ? descMatch[1].trim() : `${title} cursor rules`;
82
+ // Extract tags from content
83
+ const tags = extractTagsFromContent(content, category);
84
+ return {
85
+ id: `cursor-directory-${category}-${slug}`,
86
+ slug,
87
+ title,
88
+ description,
89
+ content,
90
+ category,
91
+ tags,
92
+ url: `${BASE_URL}/${slug}`,
93
+ fetchedAt: new Date().toISOString()
94
+ };
95
+ }
96
+ catch (error) {
97
+ console.error(`Error extracting rule from HTML: ${error}`);
98
+ return null;
99
+ }
100
+ }
101
+ /**
102
+ * Clean HTML content and convert to plain text/markdown
103
+ */
104
+ function cleanHtmlContent(html) {
105
+ return html
106
+ // Decode HTML entities first
107
+ .replace(/&nbsp;/g, ' ')
108
+ .replace(/&amp;/g, '&')
109
+ .replace(/&lt;/g, '<')
110
+ .replace(/&gt;/g, '>')
111
+ .replace(/&quot;/g, '"')
112
+ .replace(/&#39;/g, "'")
113
+ .replace(/&#x27;/g, "'")
114
+ .replace(/&#x2F;/g, '/')
115
+ // Convert headers
116
+ .replace(/<h1[^>]*>(.*?)<\/h1>/gi, '# $1\n\n')
117
+ .replace(/<h2[^>]*>(.*?)<\/h2>/gi, '## $1\n\n')
118
+ .replace(/<h3[^>]*>(.*?)<\/h3>/gi, '### $1\n\n')
119
+ .replace(/<h4[^>]*>(.*?)<\/h4>/gi, '#### $1\n\n')
120
+ // Convert lists
121
+ .replace(/<li[^>]*>(.*?)<\/li>/gi, '- $1\n')
122
+ .replace(/<\/?[ou]l[^>]*>/gi, '\n')
123
+ // Convert paragraphs
124
+ .replace(/<p[^>]*>(.*?)<\/p>/gi, '$1\n\n')
125
+ // Convert code blocks
126
+ .replace(/<pre[^>]*><code[^>]*>([\s\S]*?)<\/code><\/pre>/gi, '```\n$1\n```\n\n')
127
+ .replace(/<code[^>]*>(.*?)<\/code>/gi, '`$1`')
128
+ // Convert emphasis
129
+ .replace(/<(?:strong|b)[^>]*>(.*?)<\/(?:strong|b)>/gi, '**$1**')
130
+ .replace(/<(?:em|i)[^>]*>(.*?)<\/(?:em|i)>/gi, '*$1*')
131
+ // Convert line breaks
132
+ .replace(/<br\s*\/?>/gi, '\n')
133
+ // Remove remaining tags
134
+ .replace(/<[^>]+>/g, '')
135
+ // Clean whitespace
136
+ .replace(/\n\s*\n\s*\n/g, '\n\n')
137
+ .trim();
138
+ }
139
+ /**
140
+ * Extract relevant tags from rule content
141
+ */
142
+ function extractTagsFromContent(content, category) {
143
+ const tags = new Set([category]);
144
+ // Common technology patterns to detect
145
+ const patterns = {
146
+ 'typescript': /typescript|\.ts\b/i,
147
+ 'javascript': /javascript|\.js\b/i,
148
+ 'react': /\breact\b|jsx|tsx/i,
149
+ 'next.js': /next\.?js|nextjs/i,
150
+ 'vue': /\bvue\b|vuejs/i,
151
+ 'svelte': /\bsvelte\b/i,
152
+ 'angular': /\bangular\b/i,
153
+ 'node.js': /node\.?js|nodejs/i,
154
+ 'python': /\bpython\b|\.py\b/i,
155
+ 'django': /\bdjango\b/i,
156
+ 'fastapi': /\bfastapi\b/i,
157
+ 'flask': /\bflask\b/i,
158
+ 'tailwindcss': /tailwind/i,
159
+ 'prisma': /\bprisma\b/i,
160
+ 'graphql': /\bgraphql\b/i,
161
+ 'rest-api': /rest\s*api|restful/i,
162
+ 'testing': /\btest\b|jest|vitest|playwright|cypress/i,
163
+ 'docker': /\bdocker\b/i,
164
+ 'kubernetes': /\bkubernetes\b|k8s/i,
165
+ 'aws': /\baws\b|amazon web services/i,
166
+ 'supabase': /\bsupabase\b/i,
167
+ 'firebase': /\bfirebase\b/i,
168
+ 'mongodb': /\bmongodb\b|mongo\b/i,
169
+ 'postgresql': /\bpostgresql\b|postgres\b/i,
170
+ 'mysql': /\bmysql\b/i,
171
+ 'redis': /\bredis\b/i,
172
+ 'security': /security|authentication|authorization/i,
173
+ 'performance': /performance|optimization|caching/i,
174
+ 'accessibility': /accessibility|a11y|aria/i,
175
+ 'seo': /\bseo\b|search engine/i
176
+ };
177
+ for (const [tag, pattern] of Object.entries(patterns)) {
178
+ if (pattern.test(content)) {
179
+ tags.add(tag);
180
+ }
181
+ }
182
+ return Array.from(tags);
183
+ }
184
+ /**
185
+ * Parse category page to extract rule links
186
+ */
187
+ function parseCategoryPage(html) {
188
+ const slugs = [];
189
+ // Find all rule links on the category page
190
+ const linkPattern = /href="\/([a-z0-9-]+)"/gi;
191
+ let match;
192
+ while ((match = linkPattern.exec(html)) !== null) {
193
+ const slug = match[1];
194
+ // Filter out non-rule links
195
+ if (slug &&
196
+ !slug.startsWith('rules/') &&
197
+ !['login', 'rules', 'board', 'jobs', 'mcp', 'generate', 'members'].includes(slug) &&
198
+ !slug.includes('/')) {
199
+ slugs.push(slug);
200
+ }
201
+ }
202
+ return [...new Set(slugs)]; // Remove duplicates
203
+ }
204
+ /**
205
+ * Fetch a single rule from cursor.directory
206
+ */
207
+ export async function fetchCursorDirectoryRule(slug, category = 'general') {
208
+ // Check cache first
209
+ const cacheKey = `${category}-${slug}`;
210
+ if (rulesCache.has(cacheKey)) {
211
+ return rulesCache.get(cacheKey);
212
+ }
213
+ try {
214
+ const url = `${BASE_URL}/${slug}`;
215
+ const response = await fetch(url, {
216
+ headers: {
217
+ 'User-Agent': 'StackGuide-MCP/1.0 (Cursor Rules Integration)',
218
+ 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
219
+ }
220
+ });
221
+ if (!response.ok) {
222
+ console.error(`Failed to fetch rule ${slug}: ${response.status}`);
223
+ return null;
224
+ }
225
+ const html = await response.text();
226
+ const rule = extractRuleFromHtml(html, slug, category);
227
+ if (rule) {
228
+ rulesCache.set(cacheKey, rule);
229
+ }
230
+ return rule;
231
+ }
232
+ catch (error) {
233
+ console.error(`Error fetching cursor directory rule: ${error}`);
234
+ return null;
235
+ }
236
+ }
237
+ /**
238
+ * Browse rules by category
239
+ */
240
+ export async function browseCursorDirectoryCategory(category) {
241
+ // Check cache
242
+ if (categoryCache.has(category)) {
243
+ return categoryCache.get(category);
244
+ }
245
+ try {
246
+ const url = `${BASE_URL}/rules/${category}`;
247
+ const response = await fetch(url, {
248
+ headers: {
249
+ 'User-Agent': 'StackGuide-MCP/1.0 (Cursor Rules Integration)',
250
+ 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
251
+ }
252
+ });
253
+ if (!response.ok) {
254
+ console.error(`Failed to fetch category ${category}: ${response.status}`);
255
+ return [];
256
+ }
257
+ const html = await response.text();
258
+ const slugs = parseCategoryPage(html);
259
+ // Fetch first 10 rules to avoid too many requests
260
+ const rules = [];
261
+ for (const slug of slugs.slice(0, 10)) {
262
+ const rule = await fetchCursorDirectoryRule(slug, category);
263
+ if (rule) {
264
+ rules.push(rule);
265
+ }
266
+ // Small delay to be respectful
267
+ await new Promise(resolve => setTimeout(resolve, 100));
268
+ }
269
+ categoryCache.set(category, rules);
270
+ return rules;
271
+ }
272
+ catch (error) {
273
+ console.error(`Error browsing cursor directory category: ${error}`);
274
+ return [];
275
+ }
276
+ }
277
+ /**
278
+ * Search for rules across cursor.directory
279
+ */
280
+ export async function searchCursorDirectory(query) {
281
+ const results = [];
282
+ const queryLower = query.toLowerCase();
283
+ // First check in cache
284
+ for (const rule of rulesCache.values()) {
285
+ if (rule.title.toLowerCase().includes(queryLower) ||
286
+ rule.description.toLowerCase().includes(queryLower) ||
287
+ rule.tags.some(t => t.toLowerCase().includes(queryLower))) {
288
+ results.push(rule);
289
+ }
290
+ }
291
+ // If we found results in cache, return them
292
+ if (results.length > 0) {
293
+ return results;
294
+ }
295
+ // Otherwise, try to search by matching category
296
+ const matchingCategories = CURSOR_DIRECTORY_CATEGORIES.filter(cat => cat.toLowerCase().includes(queryLower) || queryLower.includes(cat));
297
+ for (const category of matchingCategories.slice(0, 3)) {
298
+ const categoryRules = await browseCursorDirectoryCategory(category);
299
+ results.push(...categoryRules);
300
+ }
301
+ return results;
302
+ }
303
+ /**
304
+ * Get list of available categories
305
+ */
306
+ export function getCursorDirectoryCategories() {
307
+ return [...CURSOR_DIRECTORY_CATEGORIES];
308
+ }
309
+ /**
310
+ * Get popular/featured rules
311
+ */
312
+ export async function getPopularCursorDirectoryRules() {
313
+ const popularSlugs = [
314
+ { slug: 'nextjs-react-typescript-cursor-rules', category: 'typescript' },
315
+ { slug: 'react-native-cursor-rules', category: 'react-native' },
316
+ { slug: 'python-django-cursor-rules', category: 'python' },
317
+ { slug: 'fastapi-python-cursor-rules', category: 'python' },
318
+ { slug: 'vuejs-typescript-best-practices', category: 'vue' },
319
+ { slug: 'tailwind-css-cursor-rules', category: 'tailwindcss' },
320
+ { slug: 'prisma-orm-cursor-rules', category: 'prisma' },
321
+ { slug: 'nestjs-clean-typescript-cursor-rules', category: 'typescript' }
322
+ ];
323
+ const rules = [];
324
+ for (const { slug, category } of popularSlugs) {
325
+ const rule = await fetchCursorDirectoryRule(slug, category);
326
+ if (rule) {
327
+ rules.push(rule);
328
+ }
329
+ }
330
+ return rules;
331
+ }
332
+ /**
333
+ * Import a rule from cursor.directory into user's local rules
334
+ */
335
+ export function formatRuleForImport(rule) {
336
+ return `# ${rule.title}
337
+
338
+ > Imported from cursor.directory
339
+ > URL: ${rule.url}
340
+ > Category: ${rule.category}
341
+ > Tags: ${rule.tags.join(', ')}
342
+
343
+ ---
344
+
345
+ ${rule.content}
346
+
347
+ ---
348
+ *Fetched: ${rule.fetchedAt}*
349
+ `;
350
+ }
351
+ /**
352
+ * Clear the cursor directory cache
353
+ */
354
+ export function clearCursorDirectoryCache() {
355
+ rulesCache.clear();
356
+ categoryCache.clear();
357
+ }
358
+ /**
359
+ * Get cache stats
360
+ */
361
+ export function getCacheStats() {
362
+ return {
363
+ rules: rulesCache.size,
364
+ categories: categoryCache.size
365
+ };
366
+ }
367
+ //# sourceMappingURL=cursorDirectory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursorDirectory.js","sourceRoot":"","sources":["../../src/services/cursorDirectory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAeH,2CAA2C;AAC3C,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,YAAY;IACZ,QAAQ;IACR,SAAS;IACT,OAAO;IACP,KAAK;IACL,YAAY;IACZ,aAAa;IACb,SAAS;IACT,GAAG;IACH,iBAAiB;IACjB,kBAAkB;IAClB,MAAM;IACN,cAAc;IACd,SAAS;IACT,UAAU;IACV,SAAS;IACT,MAAM;IACN,UAAU;IACV,KAAK;IACL,QAAQ;IACR,MAAM;IACN,IAAI;IACJ,OAAO;IACP,QAAQ;IACR,MAAM;IACN,MAAM;IACN,QAAQ;IACR,SAAS;IACT,SAAS;IACT,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,YAAY;IACZ,SAAS;IACT,KAAK;IACL,QAAQ;IACR,YAAY;CACJ,CAAC;AAIX,0BAA0B;AAC1B,MAAM,UAAU,GAAqC,IAAI,GAAG,EAAE,CAAC;AAC/D,MAAM,aAAa,GAAuC,IAAI,GAAG,EAAE,CAAC;AAEpE,gCAAgC;AAChC,MAAM,QAAQ,GAAG,0BAA0B,CAAC;AAE5C;;GAEG;AACH,SAAS,mBAAmB,CAAC,IAAY,EAAE,IAAY,EAAE,QAAgB;IACvE,IAAI,CAAC;QACH,gBAAgB;QAChB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC;eACnD,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAE1F,8DAA8D;QAC9D,IAAI,OAAO,GAAG,EAAE,CAAC;QAEjB,2CAA2C;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;QAC/E,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,qDAAqD;YACrD,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;YACnF,IAAI,YAAY,EAAE,CAAC;gBACjB,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,0BAA0B;QAC1B,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAEpC,mDAAmD;QACnD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,iDAAiD,CAAC;eAC1E,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACzC,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,eAAe,CAAC;QAE9E,4BAA4B;QAC5B,MAAM,IAAI,GAAG,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAEvD,OAAO;YACL,EAAE,EAAE,oBAAoB,QAAQ,IAAI,IAAI,EAAE;YAC1C,IAAI;YACJ,KAAK;YACL,WAAW;YACX,OAAO;YACP,QAAQ;YACR,IAAI;YACJ,GAAG,EAAE,GAAG,QAAQ,IAAI,IAAI,EAAE;YAC1B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,oCAAoC,KAAK,EAAE,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,IAAY;IACpC,OAAO,IAAI;QACT,6BAA6B;SAC5B,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;QACxB,kBAAkB;SACjB,OAAO,CAAC,wBAAwB,EAAE,UAAU,CAAC;SAC7C,OAAO,CAAC,wBAAwB,EAAE,WAAW,CAAC;SAC9C,OAAO,CAAC,wBAAwB,EAAE,YAAY,CAAC;SAC/C,OAAO,CAAC,wBAAwB,EAAE,aAAa,CAAC;QACjD,gBAAgB;SACf,OAAO,CAAC,wBAAwB,EAAE,QAAQ,CAAC;SAC3C,OAAO,CAAC,mBAAmB,EAAE,IAAI,CAAC;QACnC,qBAAqB;SACpB,OAAO,CAAC,sBAAsB,EAAE,QAAQ,CAAC;QAC1C,sBAAsB;SACrB,OAAO,CAAC,kDAAkD,EAAE,kBAAkB,CAAC;SAC/E,OAAO,CAAC,4BAA4B,EAAE,MAAM,CAAC;QAC9C,mBAAmB;SAClB,OAAO,CAAC,4CAA4C,EAAE,QAAQ,CAAC;SAC/D,OAAO,CAAC,oCAAoC,EAAE,MAAM,CAAC;QACtD,sBAAsB;SACrB,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC;QAC9B,wBAAwB;SACvB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;QACxB,mBAAmB;SAClB,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC;SAChC,IAAI,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAAC,OAAe,EAAE,QAAgB;IAC/D,MAAM,IAAI,GAAG,IAAI,GAAG,CAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEzC,uCAAuC;IACvC,MAAM,QAAQ,GAA2B;QACvC,YAAY,EAAE,oBAAoB;QAClC,YAAY,EAAE,oBAAoB;QAClC,OAAO,EAAE,oBAAoB;QAC7B,SAAS,EAAE,mBAAmB;QAC9B,KAAK,EAAE,gBAAgB;QACvB,QAAQ,EAAE,aAAa;QACvB,SAAS,EAAE,cAAc;QACzB,SAAS,EAAE,mBAAmB;QAC9B,QAAQ,EAAE,oBAAoB;QAC9B,QAAQ,EAAE,aAAa;QACvB,SAAS,EAAE,cAAc;QACzB,OAAO,EAAE,YAAY;QACrB,aAAa,EAAE,WAAW;QAC1B,QAAQ,EAAE,aAAa;QACvB,SAAS,EAAE,cAAc;QACzB,UAAU,EAAE,qBAAqB;QACjC,SAAS,EAAE,0CAA0C;QACrD,QAAQ,EAAE,aAAa;QACvB,YAAY,EAAE,qBAAqB;QACnC,KAAK,EAAE,8BAA8B;QACrC,UAAU,EAAE,eAAe;QAC3B,UAAU,EAAE,eAAe;QAC3B,SAAS,EAAE,sBAAsB;QACjC,YAAY,EAAE,4BAA4B;QAC1C,OAAO,EAAE,YAAY;QACrB,OAAO,EAAE,YAAY;QACrB,UAAU,EAAE,wCAAwC;QACpD,aAAa,EAAE,mCAAmC;QAClD,eAAe,EAAE,0BAA0B;QAC3C,KAAK,EAAE,wBAAwB;KAChC,CAAC;IAEF,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtD,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,2CAA2C;IAC3C,MAAM,WAAW,GAAG,yBAAyB,CAAC;IAC9C,IAAI,KAAK,CAAC;IAEV,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,4BAA4B;QAC5B,IAAI,IAAI;YACJ,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAC1B,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjF,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,oBAAoB;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,IAAY,EAAE,WAAmB,SAAS;IACvF,oBAAoB;IACpB,MAAM,QAAQ,GAAG,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAC;IACvC,IAAI,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;IACnC,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,OAAO,EAAE;gBACP,YAAY,EAAE,+CAA+C;gBAC7D,QAAQ,EAAE,iEAAiE;aAC5E;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,CAAC,wBAAwB,IAAI,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAClE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QAEvD,IAAI,IAAI,EAAE,CAAC;YACT,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACjC,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,yCAAyC,KAAK,EAAE,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAAC,QAAgB;IAClE,cAAc;IACd,IAAI,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChC,OAAO,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;IACtC,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,GAAG,QAAQ,UAAU,QAAQ,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,OAAO,EAAE;gBACP,YAAY,EAAE,+CAA+C;gBAC7D,QAAQ,EAAE,iEAAiE;aAC5E;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,CAAC,4BAA4B,QAAQ,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAC1E,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEtC,kDAAkD;QAClD,MAAM,KAAK,GAA0B,EAAE,CAAC;QACxC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,MAAM,wBAAwB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC5D,IAAI,IAAI,EAAE,CAAC;gBACT,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;YACD,+BAA+B;YAC/B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACzD,CAAC;QAED,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACnC,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,6CAA6C,KAAK,EAAE,CAAC,CAAC;QACpE,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,KAAa;IACvD,MAAM,OAAO,GAA0B,EAAE,CAAC;IAC1C,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAEvC,uBAAuB;IACvB,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;QACvC,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;YAC7C,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;YACnD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YAC9D,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,4CAA4C;IAC5C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,gDAAgD;IAChD,MAAM,kBAAkB,GAAG,2BAA2B,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAClE,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CACnE,CAAC;IAEF,KAAK,MAAM,QAAQ,IAAI,kBAAkB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACtD,MAAM,aAAa,GAAG,MAAM,6BAA6B,CAAC,QAAQ,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,4BAA4B;IAC1C,OAAO,CAAC,GAAG,2BAA2B,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,8BAA8B;IAClD,MAAM,YAAY,GAAG;QACnB,EAAE,IAAI,EAAE,sCAAsC,EAAE,QAAQ,EAAE,YAAY,EAAE;QACxE,EAAE,IAAI,EAAE,2BAA2B,EAAE,QAAQ,EAAE,cAAc,EAAE;QAC/D,EAAE,IAAI,EAAE,4BAA4B,EAAE,QAAQ,EAAE,QAAQ,EAAE;QAC1D,EAAE,IAAI,EAAE,6BAA6B,EAAE,QAAQ,EAAE,QAAQ,EAAE;QAC3D,EAAE,IAAI,EAAE,iCAAiC,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC5D,EAAE,IAAI,EAAE,2BAA2B,EAAE,QAAQ,EAAE,aAAa,EAAE;QAC9D,EAAE,IAAI,EAAE,yBAAyB,EAAE,QAAQ,EAAE,QAAQ,EAAE;QACvD,EAAE,IAAI,EAAE,sCAAsC,EAAE,QAAQ,EAAE,YAAY,EAAE;KACzE,CAAC;IAEF,MAAM,KAAK,GAA0B,EAAE,CAAC;IAExC,KAAK,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,YAAY,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,MAAM,wBAAwB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC5D,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAyB;IAC3D,OAAO,KAAK,IAAI,CAAC,KAAK;;;SAGf,IAAI,CAAC,GAAG;cACH,IAAI,CAAC,QAAQ;UACjB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;;;;EAI5B,IAAI,CAAC,OAAO;;;YAGF,IAAI,CAAC,SAAS;CACzB,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB;IACvC,UAAU,CAAC,KAAK,EAAE,CAAC;IACnB,aAAa,CAAC,KAAK,EAAE,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO;QACL,KAAK,EAAE,UAAU,CAAC,IAAI;QACtB,UAAU,EAAE,aAAa,CAAC,IAAI;KAC/B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { Rule, RuleCategory, ProjectType } from '../config/types.js';
2
+ export declare const RULE_TEMPLATES: Record<string, {
3
+ name: string;
4
+ content: string;
5
+ }>;
6
+ export declare function createUserRule(projectType: ProjectType, category: RuleCategory, name: string, content: string, description?: string): Rule;
7
+ export declare function createRuleFromTemplate(projectType: ProjectType, category: RuleCategory, templateId: string, name: string, description: string, language?: string): Rule | null;
8
+ export declare function getUserRules(projectType: ProjectType): Rule[];
9
+ export declare function updateUserRule(ruleId: string, updates: Partial<Pick<Rule, 'name' | 'content' | 'description' | 'enabled' | 'priority'>>): Rule | null;
10
+ export declare function deleteUserRule(ruleId: string): boolean;
11
+ export declare function listTemplates(): {
12
+ id: string;
13
+ name: string;
14
+ }[];
15
+ export declare function getTemplateContent(templateId: string): string | null;
16
+ export declare function exportAllUserRules(): string;
17
+ export declare function importUserRules(jsonString: string): number;
18
+ //# sourceMappingURL=ruleManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ruleManager.d.ts","sourceRoot":"","sources":["../../src/services/ruleManager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAOrE,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA8M5E,CAAC;AAYF,wBAAgB,cAAc,CAC5B,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,YAAY,EACtB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,WAAW,GAAE,MAAW,GACvB,IAAI,CAoBN;AAGD,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,YAAY,EACtB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,QAAQ,GAAE,MAAqB,GAC9B,IAAI,GAAG,IAAI,CAUb;AAGD,wBAAgB,YAAY,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,EAAE,CA0B7D;AAGD,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS,GAAG,UAAU,CAAC,CAAC,GACxF,IAAI,GAAG,IAAI,CA6Bb;AAGD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CA2BtD;AAGD,wBAAgB,aAAa,IAAI;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAK9D;AAGD,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEpE;AAaD,wBAAgB,kBAAkB,IAAI,MAAM,CAgB3C;AAGD,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAsB1D"}