@metrostar/comet-mcp 1.0.0 → 1.2.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/dist/utils.js CHANGED
@@ -1,7 +1,204 @@
1
1
  /* eslint-disable no-console */
2
- export const log = console.log;
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ export const log = console.error; // Use stderr for logging in MCP servers
3
5
  export const error = console.error;
4
6
  export const getFriendlyDirectoryName = (name) => {
5
7
  return name.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
6
8
  };
9
+ /**
10
+ * Gets components from a Comet package by reading its source files
11
+ * @param packageName - The package name (e.g., '@metrostar/comet-uswds')
12
+ * @returns Array of component names found in the package
13
+ */
14
+ export const getComponentsFromPackage = (packageName) => {
15
+ try {
16
+ const currentDir = process.env.PROJECT_ROOT || process.cwd();
17
+ // Try to find the package in the monorepo structure
18
+ const packagePath = path.join(currentDir, 'node_modules', packageName);
19
+ if (!fs.existsSync(packagePath)) {
20
+ log(`Package ${packageName} not found at ${packagePath}`);
21
+ return [];
22
+ }
23
+ // Read the source index.ts file to get component exports
24
+ const sourceIndexPath = path.join(packagePath, 'dist', 'index.d.ts');
25
+ if (!fs.existsSync(sourceIndexPath)) {
26
+ log(`Source index file not found for ${packageName}: ${sourceIndexPath}`);
27
+ return [];
28
+ }
29
+ // Read the source index file and extract export statements
30
+ const indexContent = fs.readFileSync(sourceIndexPath, 'utf8');
31
+ const components = [];
32
+ // Match export patterns like "export { default as ComponentName }"
33
+ const defaultExportMatches = indexContent.match(/export\s*{\s*default\s+as\s+(\w+)/g) || [];
34
+ defaultExportMatches.forEach((match) => {
35
+ const componentName = match.match(/as\s+(\w+)/)?.[1];
36
+ if (componentName) {
37
+ components.push(componentName);
38
+ }
39
+ });
40
+ // Match export patterns like "export { ComponentName, OtherComponent }"
41
+ const namedExportMatches = indexContent.match(/export\s*{\s*([^}]+)\s*}/g) || [];
42
+ namedExportMatches.forEach((match) => {
43
+ const exportContent = match.replace(/export\s*{\s*/, '').replace(/\s*}/, '');
44
+ const exports = exportContent.split(',').map((exp) => {
45
+ // Clean up the export name, handling "default as Name" patterns
46
+ const cleaned = exp
47
+ .trim()
48
+ .replace(/default\s+as\s+/, '')
49
+ .replace(/\s+as\s+\w+/, '');
50
+ return cleaned;
51
+ });
52
+ components.push(...exports.filter(Boolean));
53
+ });
54
+ return [...new Set(components)].sort();
55
+ }
56
+ catch (error) {
57
+ log(`Error reading package ${packageName}:`, error);
58
+ return [];
59
+ }
60
+ };
61
+ /**
62
+ * Gets detailed information about a specific Comet component
63
+ * @param componentName - The component name to search for
64
+ * @returns Component details or null if not found
65
+ */
66
+ export const getComponentDetails = (componentName) => {
67
+ try {
68
+ const currentDir = process.env.PROJECT_ROOT || process.cwd();
69
+ const packages = [
70
+ '@metrostar/comet-uswds',
71
+ '@metrostar/comet-extras',
72
+ '@metrostar/comet-data-viz',
73
+ ];
74
+ for (const packageName of packages) {
75
+ const components = getComponentsFromPackage(packageName);
76
+ if (components.includes(componentName)) {
77
+ const packageShortName = packageName.replace('@metrostar/', '');
78
+ // Try to find the component in the monorepo structure
79
+ let packagePath = path.join(currentDir, 'node_modules', packageName);
80
+ let isLocalDev = false;
81
+ if (!fs.existsSync(packagePath)) {
82
+ packagePath = path.join(currentDir, 'packages', packageShortName);
83
+ isLocalDev = true;
84
+ }
85
+ if (!fs.existsSync(packagePath)) {
86
+ continue;
87
+ }
88
+ // Look for component directory
89
+ const componentDir = findComponentDirectory(packagePath, componentName, isLocalDev);
90
+ if (!componentDir) {
91
+ continue;
92
+ }
93
+ const details = {
94
+ name: componentName,
95
+ package: packageName,
96
+ filePath: componentDir,
97
+ };
98
+ // Try to extract description and props from the component file
99
+ const componentFile = findComponentFile(componentDir, componentName, isLocalDev);
100
+ if (componentFile) {
101
+ const fileContent = fs.readFileSync(componentFile, 'utf8');
102
+ details.description = extractJSDocDescription(fileContent);
103
+ details.props = extractProps(fileContent);
104
+ details.types = extractTypes(fileContent);
105
+ }
106
+ return details;
107
+ }
108
+ }
109
+ return null;
110
+ }
111
+ catch (error) {
112
+ log(`Error getting component details for ${componentName}:`, error);
113
+ return null;
114
+ }
115
+ };
116
+ /**
117
+ * Finds the component directory based on the component name
118
+ */
119
+ export const findComponentDirectory = (packagePath, componentName, isLocalDev) => {
120
+ if (isLocalDev) {
121
+ // In local development, look in src/components
122
+ const componentsDir = path.join(packagePath, 'src', 'components');
123
+ if (!fs.existsSync(componentsDir))
124
+ return null;
125
+ const dirs = fs
126
+ .readdirSync(componentsDir, { withFileTypes: true })
127
+ .filter((dirent) => dirent.isDirectory())
128
+ .map((dirent) => dirent.name);
129
+ // Look for exact match or kebab-case version
130
+ const kebabName = componentName.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
131
+ const matchingDir = dirs.find((dir) => dir === kebabName || dir === componentName.toLowerCase() || dir === componentName);
132
+ return matchingDir ? path.join(componentsDir, matchingDir) : null;
133
+ }
134
+ else {
135
+ // In node_modules, components might be in different structure
136
+ return packagePath;
137
+ }
138
+ };
139
+ /**
140
+ * Finds the main component file
141
+ */
142
+ export const findComponentFile = (componentDir, componentName, isLocalDev) => {
143
+ if (isLocalDev) {
144
+ const possibleFiles = [
145
+ path.join(componentDir, 'index.tsx'),
146
+ path.join(componentDir, `${componentName}.tsx`),
147
+ path.join(componentDir, `${componentName.toLowerCase()}.tsx`),
148
+ ];
149
+ for (const file of possibleFiles) {
150
+ if (fs.existsSync(file)) {
151
+ return file;
152
+ }
153
+ }
154
+ }
155
+ return null;
156
+ };
157
+ /**
158
+ * Extracts JSDoc description from component file
159
+ */
160
+ export const extractJSDocDescription = (content) => {
161
+ const jsdocMatch = content.match(/\/\*\*\s*\n\s*\*\s*([^\n*@]+)/);
162
+ if (jsdocMatch) {
163
+ const description = jsdocMatch[1].trim();
164
+ return description.length > 0 ? description : undefined;
165
+ }
166
+ return undefined;
167
+ };
168
+ /**
169
+ * Extracts prop names from TypeScript interface definitions
170
+ */
171
+ export const extractProps = (content) => {
172
+ const props = [];
173
+ // Look for interface definitions
174
+ const interfaceMatches = content.match(/interface\s+\w*Props\s*{([^}]+)}/g) || [];
175
+ interfaceMatches.forEach((match) => {
176
+ const propsBlock = match.match(/{([^}]+)}/)?.[1];
177
+ if (propsBlock) {
178
+ const propLines = propsBlock.split('\n');
179
+ propLines.forEach((line) => {
180
+ const propMatch = line.trim().match(/^(\w+)[?:]?\s*:/);
181
+ if (propMatch) {
182
+ props.push(propMatch[1]);
183
+ }
184
+ });
185
+ }
186
+ });
187
+ return [...new Set(props)].sort();
188
+ };
189
+ /**
190
+ * Extracts exported type names from the file
191
+ */
192
+ export const extractTypes = (content) => {
193
+ const types = [];
194
+ // Look for exported types and interfaces
195
+ const typeMatches = content.match(/export\s+(?:type|interface)\s+(\w+)/g) || [];
196
+ typeMatches.forEach((match) => {
197
+ const typeName = match.match(/(?:type|interface)\s+(\w+)/)?.[1];
198
+ if (typeName) {
199
+ types.push(typeName);
200
+ }
201
+ });
202
+ return types.sort();
203
+ };
7
204
  //# sourceMappingURL=utils.js.map
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAE/B,MAAM,CAAC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;AAC/B,MAAM,CAAC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;AAEnC,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,IAAY,EAAE,EAAE;IACvD,OAAO,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;AAChE,CAAC,CAAC"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}