@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.
Files changed (122) hide show
  1. package/LICENSE.txt +201 -0
  2. package/README.md +29 -159
  3. package/dist/componentHandlers.js +241 -0
  4. package/dist/componentHandlers.test.js +380 -0
  5. package/{build → dist}/config.js +5 -5
  6. package/dist/index.js +53 -0
  7. package/{build → dist}/iressHandlers.js +52 -46
  8. package/dist/iressHandlers.test.js +316 -0
  9. package/{build → dist}/resourceHandlers.js +23 -22
  10. package/dist/resourceHandlers.test.js +352 -0
  11. package/{build → dist}/searchHandlers.js +107 -92
  12. package/dist/searchHandlers.test.js +524 -0
  13. package/{build → dist}/toolHandler.js +13 -13
  14. package/dist/toolHandler.test.js +369 -0
  15. package/dist/tools.js +165 -0
  16. package/{build → dist}/utils.js +11 -15
  17. package/dist/utils.test.js +286 -0
  18. package/{docs/ids → generated/docs}/components-autocomplete-docs.md +3 -3
  19. package/{docs/ids → generated/docs}/components-autocomplete-recipes-docs.md +17 -51
  20. package/{docs/ids → generated/docs}/components-card-recipes-docs.md +1 -1
  21. package/{docs/ids → generated/docs}/components-checkbox-docs.md +6 -19
  22. package/{docs/ids → generated/docs}/components-checkboxgroup-docs.md +18 -18
  23. package/{docs/ids → generated/docs}/components-checkboxgroup-recipes-docs.md +9 -9
  24. package/{docs/ids → generated/docs}/components-col-docs.md +1 -1
  25. package/{docs/ids → generated/docs}/components-combobox-docs.md +4 -4
  26. package/{docs/ids → generated/docs}/components-container-docs.md +8 -42
  27. package/{docs/ids → generated/docs}/components-filter-docs.md +14 -67
  28. package/{docs/ids → generated/docs}/components-form-docs.md +341 -335
  29. package/{docs/ids → generated/docs}/components-form-recipes-docs.md +198 -1
  30. package/{docs/ids → generated/docs}/components-hide-docs.md +16 -70
  31. package/{docs/ids → generated/docs}/components-icon-docs.md +4 -4
  32. package/{docs/ids → generated/docs}/components-input-recipes-docs.md +2 -2
  33. package/{docs/ids → generated/docs}/components-inputcurrency-recipes-docs.md +6 -40
  34. package/{docs/ids → generated/docs}/components-modal-docs.md +3 -113
  35. package/generated/docs/components-popover-docs.md +464 -0
  36. package/{docs/ids → generated/docs}/components-radiogroup-docs.md +21 -21
  37. package/{docs/ids → generated/docs}/components-richselect-docs.md +149 -111
  38. package/{docs/ids → generated/docs}/components-row-docs.md +4 -4
  39. package/{docs/ids → generated/docs}/components-skeleton-docs.md +3 -3
  40. package/{docs/ids → generated/docs}/components-skeleton-recipes-docs.md +1 -1
  41. package/{docs/ids → generated/docs}/components-skiplink-docs.md +1 -1
  42. package/{docs/ids → generated/docs}/components-slideout-docs.md +3 -113
  43. package/{docs/ids → generated/docs}/components-table-ag-grid-docs.md +109 -137
  44. package/{docs/ids → generated/docs}/components-table-docs.md +92 -597
  45. package/{docs/ids → generated/docs}/components-tabset-docs.md +2 -2
  46. package/{docs/ids → generated/docs}/components-tag-docs.md +1 -1
  47. package/{docs/ids → generated/docs}/components-toaster-docs.md +5 -5
  48. package/{docs/ids → generated/docs}/extensions-editor-docs.md +4 -4
  49. package/generated/docs/foundations-accessibility-docs.md +62 -0
  50. package/{docs/ids → generated/docs}/foundations-colours-docs.md +1 -1
  51. package/generated/docs/foundations-consistency-docs.md +52 -0
  52. package/generated/docs/foundations-content-docs.md +23 -0
  53. package/generated/docs/foundations-introduction-docs.md +17 -0
  54. package/generated/docs/foundations-principles-docs.md +70 -0
  55. package/{docs/ids → generated/docs}/foundations-typography-docs.md +7 -2
  56. package/generated/docs/foundations-user-experience-docs.md +63 -0
  57. package/generated/docs/foundations-visual-design-docs.md +46 -0
  58. package/{docs/ids → generated/docs}/get-started-develop-docs.md +3 -3
  59. package/generated/docs/guidelines.md +812 -0
  60. package/{docs/ids → generated/docs}/introduction-docs.md +4 -4
  61. package/{docs/ids → generated/docs}/patterns-loading-docs.md +332 -2
  62. package/generated/docs/resources-migration-guides-from-v4-to-v5-docs.md +437 -0
  63. package/generated/docs/themes-available-themes-docs.md +66 -0
  64. package/generated/docs/themes-tokens-docs.md +1200 -0
  65. package/generated/docs/versions-docs.md +17 -0
  66. package/package.json +42 -14
  67. package/LICENSE +0 -193
  68. package/build/componentHandlers.js +0 -205
  69. package/build/index.js +0 -51
  70. package/build/tools.js +0 -165
  71. package/docs/api-reference.md +0 -0
  72. package/docs/best-practices.md +0 -0
  73. package/docs/configuration.md +0 -0
  74. package/docs/examples.md +0 -0
  75. package/docs/guidelines.md +0 -269
  76. package/docs/ids/components-popover-docs.md +0 -4
  77. package/docs/ids/resources-migration-guides-from-v4-to-v5-docs.md +0 -639
  78. package/docs/ids/themes-available-themes-docs.md +0 -74
  79. package/docs/ids/themes-tokens-docs.md +0 -4580
  80. package/docs/ids/versions-docs.md +0 -27
  81. package/docs/tutorials/basic-integration.md +0 -0
  82. /package/{build → dist}/types.js +0 -0
  83. /package/{docs/ids → generated/docs}/components-alert-docs.md +0 -0
  84. /package/{docs/ids → generated/docs}/components-badge-docs.md +0 -0
  85. /package/{docs/ids → generated/docs}/components-button-docs.md +0 -0
  86. /package/{docs/ids → generated/docs}/components-button-recipes-docs.md +0 -0
  87. /package/{docs/ids → generated/docs}/components-buttongroup-docs.md +0 -0
  88. /package/{docs/ids → generated/docs}/components-card-docs.md +0 -0
  89. /package/{docs/ids → generated/docs}/components-divider-docs.md +0 -0
  90. /package/{docs/ids → generated/docs}/components-expander-docs.md +0 -0
  91. /package/{docs/ids → generated/docs}/components-field-docs.md +0 -0
  92. /package/{docs/ids → generated/docs}/components-inline-docs.md +0 -0
  93. /package/{docs/ids → generated/docs}/components-input-docs.md +0 -0
  94. /package/{docs/ids → generated/docs}/components-inputcurrency-docs.md +0 -0
  95. /package/{docs/ids → generated/docs}/components-label-docs.md +0 -0
  96. /package/{docs/ids → generated/docs}/components-menu-docs.md +0 -0
  97. /package/{docs/ids → generated/docs}/components-menu-menuitem-docs.md +0 -0
  98. /package/{docs/ids → generated/docs}/components-navbar-docs.md +0 -0
  99. /package/{docs/ids → generated/docs}/components-navbar-recipes-docs.md +0 -0
  100. /package/{docs/ids → generated/docs}/components-panel-docs.md +0 -0
  101. /package/{docs/ids → generated/docs}/components-placeholder-docs.md +0 -0
  102. /package/{docs/ids → generated/docs}/components-popover-recipes-docs.md +0 -0
  103. /package/{docs/ids → generated/docs}/components-progress-docs.md +0 -0
  104. /package/{docs/ids → generated/docs}/components-radio-docs.md +0 -0
  105. /package/{docs/ids → generated/docs}/components-readonly-docs.md +0 -0
  106. /package/{docs/ids → generated/docs}/components-select-docs.md +0 -0
  107. /package/{docs/ids → generated/docs}/components-slider-docs.md +0 -0
  108. /package/{docs/ids → generated/docs}/components-spinner-docs.md +0 -0
  109. /package/{docs/ids → generated/docs}/components-stack-docs.md +0 -0
  110. /package/{docs/ids → generated/docs}/components-tabset-tab-docs.md +0 -0
  111. /package/{docs/ids → generated/docs}/components-text-docs.md +0 -0
  112. /package/{docs/ids → generated/docs}/components-toaster-toast-docs.md +0 -0
  113. /package/{docs/ids → generated/docs}/components-toggle-docs.md +0 -0
  114. /package/{docs/ids → generated/docs}/components-tooltip-docs.md +0 -0
  115. /package/{docs/ids → generated/docs}/components-validationmessage-docs.md +0 -0
  116. /package/{docs/ids → generated/docs}/contact-us-docs.md +0 -0
  117. /package/{docs/ids → generated/docs}/extensions-editor-recipes-docs.md +0 -0
  118. /package/{docs/ids → generated/docs}/frequently-asked-questions-docs.md +0 -0
  119. /package/{docs/ids → generated/docs}/get-started-using-storybook-docs.md +0 -0
  120. /package/{docs/ids → generated/docs}/resources-changelog-docs.md +0 -0
  121. /package/{docs/ids → generated/docs}/resources-code-katas-docs.md +0 -0
  122. /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 "zod";
5
- import * as path from "path";
6
- import { getMarkdownFiles, readFileContent } from "./utils.js";
7
- import { DOCS_DIR } from "./config.js";
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("recipes") &&
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: "text",
23
+ type: 'text',
24
24
  text: `No examples found for "${component}". Try: ${markdownFiles
25
- .filter((f) => f.startsWith("components-"))
25
+ .filter((f) => f.startsWith('components-'))
26
26
  .slice(0, 5)
27
- .map((f) => f.replace("components-", "").replace("-docs.md", ""))
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: "text",
58
- text: examples.length > 0
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("\n");
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("\n");
90
+ const context = lines.slice(contextStart, contextEnd + 1).join('\n');
86
91
  results.push({
87
- file: file.replace("-docs.md", "").replace(/^[a-z]+-/, ""),
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: "text",
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("\n\n")}`
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(["colors", "spacing", "typography", "breakpoints", "all"])
117
- .default("all"),
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("foundations-") && (type === "all" || file.includes(type)));
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(/###?\s+[^#\n]+[\s\S]*?(?=###|$)/g) || [];
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("foundations-", "")
134
- .replace("-docs.md", "")}**\n`;
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(", ")}\n`;
143
+ fileInfo += `CSS Variables: ${uniqueVars.join(', ')}\n`;
138
144
  }
139
145
  if (tokenSections.length > 0) {
140
- fileInfo += `\n${tokenSections.slice(0, 3).join("\n\n")}`;
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: "text",
160
+ type: 'text',
153
161
  text: tokenInfo.length > 0
154
- ? `**IDS Design Tokens${type !== "all" ? ` (${type})` : ""}**\n\n${tokenInfo.join("\n\n---\n\n")}`
155
- : `No design token information found${type !== "all" ? ` for ${type}` : ""}. Available foundations: ${markdownFiles
156
- .filter((f) => f.startsWith("foundations-"))
157
- .map((f) => f.replace("foundations-", "").replace("-docs.md", ""))
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, "..", "guidelines.md");
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: "text",
178
- text: "Design guidelines file not found. Please ensure guidelines.md exists in the docs directory.",
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 sectionRegex = new RegExp(`(#{1,3}\\s+.*${section}.*?(?=#{1,3}|$))`, "gis");
187
- const sectionMatch = content.match(sectionRegex);
188
- if (sectionMatch) {
189
- filteredContent = sectionMatch[0];
233
+ const sectionContent = findSectionContent(content, section);
234
+ if (sectionContent) {
235
+ filteredContent = sectionContent;
190
236
  }
191
237
  else {
192
- // Try to find sections that contain the search term
193
- const sections = content.split(/(?=#{1,3}\s+)/);
194
- const matchingSections = sections.filter((section) => section.toLowerCase().includes(section.toLowerCase()));
195
- if (matchingSections.length > 0) {
196
- filteredContent = matchingSections.join("\n\n");
197
- }
198
- else {
199
- return {
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 lines = filteredContent.split("\n");
213
- const relevantLines = [];
214
- let contextLines = [];
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: "text",
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: "text",
256
- text: `**IDS Design Guidelines${section ? ` - ${section}` : ""}${query ? ` (filtered by: ${query})` : ""}**\n\n${filteredContent}`,
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("Error reading guidelines:", error);
277
+ console.error('Error reading guidelines:', error);
263
278
  return {
264
279
  content: [
265
280
  {
266
- type: "text",
267
- text: "Error reading design guidelines. Please ensure the guidelines.md file exists and is accessible.",
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
  };