@xferops/design-guide 0.2.1 → 0.2.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.
@@ -0,0 +1,239 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ getGuideById,
4
+ listGuides,
5
+ searchGuides
6
+ } from "./chunk-R4AEJOIP.js";
7
+
8
+ // src/server.ts
9
+ import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
10
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
11
+ import { z } from "zod";
12
+
13
+ // package.json
14
+ var package_default = {
15
+ name: "@xferops/design-guide",
16
+ version: "0.2.2",
17
+ private: false,
18
+ type: "module",
19
+ main: "./dist/index.js",
20
+ types: "./dist/index.d.ts",
21
+ bin: {
22
+ "xferops-design-guide-mcp": "dist/cli.js"
23
+ },
24
+ files: [
25
+ "dist",
26
+ "guides"
27
+ ],
28
+ publishConfig: {
29
+ access: "public",
30
+ registry: "https://registry.npmjs.org/"
31
+ },
32
+ exports: {
33
+ ".": {
34
+ types: "./dist/index.d.ts",
35
+ default: "./dist/index.js"
36
+ },
37
+ "./server": {
38
+ types: "./dist/server.d.ts",
39
+ default: "./dist/server.js"
40
+ }
41
+ },
42
+ scripts: {
43
+ build: "tsup",
44
+ typecheck: "tsc -p tsconfig.json --noEmit",
45
+ test: "vitest run"
46
+ },
47
+ dependencies: {
48
+ "@modelcontextprotocol/sdk": "^1.20.2",
49
+ zod: "^4.1.11"
50
+ },
51
+ devDependencies: {
52
+ "@types/node": "^24.5.2",
53
+ tsx: "^4.20.6"
54
+ }
55
+ };
56
+
57
+ // src/server.ts
58
+ function createServer() {
59
+ const server = new McpServer(
60
+ {
61
+ name: "@xferops/design-guide",
62
+ version: package_default.version
63
+ },
64
+ {
65
+ capabilities: {
66
+ logging: {}
67
+ }
68
+ }
69
+ );
70
+ server.registerTool(
71
+ "search_guides",
72
+ {
73
+ title: "Search Design Guides",
74
+ description: "Search the XferOps frontend design guide catalog by keyword, tag, or area.",
75
+ inputSchema: z.object({
76
+ query: z.string().describe("Keywords such as table sorting, forms, overlays, or navigation.")
77
+ }),
78
+ outputSchema: z.object({
79
+ guides: z.array(
80
+ z.object({
81
+ id: z.string(),
82
+ title: z.string(),
83
+ summary: z.string(),
84
+ tags: z.array(z.string()),
85
+ uri: z.string(),
86
+ sourcePath: z.string().optional()
87
+ })
88
+ )
89
+ })
90
+ },
91
+ async ({ query }) => {
92
+ const guides = (await searchGuides(query)).map((guide) => ({
93
+ id: guide.id,
94
+ title: guide.title,
95
+ summary: guide.summary,
96
+ tags: guide.tags,
97
+ uri: guide.uri,
98
+ sourcePath: guide.sourcePath
99
+ }));
100
+ return {
101
+ content: [
102
+ {
103
+ type: "text",
104
+ text: guides.length ? guides.map((guide) => `${guide.title} (${guide.uri})`).join("\n") : "No guides matched the query."
105
+ }
106
+ ],
107
+ structuredContent: { guides }
108
+ };
109
+ }
110
+ );
111
+ server.registerTool(
112
+ "get_guide",
113
+ {
114
+ title: "Get Design Guide",
115
+ description: "Read a guide by id such as table/sorting or by URI such as guide://table/sorting.",
116
+ inputSchema: z.object({
117
+ identifier: z.string().describe("Guide id or guide URI.")
118
+ }),
119
+ outputSchema: z.object({
120
+ id: z.string(),
121
+ title: z.string(),
122
+ summary: z.string(),
123
+ uri: z.string(),
124
+ content: z.string(),
125
+ sourcePath: z.string().optional()
126
+ })
127
+ },
128
+ async ({ identifier }) => {
129
+ const guideId = identifier.startsWith("guide://") ? identifier.replace("guide://", "") : identifier.replace(/^\/+/, "");
130
+ const guide = await getGuideById(guideId);
131
+ if (!guide) {
132
+ return {
133
+ content: [
134
+ {
135
+ type: "text",
136
+ text: `Guide not found: ${identifier}`
137
+ }
138
+ ],
139
+ isError: true
140
+ };
141
+ }
142
+ return {
143
+ content: [
144
+ {
145
+ type: "text",
146
+ text: guide.content
147
+ }
148
+ ],
149
+ structuredContent: {
150
+ id: guide.id,
151
+ title: guide.title,
152
+ summary: guide.summary,
153
+ uri: guide.uri,
154
+ content: guide.content,
155
+ sourcePath: guide.sourcePath
156
+ }
157
+ };
158
+ }
159
+ );
160
+ server.registerResource(
161
+ "guide-catalog",
162
+ "guide://catalog",
163
+ {
164
+ title: "Guide Catalog",
165
+ description: "Catalog of available XferOps frontend design guides.",
166
+ mimeType: "application/json"
167
+ },
168
+ async (uri) => {
169
+ const guides = await listGuides();
170
+ return {
171
+ contents: [
172
+ {
173
+ uri: uri.href,
174
+ text: JSON.stringify(
175
+ guides.map((guide) => ({
176
+ id: guide.id,
177
+ title: guide.title,
178
+ summary: guide.summary,
179
+ tags: guide.tags,
180
+ uri: guide.uri,
181
+ sourcePath: guide.sourcePath
182
+ })),
183
+ null,
184
+ 2
185
+ )
186
+ }
187
+ ]
188
+ };
189
+ }
190
+ );
191
+ server.registerResource(
192
+ "guide-document",
193
+ new ResourceTemplate("guide://{category}/{slug}", {
194
+ list: async () => {
195
+ const guides = await listGuides();
196
+ return {
197
+ resources: guides.map((guide) => ({
198
+ uri: guide.uri,
199
+ name: guide.title,
200
+ description: guide.summary,
201
+ mimeType: "text/markdown"
202
+ }))
203
+ };
204
+ }
205
+ }),
206
+ {
207
+ title: "Guide Document",
208
+ description: "A markdown guide for a specific frontend topic.",
209
+ mimeType: "text/markdown"
210
+ },
211
+ async (uri, { category, slug }) => {
212
+ const guide = await getGuideById(`${category}/${slug}`);
213
+ if (!guide) {
214
+ throw new Error(`Guide not found for URI: ${uri.href}`);
215
+ }
216
+ return {
217
+ contents: [
218
+ {
219
+ uri: uri.href,
220
+ text: guide.content
221
+ }
222
+ ]
223
+ };
224
+ }
225
+ );
226
+ return server;
227
+ }
228
+ async function startServer() {
229
+ const server = createServer();
230
+ const transport = new StdioServerTransport();
231
+ await server.connect(transport);
232
+ console.error("@xferops/design-guide MCP server running on stdio");
233
+ }
234
+
235
+ export {
236
+ createServer,
237
+ startServer
238
+ };
239
+ //# sourceMappingURL=chunk-DOTK23AS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server.ts","../package.json"],"sourcesContent":["import { McpServer, ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { z } from \"zod\";\nimport packageJson from \"../package.json\";\nimport { getGuideById, listGuides } from \"./guides/catalog\";\nimport { searchGuides } from \"./guides/search\";\n\nexport function createServer() {\n const server = new McpServer(\n {\n name: \"@xferops/design-guide\",\n version: packageJson.version\n },\n {\n capabilities: {\n logging: {}\n }\n }\n );\n\n server.registerTool(\n \"search_guides\",\n {\n title: \"Search Design Guides\",\n description: \"Search the XferOps frontend design guide catalog by keyword, tag, or area.\",\n inputSchema: z.object({\n query: z.string().describe(\"Keywords such as table sorting, forms, overlays, or navigation.\")\n }),\n outputSchema: z.object({\n guides: z.array(\n z.object({\n id: z.string(),\n title: z.string(),\n summary: z.string(),\n tags: z.array(z.string()),\n uri: z.string(),\n sourcePath: z.string().optional()\n })\n )\n })\n },\n async ({ query }) => {\n const guides = (await searchGuides(query)).map((guide) => ({\n id: guide.id,\n title: guide.title,\n summary: guide.summary,\n tags: guide.tags,\n uri: guide.uri,\n sourcePath: guide.sourcePath\n }));\n\n return {\n content: [\n {\n type: \"text\",\n text: guides.length\n ? guides.map((guide) => `${guide.title} (${guide.uri})`).join(\"\\n\")\n : \"No guides matched the query.\"\n }\n ],\n structuredContent: { guides }\n };\n }\n );\n\n server.registerTool(\n \"get_guide\",\n {\n title: \"Get Design Guide\",\n description: \"Read a guide by id such as table/sorting or by URI such as guide://table/sorting.\",\n inputSchema: z.object({\n identifier: z.string().describe(\"Guide id or guide URI.\")\n }),\n outputSchema: z.object({\n id: z.string(),\n title: z.string(),\n summary: z.string(),\n uri: z.string(),\n content: z.string(),\n sourcePath: z.string().optional()\n })\n },\n async ({ identifier }) => {\n const guideId = identifier.startsWith(\"guide://\")\n ? identifier.replace(\"guide://\", \"\")\n : identifier.replace(/^\\/+/, \"\");\n const guide = await getGuideById(guideId);\n\n if (!guide) {\n return {\n content: [\n {\n type: \"text\",\n text: `Guide not found: ${identifier}`\n }\n ],\n isError: true\n };\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: guide.content\n }\n ],\n structuredContent: {\n id: guide.id,\n title: guide.title,\n summary: guide.summary,\n uri: guide.uri,\n content: guide.content,\n sourcePath: guide.sourcePath\n }\n };\n }\n );\n\n server.registerResource(\n \"guide-catalog\",\n \"guide://catalog\",\n {\n title: \"Guide Catalog\",\n description: \"Catalog of available XferOps frontend design guides.\",\n mimeType: \"application/json\"\n },\n async (uri) => {\n const guides = await listGuides();\n\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(\n guides.map((guide) => ({\n id: guide.id,\n title: guide.title,\n summary: guide.summary,\n tags: guide.tags,\n uri: guide.uri,\n sourcePath: guide.sourcePath\n })),\n null,\n 2\n )\n }\n ]\n };\n }\n );\n\n server.registerResource(\n \"guide-document\",\n new ResourceTemplate(\"guide://{category}/{slug}\", {\n list: async () => {\n const guides = await listGuides();\n\n return {\n resources: guides.map((guide) => ({\n uri: guide.uri,\n name: guide.title,\n description: guide.summary,\n mimeType: \"text/markdown\"\n }))\n };\n }\n }),\n {\n title: \"Guide Document\",\n description: \"A markdown guide for a specific frontend topic.\",\n mimeType: \"text/markdown\"\n },\n async (uri, { category, slug }) => {\n const guide = await getGuideById(`${category}/${slug}`);\n\n if (!guide) {\n throw new Error(`Guide not found for URI: ${uri.href}`);\n }\n\n return {\n contents: [\n {\n uri: uri.href,\n text: guide.content\n }\n ]\n };\n }\n );\n\n return server;\n}\n\nexport async function startServer() {\n const server = createServer();\n const transport = new StdioServerTransport();\n\n await server.connect(transport);\n console.error(\"@xferops/design-guide MCP server running on stdio\");\n}\n","{\n \"name\": \"@xferops/design-guide\",\n \"version\": \"0.2.2\",\n \"private\": false,\n \"type\": \"module\",\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"bin\": {\n \"xferops-design-guide-mcp\": \"dist/cli.js\"\n },\n \"files\": [\n \"dist\",\n \"guides\"\n ],\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org/\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"./server\": {\n \"types\": \"./dist/server.d.ts\",\n \"default\": \"./dist/server.js\"\n }\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"typecheck\": \"tsc -p tsconfig.json --noEmit\",\n \"test\": \"vitest run\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.20.2\",\n \"zod\": \"^4.1.11\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^24.5.2\",\n \"tsx\": \"^4.20.6\"\n }\n}\n"],"mappings":"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","names":[]}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+
2
+ export { }
package/dist/cli.js ADDED
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ startServer
4
+ } from "./chunk-DOTK23AS.js";
5
+ import "./chunk-R4AEJOIP.js";
6
+
7
+ // src/cli.ts
8
+ void startServer().catch((error) => {
9
+ console.error("Fatal error in @xferops/design-guide:", error);
10
+ process.exit(1);
11
+ });
12
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli.ts"],"sourcesContent":["import { startServer } from \"./server\";\n\nvoid startServer().catch((error) => {\n console.error(\"Fatal error in @xferops/design-guide:\", error);\n process.exit(1);\n});\n"],"mappings":";;;;;;;AAEA,KAAK,YAAY,EAAE,MAAM,CAAC,UAAU;AAClC,UAAQ,MAAM,yCAAyC,KAAK;AAC5D,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":[]}
package/dist/server.js CHANGED
@@ -1,244 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
- getGuideById,
4
- listGuides,
5
- searchGuides
6
- } from "./chunk-R4AEJOIP.js";
7
-
8
- // src/server.ts
9
- import { fileURLToPath } from "url";
10
- import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
11
- import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
12
- import { z } from "zod";
13
-
14
- // package.json
15
- var package_default = {
16
- name: "@xferops/design-guide",
17
- version: "0.1.0",
18
- private: false,
19
- type: "module",
20
- main: "./dist/index.js",
21
- types: "./dist/index.d.ts",
22
- bin: {
23
- "xferops-design-guide-mcp": "./dist/server.js"
24
- },
25
- files: [
26
- "dist",
27
- "guides"
28
- ],
29
- publishConfig: {
30
- access: "public",
31
- registry: "https://registry.npmjs.org/"
32
- },
33
- exports: {
34
- ".": {
35
- types: "./dist/index.d.ts",
36
- default: "./dist/index.js"
37
- },
38
- "./server": {
39
- types: "./dist/server.d.ts",
40
- default: "./dist/server.js"
41
- }
42
- },
43
- scripts: {
44
- build: "tsup",
45
- typecheck: "tsc -p tsconfig.json --noEmit",
46
- test: "vitest run"
47
- },
48
- dependencies: {
49
- "@modelcontextprotocol/sdk": "^1.20.2",
50
- zod: "^4.1.11"
51
- },
52
- devDependencies: {
53
- "@types/node": "^24.5.2",
54
- tsx: "^4.20.6"
55
- }
56
- };
57
-
58
- // src/server.ts
59
- function createServer() {
60
- const server = new McpServer(
61
- {
62
- name: "@xferops/design-guide",
63
- version: package_default.version
64
- },
65
- {
66
- capabilities: {
67
- logging: {}
68
- }
69
- }
70
- );
71
- server.registerTool(
72
- "search_guides",
73
- {
74
- title: "Search Design Guides",
75
- description: "Search the XferOps frontend design guide catalog by keyword, tag, or area.",
76
- inputSchema: z.object({
77
- query: z.string().describe("Keywords such as table sorting, forms, overlays, or navigation.")
78
- }),
79
- outputSchema: z.object({
80
- guides: z.array(
81
- z.object({
82
- id: z.string(),
83
- title: z.string(),
84
- summary: z.string(),
85
- tags: z.array(z.string()),
86
- uri: z.string(),
87
- sourcePath: z.string().optional()
88
- })
89
- )
90
- })
91
- },
92
- async ({ query }) => {
93
- const guides = (await searchGuides(query)).map((guide) => ({
94
- id: guide.id,
95
- title: guide.title,
96
- summary: guide.summary,
97
- tags: guide.tags,
98
- uri: guide.uri,
99
- sourcePath: guide.sourcePath
100
- }));
101
- return {
102
- content: [
103
- {
104
- type: "text",
105
- text: guides.length ? guides.map((guide) => `${guide.title} (${guide.uri})`).join("\n") : "No guides matched the query."
106
- }
107
- ],
108
- structuredContent: { guides }
109
- };
110
- }
111
- );
112
- server.registerTool(
113
- "get_guide",
114
- {
115
- title: "Get Design Guide",
116
- description: "Read a guide by id such as table/sorting or by URI such as guide://table/sorting.",
117
- inputSchema: z.object({
118
- identifier: z.string().describe("Guide id or guide URI.")
119
- }),
120
- outputSchema: z.object({
121
- id: z.string(),
122
- title: z.string(),
123
- summary: z.string(),
124
- uri: z.string(),
125
- content: z.string(),
126
- sourcePath: z.string().optional()
127
- })
128
- },
129
- async ({ identifier }) => {
130
- const guideId = identifier.startsWith("guide://") ? identifier.replace("guide://", "") : identifier.replace(/^\/+/, "");
131
- const guide = await getGuideById(guideId);
132
- if (!guide) {
133
- return {
134
- content: [
135
- {
136
- type: "text",
137
- text: `Guide not found: ${identifier}`
138
- }
139
- ],
140
- isError: true
141
- };
142
- }
143
- return {
144
- content: [
145
- {
146
- type: "text",
147
- text: guide.content
148
- }
149
- ],
150
- structuredContent: {
151
- id: guide.id,
152
- title: guide.title,
153
- summary: guide.summary,
154
- uri: guide.uri,
155
- content: guide.content,
156
- sourcePath: guide.sourcePath
157
- }
158
- };
159
- }
160
- );
161
- server.registerResource(
162
- "guide-catalog",
163
- "guide://catalog",
164
- {
165
- title: "Guide Catalog",
166
- description: "Catalog of available XferOps frontend design guides.",
167
- mimeType: "application/json"
168
- },
169
- async (uri) => {
170
- const guides = await listGuides();
171
- return {
172
- contents: [
173
- {
174
- uri: uri.href,
175
- text: JSON.stringify(
176
- guides.map((guide) => ({
177
- id: guide.id,
178
- title: guide.title,
179
- summary: guide.summary,
180
- tags: guide.tags,
181
- uri: guide.uri,
182
- sourcePath: guide.sourcePath
183
- })),
184
- null,
185
- 2
186
- )
187
- }
188
- ]
189
- };
190
- }
191
- );
192
- server.registerResource(
193
- "guide-document",
194
- new ResourceTemplate("guide://{category}/{slug}", {
195
- list: async () => {
196
- const guides = await listGuides();
197
- return {
198
- resources: guides.map((guide) => ({
199
- uri: guide.uri,
200
- name: guide.title,
201
- description: guide.summary,
202
- mimeType: "text/markdown"
203
- }))
204
- };
205
- }
206
- }),
207
- {
208
- title: "Guide Document",
209
- description: "A markdown guide for a specific frontend topic.",
210
- mimeType: "text/markdown"
211
- },
212
- async (uri, { category, slug }) => {
213
- const guide = await getGuideById(`${category}/${slug}`);
214
- if (!guide) {
215
- throw new Error(`Guide not found for URI: ${uri.href}`);
216
- }
217
- return {
218
- contents: [
219
- {
220
- uri: uri.href,
221
- text: guide.content
222
- }
223
- ]
224
- };
225
- }
226
- );
227
- return server;
228
- }
229
- async function startServer() {
230
- const server = createServer();
231
- const transport = new StdioServerTransport();
232
- await server.connect(transport);
233
- console.error("@xferops/design-guide MCP server running on stdio");
234
- }
235
- var entryPath = process.argv[1];
236
- if (entryPath && fileURLToPath(import.meta.url) === entryPath) {
237
- void startServer().catch((error) => {
238
- console.error("Fatal error in @xferops/design-guide:", error);
239
- process.exit(1);
240
- });
241
- }
3
+ createServer,
4
+ startServer
5
+ } from "./chunk-DOTK23AS.js";
6
+ import "./chunk-R4AEJOIP.js";
242
7
  export {
243
8
  createServer,
244
9
  startServer
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server.ts","../package.json"],"sourcesContent":["import { fileURLToPath } from \"node:url\";\nimport { McpServer, ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { z } from \"zod\";\nimport packageJson from \"../package.json\";\nimport { getGuideById, listGuides } from \"./guides/catalog\";\nimport { searchGuides } from \"./guides/search\";\n\nexport function createServer() {\n const server = new McpServer(\n {\n name: \"@xferops/design-guide\",\n version: packageJson.version\n },\n {\n capabilities: {\n logging: {}\n }\n }\n );\n\n server.registerTool(\n \"search_guides\",\n {\n title: \"Search Design Guides\",\n description: \"Search the XferOps frontend design guide catalog by keyword, tag, or area.\",\n inputSchema: z.object({\n query: z.string().describe(\"Keywords such as table sorting, forms, overlays, or navigation.\")\n }),\n outputSchema: z.object({\n guides: z.array(\n z.object({\n id: z.string(),\n title: z.string(),\n summary: z.string(),\n tags: z.array(z.string()),\n uri: z.string(),\n sourcePath: z.string().optional()\n })\n )\n })\n },\n async ({ query }) => {\n const guides = (await searchGuides(query)).map((guide) => ({\n id: guide.id,\n title: guide.title,\n summary: guide.summary,\n tags: guide.tags,\n uri: guide.uri,\n sourcePath: guide.sourcePath\n }));\n\n return {\n content: [\n {\n type: \"text\",\n text: guides.length\n ? guides.map((guide) => `${guide.title} (${guide.uri})`).join(\"\\n\")\n : \"No guides matched the query.\"\n }\n ],\n structuredContent: { guides }\n };\n }\n );\n\n server.registerTool(\n \"get_guide\",\n {\n title: \"Get Design Guide\",\n description: \"Read a guide by id such as table/sorting or by URI such as guide://table/sorting.\",\n inputSchema: z.object({\n identifier: z.string().describe(\"Guide id or guide URI.\")\n }),\n outputSchema: z.object({\n id: z.string(),\n title: z.string(),\n summary: z.string(),\n uri: z.string(),\n content: z.string(),\n sourcePath: z.string().optional()\n })\n },\n async ({ identifier }) => {\n const guideId = identifier.startsWith(\"guide://\")\n ? identifier.replace(\"guide://\", \"\")\n : identifier.replace(/^\\/+/, \"\");\n const guide = await getGuideById(guideId);\n\n if (!guide) {\n return {\n content: [\n {\n type: \"text\",\n text: `Guide not found: ${identifier}`\n }\n ],\n isError: true\n };\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: guide.content\n }\n ],\n structuredContent: {\n id: guide.id,\n title: guide.title,\n summary: guide.summary,\n uri: guide.uri,\n content: guide.content,\n sourcePath: guide.sourcePath\n }\n };\n }\n );\n\n server.registerResource(\n \"guide-catalog\",\n \"guide://catalog\",\n {\n title: \"Guide Catalog\",\n description: \"Catalog of available XferOps frontend design guides.\",\n mimeType: \"application/json\"\n },\n async (uri) => {\n const guides = await listGuides();\n\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(\n guides.map((guide) => ({\n id: guide.id,\n title: guide.title,\n summary: guide.summary,\n tags: guide.tags,\n uri: guide.uri,\n sourcePath: guide.sourcePath\n })),\n null,\n 2\n )\n }\n ]\n };\n }\n );\n\n server.registerResource(\n \"guide-document\",\n new ResourceTemplate(\"guide://{category}/{slug}\", {\n list: async () => {\n const guides = await listGuides();\n\n return {\n resources: guides.map((guide) => ({\n uri: guide.uri,\n name: guide.title,\n description: guide.summary,\n mimeType: \"text/markdown\"\n }))\n };\n }\n }),\n {\n title: \"Guide Document\",\n description: \"A markdown guide for a specific frontend topic.\",\n mimeType: \"text/markdown\"\n },\n async (uri, { category, slug }) => {\n const guide = await getGuideById(`${category}/${slug}`);\n\n if (!guide) {\n throw new Error(`Guide not found for URI: ${uri.href}`);\n }\n\n return {\n contents: [\n {\n uri: uri.href,\n text: guide.content\n }\n ]\n };\n }\n );\n\n return server;\n}\n\nexport async function startServer() {\n const server = createServer();\n const transport = new StdioServerTransport();\n\n await server.connect(transport);\n console.error(\"@xferops/design-guide MCP server running on stdio\");\n}\n\nconst entryPath = process.argv[1];\n\nif (entryPath && fileURLToPath(import.meta.url) === entryPath) {\n void startServer().catch((error) => {\n console.error(\"Fatal error in @xferops/design-guide:\", error);\n process.exit(1);\n });\n}\n","{\n \"name\": \"@xferops/design-guide\",\n \"version\": \"0.1.0\",\n \"private\": false,\n \"type\": \"module\",\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"bin\": {\n \"xferops-design-guide-mcp\": \"./dist/server.js\"\n },\n \"files\": [\n \"dist\",\n \"guides\"\n ],\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org/\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"./server\": {\n \"types\": \"./dist/server.d.ts\",\n \"default\": \"./dist/server.js\"\n }\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"typecheck\": \"tsc -p tsconfig.json --noEmit\",\n \"test\": \"vitest run\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.20.2\",\n \"zod\": \"^4.1.11\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^24.5.2\",\n \"tsx\": \"^4.20.6\"\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@xferops/design-guide",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
8
8
  "bin": {
9
- "xferops-design-guide-mcp": "dist/server.js"
9
+ "xferops-design-guide-mcp": "dist/cli.js"
10
10
  },
11
11
  "files": [
12
12
  "dist",