@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.
- package/LICENSE +674 -0
- package/README.md +453 -0
- package/data/knowledge/python-django/architecture/architecture-patterns.md +201 -0
- package/data/knowledge/python-django/common-issues/common-issues.md +181 -0
- package/data/knowledge/python-django/patterns/drf-patterns.md +133 -0
- package/data/knowledge/react-node/architecture/node-architecture.md +257 -0
- package/data/knowledge/react-node/common-issues/common-issues.md +262 -0
- package/data/knowledge/react-node/patterns/react-patterns.md +244 -0
- package/data/rules/python-django/best-practices/django-best-practices.md +120 -0
- package/data/rules/python-django/coding-standards/django-standards.md +104 -0
- package/data/rules/python-django/security/security-guidelines.md +146 -0
- package/data/rules/react-node/best-practices/react-best-practices.md +195 -0
- package/data/rules/react-node/coding-standards/node-standards.md +192 -0
- package/data/rules/react-node/coding-standards/react-standards.md +155 -0
- package/data/rules/react-node/security/security-guidelines.md +228 -0
- package/dist/config/persistence.d.ts +15 -0
- package/dist/config/persistence.d.ts.map +1 -0
- package/dist/config/persistence.js +171 -0
- package/dist/config/persistence.js.map +1 -0
- package/dist/config/types.d.ts +47 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +116 -0
- package/dist/config/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1799 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/knowledgeProvider.d.ts +10 -0
- package/dist/resources/knowledgeProvider.d.ts.map +1 -0
- package/dist/resources/knowledgeProvider.js +130 -0
- package/dist/resources/knowledgeProvider.js.map +1 -0
- package/dist/resources/rulesProvider.d.ts +10 -0
- package/dist/resources/rulesProvider.d.ts.map +1 -0
- package/dist/resources/rulesProvider.js +135 -0
- package/dist/resources/rulesProvider.js.map +1 -0
- package/dist/services/cursorDirectory.d.ts +55 -0
- package/dist/services/cursorDirectory.d.ts.map +1 -0
- package/dist/services/cursorDirectory.js +367 -0
- package/dist/services/cursorDirectory.js.map +1 -0
- package/dist/services/ruleManager.d.ts +18 -0
- package/dist/services/ruleManager.d.ts.map +1 -0
- package/dist/services/ruleManager.js +382 -0
- package/dist/services/ruleManager.js.map +1 -0
- package/dist/services/webDocumentation.d.ts +41 -0
- package/dist/services/webDocumentation.d.ts.map +1 -0
- package/dist/services/webDocumentation.js +237 -0
- package/dist/services/webDocumentation.js.map +1 -0
- 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(/ /g, ' ')
|
|
108
|
+
.replace(/&/g, '&')
|
|
109
|
+
.replace(/</g, '<')
|
|
110
|
+
.replace(/>/g, '>')
|
|
111
|
+
.replace(/"/g, '"')
|
|
112
|
+
.replace(/'/g, "'")
|
|
113
|
+
.replace(/'/g, "'")
|
|
114
|
+
.replace(///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":"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"}
|
|
@@ -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"}
|