@iress-oss/ids-mcp-server 0.0.1 → 5.14.2
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.txt +201 -0
- package/README.md +29 -159
- package/dist/componentHandlers.js +241 -0
- package/dist/componentHandlers.test.js +380 -0
- package/{build → dist}/config.js +5 -5
- package/dist/index.js +53 -0
- package/{build → dist}/iressHandlers.js +52 -46
- package/dist/iressHandlers.test.js +316 -0
- package/{build → dist}/resourceHandlers.js +23 -22
- package/dist/resourceHandlers.test.js +352 -0
- package/{build → dist}/searchHandlers.js +107 -92
- package/dist/searchHandlers.test.js +524 -0
- package/{build → dist}/toolHandler.js +13 -13
- package/dist/toolHandler.test.js +369 -0
- package/dist/tools.js +165 -0
- package/{build → dist}/utils.js +11 -15
- package/dist/utils.test.js +286 -0
- package/{docs/ids → generated/docs}/components-autocomplete-docs.md +3 -3
- package/{docs/ids → generated/docs}/components-autocomplete-recipes-docs.md +17 -51
- package/{docs/ids → generated/docs}/components-card-recipes-docs.md +1 -1
- package/{docs/ids → generated/docs}/components-checkbox-docs.md +6 -19
- package/{docs/ids → generated/docs}/components-checkboxgroup-docs.md +18 -18
- package/{docs/ids → generated/docs}/components-checkboxgroup-recipes-docs.md +9 -9
- package/{docs/ids → generated/docs}/components-col-docs.md +1 -1
- package/{docs/ids → generated/docs}/components-combobox-docs.md +4 -4
- package/{docs/ids → generated/docs}/components-container-docs.md +8 -42
- package/{docs/ids → generated/docs}/components-filter-docs.md +14 -67
- package/{docs/ids → generated/docs}/components-form-docs.md +341 -335
- package/{docs/ids → generated/docs}/components-form-recipes-docs.md +198 -1
- package/{docs/ids → generated/docs}/components-hide-docs.md +16 -70
- package/{docs/ids → generated/docs}/components-icon-docs.md +4 -4
- package/{docs/ids → generated/docs}/components-input-recipes-docs.md +2 -2
- package/{docs/ids → generated/docs}/components-inputcurrency-recipes-docs.md +6 -40
- package/{docs/ids → generated/docs}/components-modal-docs.md +3 -113
- package/generated/docs/components-popover-docs.md +464 -0
- package/{docs/ids → generated/docs}/components-radiogroup-docs.md +21 -21
- package/{docs/ids → generated/docs}/components-richselect-docs.md +149 -111
- package/{docs/ids → generated/docs}/components-row-docs.md +4 -4
- package/{docs/ids → generated/docs}/components-skeleton-docs.md +3 -3
- package/{docs/ids → generated/docs}/components-skeleton-recipes-docs.md +1 -1
- package/{docs/ids → generated/docs}/components-skiplink-docs.md +1 -1
- package/{docs/ids → generated/docs}/components-slideout-docs.md +3 -113
- package/{docs/ids → generated/docs}/components-table-ag-grid-docs.md +109 -137
- package/{docs/ids → generated/docs}/components-table-docs.md +92 -597
- package/{docs/ids → generated/docs}/components-tabset-docs.md +2 -2
- package/{docs/ids → generated/docs}/components-tag-docs.md +1 -1
- package/{docs/ids → generated/docs}/components-toaster-docs.md +5 -5
- package/{docs/ids → generated/docs}/extensions-editor-docs.md +4 -4
- package/generated/docs/foundations-accessibility-docs.md +62 -0
- package/{docs/ids → generated/docs}/foundations-colours-docs.md +1 -1
- package/generated/docs/foundations-consistency-docs.md +52 -0
- package/generated/docs/foundations-content-docs.md +23 -0
- package/generated/docs/foundations-introduction-docs.md +17 -0
- package/generated/docs/foundations-principles-docs.md +70 -0
- package/{docs/ids → generated/docs}/foundations-typography-docs.md +7 -2
- package/generated/docs/foundations-user-experience-docs.md +63 -0
- package/generated/docs/foundations-visual-design-docs.md +46 -0
- package/{docs/ids → generated/docs}/get-started-develop-docs.md +3 -3
- package/generated/docs/guidelines.md +812 -0
- package/{docs/ids → generated/docs}/introduction-docs.md +4 -4
- package/{docs/ids → generated/docs}/patterns-loading-docs.md +332 -2
- package/generated/docs/resources-migration-guides-from-v4-to-v5-docs.md +437 -0
- package/generated/docs/themes-available-themes-docs.md +66 -0
- package/generated/docs/themes-tokens-docs.md +1200 -0
- package/generated/docs/versions-docs.md +17 -0
- package/package.json +42 -14
- package/LICENSE +0 -193
- package/build/componentHandlers.js +0 -205
- package/build/index.js +0 -51
- package/build/tools.js +0 -165
- package/docs/api-reference.md +0 -0
- package/docs/best-practices.md +0 -0
- package/docs/configuration.md +0 -0
- package/docs/examples.md +0 -0
- package/docs/guidelines.md +0 -269
- package/docs/ids/components-popover-docs.md +0 -4
- package/docs/ids/resources-migration-guides-from-v4-to-v5-docs.md +0 -639
- package/docs/ids/themes-available-themes-docs.md +0 -74
- package/docs/ids/themes-tokens-docs.md +0 -4580
- package/docs/ids/versions-docs.md +0 -27
- package/docs/tutorials/basic-integration.md +0 -0
- /package/{build → dist}/types.js +0 -0
- /package/{docs/ids → generated/docs}/components-alert-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-badge-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-button-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-button-recipes-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-buttongroup-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-card-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-divider-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-expander-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-field-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-inline-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-input-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-inputcurrency-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-label-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-menu-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-menu-menuitem-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-navbar-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-navbar-recipes-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-panel-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-placeholder-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-popover-recipes-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-progress-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-radio-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-readonly-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-select-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-slider-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-spinner-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-stack-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-tabset-tab-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-text-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-toaster-toast-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-toggle-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-tooltip-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-validationmessage-docs.md +0 -0
- /package/{docs/ids → generated/docs}/contact-us-docs.md +0 -0
- /package/{docs/ids → generated/docs}/extensions-editor-recipes-docs.md +0 -0
- /package/{docs/ids → generated/docs}/frequently-asked-questions-docs.md +0 -0
- /package/{docs/ids → generated/docs}/get-started-using-storybook-docs.md +0 -0
- /package/{docs/ids → generated/docs}/resources-changelog-docs.md +0 -0
- /package/{docs/ids → generated/docs}/resources-code-katas-docs.md +0 -0
- /package/{docs/ids → generated/docs}/themes-introduction-docs.md +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Tool handlers for search and documentation operations
|
|
3
3
|
*/
|
|
4
|
-
import { z } from
|
|
5
|
-
import * as path from
|
|
6
|
-
import { getMarkdownFiles, readFileContent } from
|
|
7
|
-
import { DOCS_DIR } from
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
import { getMarkdownFiles, readFileContent } from './utils.js';
|
|
7
|
+
import { DOCS_DIR } from './config.js';
|
|
8
8
|
export function handleGetUsageExamples(args) {
|
|
9
9
|
const schema = z.object({
|
|
10
10
|
component: z.string(),
|
|
@@ -14,18 +14,18 @@ export function handleGetUsageExamples(args) {
|
|
|
14
14
|
const markdownFiles = getMarkdownFiles();
|
|
15
15
|
// Find component files (main + recipes)
|
|
16
16
|
const componentFiles = markdownFiles.filter((file) => file.includes(`${component.toLowerCase()}`) ||
|
|
17
|
-
(file.includes(
|
|
17
|
+
(file.includes('recipes') &&
|
|
18
18
|
file.toLowerCase().includes(component.toLowerCase())));
|
|
19
19
|
if (componentFiles.length === 0) {
|
|
20
20
|
return {
|
|
21
21
|
content: [
|
|
22
22
|
{
|
|
23
|
-
type:
|
|
23
|
+
type: 'text',
|
|
24
24
|
text: `No examples found for "${component}". Try: ${markdownFiles
|
|
25
|
-
.filter((f) => f.startsWith(
|
|
25
|
+
.filter((f) => f.startsWith('components-'))
|
|
26
26
|
.slice(0, 5)
|
|
27
|
-
.map((f) => f.replace(
|
|
28
|
-
.join(
|
|
27
|
+
.map((f) => f.replace('components-', '').replace('-docs.md', ''))
|
|
28
|
+
.join(', ')}`,
|
|
29
29
|
},
|
|
30
30
|
],
|
|
31
31
|
};
|
|
@@ -36,8 +36,8 @@ export function handleGetUsageExamples(args) {
|
|
|
36
36
|
const filePath = path.join(DOCS_DIR, file);
|
|
37
37
|
const content = readFileContent(filePath);
|
|
38
38
|
// Extract code examples
|
|
39
|
-
const codeBlocks = content.match(/```[\s\S]*?```/g)
|
|
40
|
-
const jsxBlocks = content.match(/<[A-Z][^>]*>[\s\S]*?<\/[A-Z][^>]*>/g)
|
|
39
|
+
const codeBlocks = content.match(/```[\s\S]*?```/g) ?? [];
|
|
40
|
+
const jsxBlocks = content.match(/<[A-Z][^>]*>[\s\S]*?<\/[A-Z][^>]*>/g) ?? [];
|
|
41
41
|
if (pattern) {
|
|
42
42
|
// Filter examples by pattern
|
|
43
43
|
const patternMatches = [...codeBlocks, ...jsxBlocks].filter((block) => block.toLowerCase().includes(pattern.toLowerCase()));
|
|
@@ -51,13 +51,18 @@ export function handleGetUsageExamples(args) {
|
|
|
51
51
|
console.error(`Error reading file ${file}:`, error);
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
|
+
const patternSuffix = pattern ? ` (${pattern} pattern)` : '';
|
|
55
|
+
const patternNotFoundSuffix = pattern ? ` with pattern "${pattern}"` : '';
|
|
56
|
+
const examplesText = examples.length > 0
|
|
57
|
+
? `**${component} Usage Examples**${patternSuffix}:\n\n${examples
|
|
58
|
+
.slice(0, 5)
|
|
59
|
+
.join('\n\n---\n\n')}`
|
|
60
|
+
: `No usage examples found for "${component}"${patternNotFoundSuffix}.`;
|
|
54
61
|
return {
|
|
55
62
|
content: [
|
|
56
63
|
{
|
|
57
|
-
type:
|
|
58
|
-
text:
|
|
59
|
-
? `**${component} Usage Examples**${pattern ? ` (${pattern} pattern)` : ""}:\n\n${examples.slice(0, 5).join("\n\n---\n\n")}`
|
|
60
|
-
: `No usage examples found for "${component}"${pattern ? ` with pattern "${pattern}"` : ""}.`,
|
|
64
|
+
type: 'text',
|
|
65
|
+
text: examplesText,
|
|
61
66
|
},
|
|
62
67
|
],
|
|
63
68
|
};
|
|
@@ -74,7 +79,7 @@ export function handleSearchIdsDocs(args) {
|
|
|
74
79
|
try {
|
|
75
80
|
const filePath = path.join(DOCS_DIR, file);
|
|
76
81
|
const content = readFileContent(filePath);
|
|
77
|
-
const lines = content.split(
|
|
82
|
+
const lines = content.split('\n');
|
|
78
83
|
lines.forEach((line, index) => {
|
|
79
84
|
const searchLine = case_sensitive ? line : line.toLowerCase();
|
|
80
85
|
const searchQuery = case_sensitive ? query : query.toLowerCase();
|
|
@@ -82,9 +87,9 @@ export function handleSearchIdsDocs(args) {
|
|
|
82
87
|
// Get context (surrounding lines)
|
|
83
88
|
const contextStart = Math.max(0, index - 1);
|
|
84
89
|
const contextEnd = Math.min(lines.length - 1, index + 1);
|
|
85
|
-
const context = lines.slice(contextStart, contextEnd + 1).join(
|
|
90
|
+
const context = lines.slice(contextStart, contextEnd + 1).join('\n');
|
|
86
91
|
results.push({
|
|
87
|
-
file: file.replace(
|
|
92
|
+
file: file.replace('-docs.md', '').replace(/^[a-z]+-/, ''),
|
|
88
93
|
line: index + 1,
|
|
89
94
|
content: line.trim(),
|
|
90
95
|
context,
|
|
@@ -99,12 +104,12 @@ export function handleSearchIdsDocs(args) {
|
|
|
99
104
|
return {
|
|
100
105
|
content: [
|
|
101
106
|
{
|
|
102
|
-
type:
|
|
107
|
+
type: 'text',
|
|
103
108
|
text: results.length > 0
|
|
104
109
|
? `Found ${results.length} matches in IDS documentation:\n\n${results
|
|
105
110
|
.slice(0, 15) // Limit results
|
|
106
111
|
.map((r) => `**${r.file}:${r.line}**\n\`\`\`\n${r.context}\n\`\`\``)
|
|
107
|
-
.join(
|
|
112
|
+
.join('\n\n')}`
|
|
108
113
|
: `No matches found for "${query}" in IDS documentation.`,
|
|
109
114
|
},
|
|
110
115
|
],
|
|
@@ -113,31 +118,32 @@ export function handleSearchIdsDocs(args) {
|
|
|
113
118
|
export function handleGetDesignTokens(args) {
|
|
114
119
|
const schema = z.object({
|
|
115
120
|
type: z
|
|
116
|
-
.enum([
|
|
117
|
-
.default(
|
|
121
|
+
.enum(['colors', 'spacing', 'typography', 'breakpoints', 'all'])
|
|
122
|
+
.default('all'),
|
|
118
123
|
});
|
|
119
124
|
const { type } = schema.parse(args);
|
|
120
125
|
const markdownFiles = getMarkdownFiles();
|
|
121
126
|
// Find foundation files related to design tokens
|
|
122
|
-
const foundationFiles = markdownFiles.filter((file) => file.startsWith(
|
|
127
|
+
const foundationFiles = markdownFiles.filter((file) => file.startsWith('foundations-') &&
|
|
128
|
+
(type === 'all' || file.includes(type)));
|
|
123
129
|
const tokenInfo = [];
|
|
124
130
|
for (const file of foundationFiles) {
|
|
125
131
|
try {
|
|
126
132
|
const filePath = path.join(DOCS_DIR, file);
|
|
127
133
|
const content = readFileContent(filePath);
|
|
128
134
|
// Extract CSS custom properties and token information
|
|
129
|
-
const cssVariables = content.match(/--iress-[a-z-]+/g)
|
|
130
|
-
const tokenSections = content.match(
|
|
135
|
+
const cssVariables = content.match(/--iress-[a-z-]+/g) ?? [];
|
|
136
|
+
const tokenSections = content.match(/#{2,3}\s+[^#\n]+/g) ?? [];
|
|
131
137
|
if (cssVariables.length > 0 || tokenSections.length > 0) {
|
|
132
138
|
let fileInfo = `**${file
|
|
133
|
-
.replace(
|
|
134
|
-
.replace(
|
|
139
|
+
.replace('foundations-', '')
|
|
140
|
+
.replace('-docs.md', '')}**\n`;
|
|
135
141
|
if (cssVariables.length > 0) {
|
|
136
142
|
const uniqueVars = [...new Set(cssVariables)].slice(0, 10);
|
|
137
|
-
fileInfo += `CSS Variables: ${uniqueVars.join(
|
|
143
|
+
fileInfo += `CSS Variables: ${uniqueVars.join(', ')}\n`;
|
|
138
144
|
}
|
|
139
145
|
if (tokenSections.length > 0) {
|
|
140
|
-
fileInfo += `\n${tokenSections.slice(0, 3).join(
|
|
146
|
+
fileInfo += `\n${tokenSections.slice(0, 3).join('\n\n')}`;
|
|
141
147
|
}
|
|
142
148
|
tokenInfo.push(fileInfo);
|
|
143
149
|
}
|
|
@@ -146,20 +152,61 @@ export function handleGetDesignTokens(args) {
|
|
|
146
152
|
console.error(`Error reading file ${file}:`, error);
|
|
147
153
|
}
|
|
148
154
|
}
|
|
155
|
+
const typeLabel = type !== 'all' ? ` (${type})` : '';
|
|
156
|
+
const typeNotFoundLabel = type !== 'all' ? ` for ${type}` : '';
|
|
149
157
|
return {
|
|
150
158
|
content: [
|
|
151
159
|
{
|
|
152
|
-
type:
|
|
160
|
+
type: 'text',
|
|
153
161
|
text: tokenInfo.length > 0
|
|
154
|
-
? `**IDS Design Tokens${
|
|
155
|
-
: `No design token information found${
|
|
156
|
-
.filter((f) => f.startsWith(
|
|
157
|
-
.map((f) => f.replace(
|
|
158
|
-
.join(
|
|
162
|
+
? `**IDS Design Tokens${typeLabel}**\n\n${tokenInfo.join('\n\n---\n\n')}`
|
|
163
|
+
: `No design token information found${typeNotFoundLabel}. Available foundations: ${markdownFiles
|
|
164
|
+
.filter((f) => f.startsWith('foundations-'))
|
|
165
|
+
.map((f) => f.replace('foundations-', '').replace('-docs.md', ''))
|
|
166
|
+
.join(', ')}`,
|
|
159
167
|
},
|
|
160
168
|
],
|
|
161
169
|
};
|
|
162
170
|
}
|
|
171
|
+
function findSectionContent(content, section) {
|
|
172
|
+
const sectionRegex = new RegExp(`(#{1,3}\\s+.*${section}.*?(?=#{1,3}|$))`, 'gis');
|
|
173
|
+
const sectionMatch = sectionRegex.exec(content);
|
|
174
|
+
if (sectionMatch) {
|
|
175
|
+
return sectionMatch[0];
|
|
176
|
+
}
|
|
177
|
+
// Try to find sections that contain the search term
|
|
178
|
+
const sections = content.split(/(?=#{1,3}\s+)/);
|
|
179
|
+
const matchingSections = sections.filter((sectionContent) => sectionContent.toLowerCase().includes(section.toLowerCase()));
|
|
180
|
+
return matchingSections.length > 0 ? matchingSections.join('\n\n') : null;
|
|
181
|
+
}
|
|
182
|
+
function addContextLines(lines, startIndex, endIndex, contextLines) {
|
|
183
|
+
for (let j = startIndex; j < endIndex; j++) {
|
|
184
|
+
if (!contextLines.includes(lines[j])) {
|
|
185
|
+
contextLines.push(lines[j]);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
function filterContentByQuery(content, query) {
|
|
190
|
+
const lines = content.split('\n');
|
|
191
|
+
const contextLines = [];
|
|
192
|
+
const queryLower = query.toLowerCase();
|
|
193
|
+
for (let i = 0; i < lines.length; i++) {
|
|
194
|
+
const line = lines[i];
|
|
195
|
+
if (line.toLowerCase().includes(queryLower)) {
|
|
196
|
+
// Add context lines before
|
|
197
|
+
const startContext = Math.max(0, i - 3);
|
|
198
|
+
addContextLines(lines, startContext, i, contextLines);
|
|
199
|
+
// Add the matching line
|
|
200
|
+
if (!contextLines.includes(line)) {
|
|
201
|
+
contextLines.push(line);
|
|
202
|
+
}
|
|
203
|
+
// Add context lines after
|
|
204
|
+
const endContext = Math.min(lines.length, i + 4);
|
|
205
|
+
addContextLines(lines, i + 1, endContext, contextLines);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return contextLines.length > 0 ? contextLines.join('\n') : null;
|
|
209
|
+
}
|
|
163
210
|
export function handleGetDesignGuidelines(args) {
|
|
164
211
|
const schema = z.object({
|
|
165
212
|
section: z.string().optional(),
|
|
@@ -168,14 +215,14 @@ export function handleGetDesignGuidelines(args) {
|
|
|
168
215
|
const { section, query } = schema.parse(args);
|
|
169
216
|
try {
|
|
170
217
|
// Read the guidelines.md file from the docs directory
|
|
171
|
-
const guidelinesPath = path.join(DOCS_DIR,
|
|
218
|
+
const guidelinesPath = path.join(DOCS_DIR, 'guidelines.md');
|
|
172
219
|
const content = readFileContent(guidelinesPath);
|
|
173
220
|
if (!content) {
|
|
174
221
|
return {
|
|
175
222
|
content: [
|
|
176
223
|
{
|
|
177
|
-
type:
|
|
178
|
-
text:
|
|
224
|
+
type: 'text',
|
|
225
|
+
text: 'Design guidelines file not found. Please ensure guidelines.md exists in the docs directory.',
|
|
179
226
|
},
|
|
180
227
|
],
|
|
181
228
|
};
|
|
@@ -183,88 +230,56 @@ export function handleGetDesignGuidelines(args) {
|
|
|
183
230
|
let filteredContent = content;
|
|
184
231
|
// Filter by section if specified
|
|
185
232
|
if (section) {
|
|
186
|
-
const
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
filteredContent = sectionMatch[0];
|
|
233
|
+
const sectionContent = findSectionContent(content, section);
|
|
234
|
+
if (sectionContent) {
|
|
235
|
+
filteredContent = sectionContent;
|
|
190
236
|
}
|
|
191
237
|
else {
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
content: [
|
|
201
|
-
{
|
|
202
|
-
type: "text",
|
|
203
|
-
text: `Section "${section}" not found in design guidelines. Available sections include: Core Design Principles, Visual Design Standards, Component Guidelines, Accessibility, Layout Systems, and Best Practices.`,
|
|
204
|
-
},
|
|
205
|
-
],
|
|
206
|
-
};
|
|
207
|
-
}
|
|
238
|
+
return {
|
|
239
|
+
content: [
|
|
240
|
+
{
|
|
241
|
+
type: 'text',
|
|
242
|
+
text: `Section "${section}" not found in design guidelines. Available sections include: Core Design Principles, Visual Design Standards, Component Guidelines, Accessibility, Layout Systems, and Best Practices.`,
|
|
243
|
+
},
|
|
244
|
+
],
|
|
245
|
+
};
|
|
208
246
|
}
|
|
209
247
|
}
|
|
210
248
|
// Filter by query if specified
|
|
211
249
|
if (query) {
|
|
212
|
-
const
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
for (let i = 0; i < lines.length; i++) {
|
|
216
|
-
const line = lines[i];
|
|
217
|
-
if (line.toLowerCase().includes(query.toLowerCase())) {
|
|
218
|
-
// Add context lines before
|
|
219
|
-
const startContext = Math.max(0, i - 3);
|
|
220
|
-
for (let j = startContext; j < i; j++) {
|
|
221
|
-
if (!contextLines.includes(lines[j])) {
|
|
222
|
-
contextLines.push(lines[j]);
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
// Add the matching line
|
|
226
|
-
if (!contextLines.includes(line)) {
|
|
227
|
-
contextLines.push(line);
|
|
228
|
-
}
|
|
229
|
-
// Add context lines after
|
|
230
|
-
const endContext = Math.min(lines.length, i + 4);
|
|
231
|
-
for (let j = i + 1; j < endContext; j++) {
|
|
232
|
-
if (!contextLines.includes(lines[j])) {
|
|
233
|
-
contextLines.push(lines[j]);
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
if (contextLines.length > 0) {
|
|
239
|
-
filteredContent = contextLines.join("\n");
|
|
250
|
+
const queryContent = filterContentByQuery(filteredContent, query);
|
|
251
|
+
if (queryContent) {
|
|
252
|
+
filteredContent = queryContent;
|
|
240
253
|
}
|
|
241
254
|
else {
|
|
242
255
|
return {
|
|
243
256
|
content: [
|
|
244
257
|
{
|
|
245
|
-
type:
|
|
258
|
+
type: 'text',
|
|
246
259
|
text: `No guidelines found matching "${query}". Try searching for terms like: accessibility, typography, colors, spacing, components, principles, or usability.`,
|
|
247
260
|
},
|
|
248
261
|
],
|
|
249
262
|
};
|
|
250
263
|
}
|
|
251
264
|
}
|
|
265
|
+
const sectionSuffix = section ? ` - ${section}` : '';
|
|
266
|
+
const querySuffix = query ? ` (filtered by: ${query})` : '';
|
|
252
267
|
return {
|
|
253
268
|
content: [
|
|
254
269
|
{
|
|
255
|
-
type:
|
|
256
|
-
text: `**IDS Design Guidelines${
|
|
270
|
+
type: 'text',
|
|
271
|
+
text: `**IDS Design Guidelines${sectionSuffix}${querySuffix}**\n\n${filteredContent}`,
|
|
257
272
|
},
|
|
258
273
|
],
|
|
259
274
|
};
|
|
260
275
|
}
|
|
261
276
|
catch (error) {
|
|
262
|
-
console.error(
|
|
277
|
+
console.error('Error reading guidelines:', error);
|
|
263
278
|
return {
|
|
264
279
|
content: [
|
|
265
280
|
{
|
|
266
|
-
type:
|
|
267
|
-
text:
|
|
281
|
+
type: 'text',
|
|
282
|
+
text: 'Error reading design guidelines. Please ensure the guidelines.md file exists and is accessible.',
|
|
268
283
|
},
|
|
269
284
|
],
|
|
270
285
|
};
|