vitek-plugin 0.2.1-beta → 0.2.2-beta

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 (258) hide show
  1. package/README.md +1 -1
  2. package/dist/adapters/dispatch/http-webhook.d.ts +10 -0
  3. package/dist/adapters/dispatch/http-webhook.d.ts.map +1 -0
  4. package/dist/adapters/dispatch/http-webhook.js +38 -0
  5. package/dist/adapters/node/console-structured-request-logger.d.ts +6 -0
  6. package/dist/adapters/node/console-structured-request-logger.d.ts.map +1 -0
  7. package/dist/adapters/node/console-structured-request-logger.js +31 -0
  8. package/dist/build/build-api-bundle.d.ts.map +1 -1
  9. package/dist/build/build-api-bundle.js +11 -0
  10. package/dist/build/build-sockets-bundle.d.ts.map +1 -1
  11. package/dist/build/build-sockets-bundle.js +11 -0
  12. package/dist/cli/contract.d.ts +11 -0
  13. package/dist/cli/contract.d.ts.map +1 -0
  14. package/dist/cli/contract.js +143 -0
  15. package/dist/cli/doctor.d.ts +2 -0
  16. package/dist/cli/doctor.d.ts.map +1 -0
  17. package/dist/cli/doctor.js +70 -0
  18. package/dist/cli/generate.d.ts +2 -0
  19. package/dist/cli/generate.d.ts.map +1 -0
  20. package/dist/cli/generate.js +56 -0
  21. package/dist/cli/mcp-docs.d.ts +2 -0
  22. package/dist/cli/mcp-docs.d.ts.map +1 -0
  23. package/dist/cli/mcp-docs.js +4 -0
  24. package/dist/cli/mcp-project-write-tools.d.ts +4 -0
  25. package/dist/cli/mcp-project-write-tools.d.ts.map +1 -0
  26. package/dist/cli/mcp-project-write-tools.js +64 -0
  27. package/dist/cli/schedule.d.ts +2 -0
  28. package/dist/cli/schedule.d.ts.map +1 -0
  29. package/dist/cli/schedule.js +66 -0
  30. package/dist/core/contract/compare-asyncapi.d.ts +3 -0
  31. package/dist/core/contract/compare-asyncapi.d.ts.map +1 -0
  32. package/dist/core/contract/compare-asyncapi.js +45 -0
  33. package/dist/core/contract/compare-openapi.d.ts +3 -0
  34. package/dist/core/contract/compare-openapi.d.ts.map +1 -0
  35. package/dist/core/contract/compare-openapi.js +116 -0
  36. package/dist/core/contract/http-methods.d.ts +2 -0
  37. package/dist/core/contract/http-methods.d.ts.map +1 -0
  38. package/dist/core/contract/http-methods.js +2 -0
  39. package/dist/core/contract/index.d.ts +9 -0
  40. package/dist/core/contract/index.d.ts.map +1 -0
  41. package/dist/core/contract/index.js +7 -0
  42. package/dist/core/contract/project-specs.d.ts +12 -0
  43. package/dist/core/contract/project-specs.d.ts.map +1 -0
  44. package/dist/core/contract/project-specs.js +27 -0
  45. package/dist/core/contract/sort-json.d.ts +2 -0
  46. package/dist/core/contract/sort-json.d.ts.map +1 -0
  47. package/dist/core/contract/sort-json.js +14 -0
  48. package/dist/core/contract/types.d.ts +7 -0
  49. package/dist/core/contract/types.d.ts.map +1 -0
  50. package/dist/core/contract/types.js +1 -0
  51. package/dist/core/dispatch/dispatchers.d.ts +4 -0
  52. package/dist/core/dispatch/dispatchers.d.ts.map +1 -0
  53. package/dist/core/dispatch/dispatchers.js +16 -0
  54. package/dist/core/dispatch/emit-safe.d.ts +3 -0
  55. package/dist/core/dispatch/emit-safe.d.ts.map +1 -0
  56. package/dist/core/dispatch/emit-safe.js +10 -0
  57. package/dist/core/dispatch/index.d.ts +4 -0
  58. package/dist/core/dispatch/index.d.ts.map +1 -0
  59. package/dist/core/dispatch/index.js +2 -0
  60. package/dist/core/dispatch/types.d.ts +22 -0
  61. package/dist/core/dispatch/types.d.ts.map +1 -0
  62. package/dist/core/dispatch/types.js +1 -0
  63. package/dist/core/doctor/index.d.ts +3 -0
  64. package/dist/core/doctor/index.d.ts.map +1 -0
  65. package/dist/core/doctor/index.js +1 -0
  66. package/dist/core/doctor/report.d.ts +4 -0
  67. package/dist/core/doctor/report.d.ts.map +1 -0
  68. package/dist/core/doctor/report.js +166 -0
  69. package/dist/core/doctor/scan.d.ts +3 -0
  70. package/dist/core/doctor/scan.d.ts.map +1 -0
  71. package/dist/core/doctor/scan.js +23 -0
  72. package/dist/core/doctor/types.d.ts +12 -0
  73. package/dist/core/doctor/types.d.ts.map +1 -0
  74. package/dist/core/doctor/types.js +1 -0
  75. package/dist/core/events/event-bus.d.ts +8 -0
  76. package/dist/core/events/event-bus.d.ts.map +1 -0
  77. package/dist/core/events/event-bus.js +26 -0
  78. package/dist/core/events/index.d.ts +3 -0
  79. package/dist/core/events/index.d.ts.map +1 -0
  80. package/dist/core/events/index.js +1 -0
  81. package/dist/core/generators/adapters/drizzle.d.ts +3 -0
  82. package/dist/core/generators/adapters/drizzle.d.ts.map +1 -0
  83. package/dist/core/generators/adapters/drizzle.js +26 -0
  84. package/dist/core/generators/adapters/prisma.d.ts +3 -0
  85. package/dist/core/generators/adapters/prisma.d.ts.map +1 -0
  86. package/dist/core/generators/adapters/prisma.js +136 -0
  87. package/dist/core/generators/adapters/sql.d.ts +3 -0
  88. package/dist/core/generators/adapters/sql.d.ts.map +1 -0
  89. package/dist/core/generators/adapters/sql.js +26 -0
  90. package/dist/core/generators/generate-crud.d.ts +8 -0
  91. package/dist/core/generators/generate-crud.d.ts.map +1 -0
  92. package/dist/core/generators/generate-crud.js +17 -0
  93. package/dist/core/generators/index.d.ts +3 -0
  94. package/dist/core/generators/index.d.ts.map +1 -0
  95. package/dist/core/generators/index.js +1 -0
  96. package/dist/core/generators/types.d.ts +16 -0
  97. package/dist/core/generators/types.d.ts.map +1 -0
  98. package/dist/core/generators/types.js +1 -0
  99. package/dist/core/generators/utils.d.ts +3 -0
  100. package/dist/core/generators/utils.d.ts.map +1 -0
  101. package/dist/core/generators/utils.js +10 -0
  102. package/dist/core/observability/with-span.d.ts +5 -0
  103. package/dist/core/observability/with-span.d.ts.map +1 -0
  104. package/dist/core/observability/with-span.js +7 -0
  105. package/dist/core/scheduler/define-schedule.d.ts +3 -0
  106. package/dist/core/scheduler/define-schedule.d.ts.map +1 -0
  107. package/dist/core/scheduler/define-schedule.js +3 -0
  108. package/dist/core/scheduler/in-memory-lock.d.ts +6 -0
  109. package/dist/core/scheduler/in-memory-lock.d.ts.map +1 -0
  110. package/dist/core/scheduler/in-memory-lock.js +12 -0
  111. package/dist/core/scheduler/index.d.ts +5 -0
  112. package/dist/core/scheduler/index.d.ts.map +1 -0
  113. package/dist/core/scheduler/index.js +3 -0
  114. package/dist/core/scheduler/runner.d.ts +6 -0
  115. package/dist/core/scheduler/runner.d.ts.map +1 -0
  116. package/dist/core/scheduler/runner.js +37 -0
  117. package/dist/core/scheduler/types.d.ts +21 -0
  118. package/dist/core/scheduler/types.d.ts.map +1 -0
  119. package/dist/core/scheduler/types.js +1 -0
  120. package/dist/core/server/request-log-meta.d.ts +5 -0
  121. package/dist/core/server/request-log-meta.d.ts.map +1 -0
  122. package/dist/core/server/request-log-meta.js +1 -0
  123. package/dist/mcp/write/apply-guard.d.ts +7 -0
  124. package/dist/mcp/write/apply-guard.d.ts.map +1 -0
  125. package/dist/mcp/write/apply-guard.js +22 -0
  126. package/dist/mcp/write/openapi-jsdoc.d.ts +2 -0
  127. package/dist/mcp/write/openapi-jsdoc.d.ts.map +1 -0
  128. package/dist/mcp/write/openapi-jsdoc.js +15 -0
  129. package/dist/mcp/write/project-write-handlers.d.ts +46 -0
  130. package/dist/mcp/write/project-write-handlers.d.ts.map +1 -0
  131. package/dist/mcp/write/project-write-handlers.js +304 -0
  132. package/dist/mcp/write/risks.d.ts +3 -0
  133. package/dist/mcp/write/risks.d.ts.map +1 -0
  134. package/dist/mcp/write/risks.js +20 -0
  135. package/dist/mcp/write/route-snippet.d.ts +5 -0
  136. package/dist/mcp/write/route-snippet.d.ts.map +1 -0
  137. package/dist/mcp/write/route-snippet.js +46 -0
  138. package/dist/mcp/write/safe-path.d.ts +3 -0
  139. package/dist/mcp/write/safe-path.d.ts.map +1 -0
  140. package/dist/mcp/write/safe-path.js +16 -0
  141. package/dist/mcp/write/test-file-content.d.ts +8 -0
  142. package/dist/mcp/write/test-file-content.d.ts.map +1 -0
  143. package/dist/mcp/write/test-file-content.js +31 -0
  144. package/dist/mcp/write/unified-diff.d.ts +2 -0
  145. package/dist/mcp/write/unified-diff.d.ts.map +1 -0
  146. package/dist/mcp/write/unified-diff.js +19 -0
  147. package/dist/mcp/write/validation-scaffold.d.ts +2 -0
  148. package/dist/mcp/write/validation-scaffold.d.ts.map +1 -0
  149. package/dist/mcp/write/validation-scaffold.js +31 -0
  150. package/dist/mcp-docs-server/resources/configuration.d.ts +3 -0
  151. package/dist/mcp-docs-server/resources/configuration.d.ts.map +1 -0
  152. package/dist/mcp-docs-server/resources/configuration.js +25 -0
  153. package/dist/mcp-docs-server/resources/context.d.ts +3 -0
  154. package/dist/mcp-docs-server/resources/context.d.ts.map +1 -0
  155. package/dist/mcp-docs-server/resources/context.js +34 -0
  156. package/dist/mcp-docs-server/resources/errors.d.ts +3 -0
  157. package/dist/mcp-docs-server/resources/errors.d.ts.map +1 -0
  158. package/dist/mcp-docs-server/resources/errors.js +27 -0
  159. package/dist/mcp-docs-server/resources/introspection.d.ts +3 -0
  160. package/dist/mcp-docs-server/resources/introspection.d.ts.map +1 -0
  161. package/dist/mcp-docs-server/resources/introspection.js +24 -0
  162. package/dist/mcp-docs-server/resources/middlewares.d.ts +3 -0
  163. package/dist/mcp-docs-server/resources/middlewares.d.ts.map +1 -0
  164. package/dist/mcp-docs-server/resources/middlewares.js +36 -0
  165. package/dist/mcp-docs-server/resources/plugin-api.d.ts +3 -0
  166. package/dist/mcp-docs-server/resources/plugin-api.d.ts.map +1 -0
  167. package/dist/mcp-docs-server/resources/plugin-api.js +32 -0
  168. package/dist/mcp-docs-server/resources/response.d.ts +3 -0
  169. package/dist/mcp-docs-server/resources/response.d.ts.map +1 -0
  170. package/dist/mcp-docs-server/resources/response.js +39 -0
  171. package/dist/mcp-docs-server/resources/routing.d.ts +3 -0
  172. package/dist/mcp-docs-server/resources/routing.d.ts.map +1 -0
  173. package/dist/mcp-docs-server/resources/routing.js +47 -0
  174. package/dist/mcp-docs-server/resources/validation.d.ts +3 -0
  175. package/dist/mcp-docs-server/resources/validation.d.ts.map +1 -0
  176. package/dist/mcp-docs-server/resources/validation.js +37 -0
  177. package/dist/mcp-docs-server/resources/websockets.d.ts +3 -0
  178. package/dist/mcp-docs-server/resources/websockets.d.ts.map +1 -0
  179. package/dist/mcp-docs-server/resources/websockets.js +42 -0
  180. package/dist/mcp-docs-server/start-mcp-docs-server.d.ts +2 -0
  181. package/dist/mcp-docs-server/start-mcp-docs-server.d.ts.map +1 -0
  182. package/dist/mcp-docs-server/start-mcp-docs-server.js +171 -0
  183. package/dist/mcp-docs-server/tools/create-middleware.d.ts +5 -0
  184. package/dist/mcp-docs-server/tools/create-middleware.d.ts.map +1 -0
  185. package/dist/mcp-docs-server/tools/create-middleware.js +29 -0
  186. package/dist/mcp-docs-server/tools/create-route.d.ts +5 -0
  187. package/dist/mcp-docs-server/tools/create-route.d.ts.map +1 -0
  188. package/dist/mcp-docs-server/tools/create-route.js +44 -0
  189. package/dist/mcp-docs-server/tools/create-socket.d.ts +5 -0
  190. package/dist/mcp-docs-server/tools/create-socket.d.ts.map +1 -0
  191. package/dist/mcp-docs-server/tools/create-socket.js +39 -0
  192. package/dist/mcp-docs-server/tools/suggest-vite-config.d.ts +11 -0
  193. package/dist/mcp-docs-server/tools/suggest-vite-config.d.ts.map +1 -0
  194. package/dist/mcp-docs-server/tools/suggest-vite-config.js +30 -0
  195. package/dist/mcp-docs-server/tools/validate-convention.d.ts +21 -0
  196. package/dist/mcp-docs-server/tools/validate-convention.d.ts.map +1 -0
  197. package/dist/mcp-docs-server/tools/validate-convention.js +48 -0
  198. package/dist/platform/config.d.ts +30 -0
  199. package/dist/platform/config.d.ts.map +1 -0
  200. package/dist/platform/config.js +85 -0
  201. package/dist/platform/correlation.d.ts +5 -0
  202. package/dist/platform/correlation.d.ts.map +1 -0
  203. package/dist/platform/correlation.js +19 -0
  204. package/dist/platform/index.d.ts +5 -0
  205. package/dist/platform/index.d.ts.map +1 -0
  206. package/dist/platform/index.js +3 -0
  207. package/dist/platform/redaction.d.ts +6 -0
  208. package/dist/platform/redaction.d.ts.map +1 -0
  209. package/dist/platform/redaction.js +40 -0
  210. package/dist/plugin/mode.d.ts +5 -0
  211. package/dist/plugin/mode.d.ts.map +1 -0
  212. package/dist/plugin/mode.js +7 -0
  213. package/dist/public/dispatch.d.ts +3 -0
  214. package/dist/public/dispatch.d.ts.map +1 -0
  215. package/dist/public/dispatch.js +1 -0
  216. package/dist/public/doctor.d.ts +3 -0
  217. package/dist/public/doctor.d.ts.map +1 -0
  218. package/dist/public/doctor.js +1 -0
  219. package/dist/public/errors.d.ts +2 -0
  220. package/dist/public/errors.d.ts.map +1 -0
  221. package/dist/public/errors.js +1 -0
  222. package/dist/public/events.d.ts +3 -0
  223. package/dist/public/events.d.ts.map +1 -0
  224. package/dist/public/events.js +1 -0
  225. package/dist/public/generators.d.ts +3 -0
  226. package/dist/public/generators.d.ts.map +1 -0
  227. package/dist/public/generators.js +1 -0
  228. package/dist/public/introspection.d.ts +3 -0
  229. package/dist/public/introspection.d.ts.map +1 -0
  230. package/dist/public/introspection.js +1 -0
  231. package/dist/public/observability.d.ts +3 -0
  232. package/dist/public/observability.d.ts.map +1 -0
  233. package/dist/public/observability.js +1 -0
  234. package/dist/public/platform.d.ts +3 -0
  235. package/dist/public/platform.d.ts.map +1 -0
  236. package/dist/public/platform.js +1 -0
  237. package/dist/public/plugin.d.ts +3 -0
  238. package/dist/public/plugin.d.ts.map +1 -0
  239. package/dist/public/plugin.js +1 -0
  240. package/dist/public/response.d.ts +2 -0
  241. package/dist/public/response.d.ts.map +1 -0
  242. package/dist/public/response.js +1 -0
  243. package/dist/public/scheduler.d.ts +3 -0
  244. package/dist/public/scheduler.d.ts.map +1 -0
  245. package/dist/public/scheduler.js +1 -0
  246. package/dist/public/testing.d.ts +3 -0
  247. package/dist/public/testing.d.ts.map +1 -0
  248. package/dist/public/testing.js +1 -0
  249. package/dist/public/validation.d.ts +3 -0
  250. package/dist/public/validation.d.ts.map +1 -0
  251. package/dist/public/validation.js +1 -0
  252. package/dist/shared/mode.d.ts +5 -0
  253. package/dist/shared/mode.d.ts.map +1 -0
  254. package/dist/shared/mode.js +7 -0
  255. package/dist/testing/testing.d.ts +15 -0
  256. package/dist/testing/testing.d.ts.map +1 -0
  257. package/dist/testing/testing.js +51 -0
  258. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"introspection.d.ts","sourceRoot":"","sources":["../../../src/mcp-docs-server/resources/introspection.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,+BAA+B,CAAC;AAE9D,eAAO,MAAM,qBAAqB,q7BAsBjC,CAAC"}
@@ -0,0 +1,24 @@
1
+ export const INTROSPECTION_URI = 'vitek://docs/introspection';
2
+ export const INTROSPECTION_CONTENT = `# Vitek – Introspection API
3
+
4
+ Programmatic API to inspect routes, middlewares, and sockets. Manifest file generated at build.
5
+
6
+ ## Functions (from vitek-plugin)
7
+
8
+ - \`getManifest(root, apiDir)\` – { routes, middlewares, sockets }
9
+ - \`getRoutes(root, apiDir)\` – ParsedRoute[] ({ method, pattern, params, file })
10
+ - \`getSockets(root, apiDir)\` – ParsedSocket[] ({ pattern, params, file })
11
+ - \`writeManifest(root, apiDir, outDir)\` – writes vitek-manifest.json
12
+
13
+ ## Manifest format (vitek-manifest.json)
14
+
15
+ \`\`\`json
16
+ {
17
+ "routes": [{ "method": "get", "pattern": "users/:id", "params": ["id"], "file": "src/api/users/[id].get.ts" }],
18
+ "middlewares": [{ "basePattern": "", "path": "src/api/middleware.ts" }],
19
+ "sockets": [{ "pattern": "chat", "params": [], "file": "src/api/chat.socket.ts" }]
20
+ }
21
+ \`\`\`
22
+
23
+ Paths relative to project root. Use for CLIs, IDEs, CI/CD, or custom docs.
24
+ `;
@@ -0,0 +1,3 @@
1
+ export declare const MIDDLEWARES_URI = "vitek://docs/middlewares";
2
+ export declare const MIDDLEWARES_CONTENT = "# Vitek \u2013 Middlewares\n\nMiddlewares run before (and optionally after) route handlers. Applied hierarchically by folder.\n\n## Global middleware\n\n`src/api/middleware.ts` \u2013 applies to all routes. Export default array of `Middleware` (async (context, next) => ...). Call `await next()` to continue.\n\n```typescript\nimport type { Middleware } from \"vitek-plugin\";\n\nexport default [\n async (context, next) => {\n console.log(context.method, context.path);\n await next();\n },\n] satisfies Middleware[];\n```\n\nOptional `config.path`: array of patterns (e.g. `[\"protected/*\", \"admin\"]`) to limit global middleware to those paths. Use `*` suffix for prefix match.\n\n## Hierarchical middleware\n\n- `src/api/posts/middleware.ts` \u2013 applies to `/api/posts`, `/api/posts/:id`, etc.\n- `src/api/posts/[id]/middleware.ts` \u2013 applies to routes under `/api/posts/:id/` (e.g. `/api/posts/1/comments`).\n\nSame signature: `(context, next) => Promise<void>`, call `await next()`.\n\n## Order\n\n1. Global (`src/api/middleware.ts`)\n2. Folder (`src/api/posts/middleware.ts`)\n3. Nested (`src/api/posts/[id]/middleware.ts`)\n4. Route handler\n";
3
+ //# sourceMappingURL=middlewares.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middlewares.d.ts","sourceRoot":"","sources":["../../../src/mcp-docs-server/resources/middlewares.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,6BAA6B,CAAC;AAE1D,eAAO,MAAM,mBAAmB,opCAkC/B,CAAC"}
@@ -0,0 +1,36 @@
1
+ export const MIDDLEWARES_URI = 'vitek://docs/middlewares';
2
+ export const MIDDLEWARES_CONTENT = `# Vitek – Middlewares
3
+
4
+ Middlewares run before (and optionally after) route handlers. Applied hierarchically by folder.
5
+
6
+ ## Global middleware
7
+
8
+ \`src/api/middleware.ts\` – applies to all routes. Export default array of \`Middleware\` (async (context, next) => ...). Call \`await next()\` to continue.
9
+
10
+ \`\`\`typescript
11
+ import type { Middleware } from "vitek-plugin";
12
+
13
+ export default [
14
+ async (context, next) => {
15
+ console.log(context.method, context.path);
16
+ await next();
17
+ },
18
+ ] satisfies Middleware[];
19
+ \`\`\`
20
+
21
+ Optional \`config.path\`: array of patterns (e.g. \`["protected/*", "admin"]\`) to limit global middleware to those paths. Use \`*\` suffix for prefix match.
22
+
23
+ ## Hierarchical middleware
24
+
25
+ - \`src/api/posts/middleware.ts\` – applies to \`/api/posts\`, \`/api/posts/:id\`, etc.
26
+ - \`src/api/posts/[id]/middleware.ts\` – applies to routes under \`/api/posts/:id/\` (e.g. \`/api/posts/1/comments\`).
27
+
28
+ Same signature: \`(context, next) => Promise<void>\`, call \`await next()\`.
29
+
30
+ ## Order
31
+
32
+ 1. Global (\`src/api/middleware.ts\`)
33
+ 2. Folder (\`src/api/posts/middleware.ts\`)
34
+ 3. Nested (\`src/api/posts/[id]/middleware.ts\`)
35
+ 4. Route handler
36
+ `;
@@ -0,0 +1,3 @@
1
+ export declare const PLUGIN_API_URI = "vitek://docs/plugin-api";
2
+ export declare const PLUGIN_API_CONTENT = "# Vitek \u2013 Plugin API\n\nExternal plugins via `plugins` option. Type: `VitekPlugin`.\n\n## Hooks\n\n### afterTypesGenerated(ctx)\n\nCalled after types, services, and OpenAPI are generated. `ctx`: `root`, `schema` (RouteSchema[]), `sockets` (ParsedSocket[]), `apiBasePath`, `socketBasePath`. Use for codegen or integrations.\n\n### beforeApiRequest(ctx)\n\nCalled before each API request. `ctx`: `req`, `res`, `path`, `method`, `next()`. Call `next()` to continue; send response and omit `next()` to short-circuit (e.g. auth, rate limit).\n\n```typescript\nconst authPlugin: VitekPlugin = {\n name: \"auth\",\n async beforeApiRequest({ req, res, path, next }) {\n if (path.startsWith(\"/admin/\") && !req.headers.authorization) {\n res.statusCode = 401;\n res.setHeader(\"Content-Type\", \"application/json\");\n res.end(JSON.stringify({ error: \"Unauthorized\" }));\n return;\n }\n next();\n },\n};\n```\n\nImport types: `VitekPlugin`, `AfterTypesGeneratedContext`, `BeforeApiRequestContext` from \"vitek-plugin\".\n";
3
+ //# sourceMappingURL=plugin-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-api.d.ts","sourceRoot":"","sources":["../../../src/mcp-docs-server/resources/plugin-api.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,4BAA4B,CAAC;AAExD,eAAO,MAAM,kBAAkB,iiCA8B9B,CAAC"}
@@ -0,0 +1,32 @@
1
+ export const PLUGIN_API_URI = 'vitek://docs/plugin-api';
2
+ export const PLUGIN_API_CONTENT = `# Vitek – Plugin API
3
+
4
+ External plugins via \`plugins\` option. Type: \`VitekPlugin\`.
5
+
6
+ ## Hooks
7
+
8
+ ### afterTypesGenerated(ctx)
9
+
10
+ Called after types, services, and OpenAPI are generated. \`ctx\`: \`root\`, \`schema\` (RouteSchema[]), \`sockets\` (ParsedSocket[]), \`apiBasePath\`, \`socketBasePath\`. Use for codegen or integrations.
11
+
12
+ ### beforeApiRequest(ctx)
13
+
14
+ Called before each API request. \`ctx\`: \`req\`, \`res\`, \`path\`, \`method\`, \`next()\`. Call \`next()\` to continue; send response and omit \`next()\` to short-circuit (e.g. auth, rate limit).
15
+
16
+ \`\`\`typescript
17
+ const authPlugin: VitekPlugin = {
18
+ name: "auth",
19
+ async beforeApiRequest({ req, res, path, next }) {
20
+ if (path.startsWith("/admin/") && !req.headers.authorization) {
21
+ res.statusCode = 401;
22
+ res.setHeader("Content-Type", "application/json");
23
+ res.end(JSON.stringify({ error: "Unauthorized" }));
24
+ return;
25
+ }
26
+ next();
27
+ },
28
+ };
29
+ \`\`\`
30
+
31
+ Import types: \`VitekPlugin\`, \`AfterTypesGeneratedContext\`, \`BeforeApiRequestContext\` from "vitek-plugin".
32
+ `;
@@ -0,0 +1,3 @@
1
+ export declare const RESPONSE_URI = "vitek://docs/response";
2
+ export declare const RESPONSE_CONTENT = "# Vitek \u2013 Response handling\n\nReturn a plain object for 200 JSON, or use response helpers for status and headers.\n\n## Helpers (from vitek-plugin)\n\n- `ok(body?, headers?)` \u2013 200\n- `created(body?, headers?)` \u2013 201\n- `noContent(headers?)` \u2013 204\n- `badRequest(body?, headers?)` \u2013 400\n- `unauthorized(body?, headers?)` \u2013 401\n- `forbidden(body?, headers?)` \u2013 403\n- `notFound(body?, headers?)` \u2013 404\n- `conflict(body?, headers?)` \u2013 409\n- `unprocessableEntity(body?, headers?)` \u2013 422\n- `tooManyRequests(body?, headers?)` \u2013 429\n- `internalServerError(body?, headers?)` \u2013 500\n- `redirect(url, permanent?, preserveMethod?)` \u2013 301/302/307/308\n- `json(body, { status?, headers? })` \u2013 custom status/headers\n- `text(body: string, status?)` \u2013 plain text\n- `html(body: string, status?)` \u2013 HTML\n\n## VitekResponse\n\nReturn `{ status?, headers?, body? }` for full control (e.g. streaming, custom headers).\n\n## Example\n\n```typescript\nimport { created, notFound, json } from \"vitek-plugin\";\nimport type { VitekContext } from \"vitek-plugin\";\n\nexport default function handler(context: VitekContext) {\n if (!context.params.id) return notFound({ error: \"Not found\" });\n return created({ id: context.params.id });\n}\n```\n";
3
+ //# sourceMappingURL=response.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../../src/mcp-docs-server/resources/response.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,0BAA0B,CAAC;AAEpD,eAAO,MAAM,gBAAgB,yyCAqC5B,CAAC"}
@@ -0,0 +1,39 @@
1
+ export const RESPONSE_URI = 'vitek://docs/response';
2
+ export const RESPONSE_CONTENT = `# Vitek – Response handling
3
+
4
+ Return a plain object for 200 JSON, or use response helpers for status and headers.
5
+
6
+ ## Helpers (from vitek-plugin)
7
+
8
+ - \`ok(body?, headers?)\` – 200
9
+ - \`created(body?, headers?)\` – 201
10
+ - \`noContent(headers?)\` – 204
11
+ - \`badRequest(body?, headers?)\` – 400
12
+ - \`unauthorized(body?, headers?)\` – 401
13
+ - \`forbidden(body?, headers?)\` – 403
14
+ - \`notFound(body?, headers?)\` – 404
15
+ - \`conflict(body?, headers?)\` – 409
16
+ - \`unprocessableEntity(body?, headers?)\` – 422
17
+ - \`tooManyRequests(body?, headers?)\` – 429
18
+ - \`internalServerError(body?, headers?)\` – 500
19
+ - \`redirect(url, permanent?, preserveMethod?)\` – 301/302/307/308
20
+ - \`json(body, { status?, headers? })\` – custom status/headers
21
+ - \`text(body: string, status?)\` – plain text
22
+ - \`html(body: string, status?)\` – HTML
23
+
24
+ ## VitekResponse
25
+
26
+ Return \`{ status?, headers?, body? }\` for full control (e.g. streaming, custom headers).
27
+
28
+ ## Example
29
+
30
+ \`\`\`typescript
31
+ import { created, notFound, json } from "vitek-plugin";
32
+ import type { VitekContext } from "vitek-plugin";
33
+
34
+ export default function handler(context: VitekContext) {
35
+ if (!context.params.id) return notFound({ error: "Not found" });
36
+ return created({ id: context.params.id });
37
+ }
38
+ \`\`\`
39
+ `;
@@ -0,0 +1,3 @@
1
+ export declare const ROUTING_URI = "vitek://docs/routing";
2
+ export declare const ROUTING_CONTENT = "# Vitek \u2013 Routing\n\nRoute handlers receive a `VitekContext` and return a plain object or a response from response helpers.\n\n## File naming\n\n- `[name].[method].ts` or `.js` under the API directory (default `src/api`).\n- Method: get, post, put, patch, delete, head, options.\n- Dynamic segment: `[id]` \u2192 one segment (`users/[id].get.ts` \u2192 pattern `users/:id`).\n- Catch-all: `[...ids]` \u2192 rest of path (`posts/[...ids].get.ts` \u2192 pattern `posts/*ids`).\n- Index route: `index.get.ts` or `folder/index.post.ts` for directory index.\n\n## Examples\n\nSimple GET: `src/api/health.get.ts`\n```typescript\nimport type { VitekContext } from \"vitek-plugin\";\nexport default function handler(context: VitekContext) {\n return { status: \"ok\", timestamp: new Date().toISOString() };\n}\n```\n\nDynamic param: `src/api/users/[id].get.ts`\n```typescript\nimport type { VitekContext } from \"vitek-plugin\";\nexport default async function handler(context: VitekContext) {\n const { params } = context;\n return { id: params.id, name: `User ${params.id}` };\n}\n```\n\nPOST with body: `src/api/posts/index.post.ts`\n```typescript\nimport type { VitekContext } from \"vitek-plugin\";\nexport type Body = { title: string; content: string; authorId: number };\nexport default async function handler(context: VitekContext) {\n const { body } = context;\n return { message: \"Post created\", post: { id: Math.random(), ...body } };\n}\n```\n\n## Config\n\n- `apiDir`: directory for route files (default `src/api`).\n- `apiBasePath`: URL prefix (default `/api`).\n";
3
+ //# sourceMappingURL=routing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../../src/mcp-docs-server/resources/routing.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,yBAAyB,CAAC;AAElD,eAAO,MAAM,eAAe,ijDA6C3B,CAAC"}
@@ -0,0 +1,47 @@
1
+ export const ROUTING_URI = 'vitek://docs/routing';
2
+ export const ROUTING_CONTENT = `# Vitek – Routing
3
+
4
+ Route handlers receive a \`VitekContext\` and return a plain object or a response from response helpers.
5
+
6
+ ## File naming
7
+
8
+ - \`[name].[method].ts\` or \`.js\` under the API directory (default \`src/api\`).
9
+ - Method: get, post, put, patch, delete, head, options.
10
+ - Dynamic segment: \`[id]\` → one segment (\`users/[id].get.ts\` → pattern \`users/:id\`).
11
+ - Catch-all: \`[...ids]\` → rest of path (\`posts/[...ids].get.ts\` → pattern \`posts/*ids\`).
12
+ - Index route: \`index.get.ts\` or \`folder/index.post.ts\` for directory index.
13
+
14
+ ## Examples
15
+
16
+ Simple GET: \`src/api/health.get.ts\`
17
+ \`\`\`typescript
18
+ import type { VitekContext } from "vitek-plugin";
19
+ export default function handler(context: VitekContext) {
20
+ return { status: "ok", timestamp: new Date().toISOString() };
21
+ }
22
+ \`\`\`
23
+
24
+ Dynamic param: \`src/api/users/[id].get.ts\`
25
+ \`\`\`typescript
26
+ import type { VitekContext } from "vitek-plugin";
27
+ export default async function handler(context: VitekContext) {
28
+ const { params } = context;
29
+ return { id: params.id, name: \`User \${params.id}\` };
30
+ }
31
+ \`\`\`
32
+
33
+ POST with body: \`src/api/posts/index.post.ts\`
34
+ \`\`\`typescript
35
+ import type { VitekContext } from "vitek-plugin";
36
+ export type Body = { title: string; content: string; authorId: number };
37
+ export default async function handler(context: VitekContext) {
38
+ const { body } = context;
39
+ return { message: "Post created", post: { id: Math.random(), ...body } };
40
+ }
41
+ \`\`\`
42
+
43
+ ## Config
44
+
45
+ - \`apiDir\`: directory for route files (default \`src/api\`).
46
+ - \`apiBasePath\`: URL prefix (default \`/api\`).
47
+ `;
@@ -0,0 +1,3 @@
1
+ export declare const VALIDATION_URI = "vitek://docs/validation";
2
+ export declare const VALIDATION_CONTENT = "# Vitek \u2013 Request validation\n\nOptional runtime validation for body and query via helpers.\n\n## Helpers\n\n- `validateBody(body, schema)` \u2013 validates request body; throws ValidationError (422) if invalid\n- `validateQuery(query, schema)` \u2013 validates query params\n- `validate(data, schema)` \u2013 returns result without throwing\n- `validateOrThrow(data, schema)` \u2013 throws ValidationError if invalid\n\n## ValidationRule (per field)\n\n`type`: \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\"\n`required?`, `min?`, `max?`, `pattern?` (string or RegExp), `custom?` (value => boolean | string)\n\n## Example\n\n```typescript\nimport { validateBody, validateQuery } from \"vitek-plugin\";\nimport type { VitekContext } from \"vitek-plugin\";\n\nexport default function handler(context: VitekContext) {\n const body = validateBody(context.body, {\n title: { type: \"string\", required: true, min: 1, max: 200 },\n authorId: { type: \"number\", required: true, min: 1 },\n });\n const query = validateQuery(context.query, {\n limit: { type: \"number\", min: 1, max: 100 },\n });\n return { body, query };\n}\n```\n\nPlugin option `enableValidation: true` enables automatic validation; manual helpers are always available.\n";
3
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/mcp-docs-server/resources/validation.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,4BAA4B,CAAC;AAExD,eAAO,MAAM,kBAAkB,0vCAmC9B,CAAC"}
@@ -0,0 +1,37 @@
1
+ export const VALIDATION_URI = 'vitek://docs/validation';
2
+ export const VALIDATION_CONTENT = `# Vitek – Request validation
3
+
4
+ Optional runtime validation for body and query via helpers.
5
+
6
+ ## Helpers
7
+
8
+ - \`validateBody(body, schema)\` – validates request body; throws ValidationError (422) if invalid
9
+ - \`validateQuery(query, schema)\` – validates query params
10
+ - \`validate(data, schema)\` – returns result without throwing
11
+ - \`validateOrThrow(data, schema)\` – throws ValidationError if invalid
12
+
13
+ ## ValidationRule (per field)
14
+
15
+ \`type\`: "string" | "number" | "boolean" | "object" | "array"
16
+ \`required?\`, \`min?\`, \`max?\`, \`pattern?\` (string or RegExp), \`custom?\` (value => boolean | string)
17
+
18
+ ## Example
19
+
20
+ \`\`\`typescript
21
+ import { validateBody, validateQuery } from "vitek-plugin";
22
+ import type { VitekContext } from "vitek-plugin";
23
+
24
+ export default function handler(context: VitekContext) {
25
+ const body = validateBody(context.body, {
26
+ title: { type: "string", required: true, min: 1, max: 200 },
27
+ authorId: { type: "number", required: true, min: 1 },
28
+ });
29
+ const query = validateQuery(context.query, {
30
+ limit: { type: "number", min: 1, max: 100 },
31
+ });
32
+ return { body, query };
33
+ }
34
+ \`\`\`
35
+
36
+ Plugin option \`enableValidation: true\` enables automatic validation; manual helpers are always available.
37
+ `;
@@ -0,0 +1,3 @@
1
+ export declare const WEBSOCKETS_URI = "vitek://docs/websockets";
2
+ export declare const WEBSOCKETS_CONTENT = "# Vitek \u2013 WebSockets\n\nFile-based socket routes: `.socket.ts` or `.socket.js` under `src/api`. Default base path `/api/ws`.\n\n## Naming\n\n| File | Path (default base /api/ws) |\n|------|-----------------------------|\n| index.socket.js | /api/ws |\n| chat.socket.js | /api/ws/chat |\n| rooms/[id].socket.js | /api/ws/rooms/:id |\n\nSame `[param]` and `[...rest]` rules as HTTP routes.\n\n## Handler context (VitekSocketContext)\n\n- `ctx.socket` \u2013 WebSocket (send, on('message'), close)\n- `ctx.req` \u2013 HTTP upgrade request\n- `ctx.params` \u2013 route params\n- `ctx.path` \u2013 full path (e.g. /api/ws/chat)\n- `ctx.api` \u2013 (when available) internal API client: `ctx.api.fetch(path, { method?, body? })`\n\nExport default handler; can return a cleanup function (runs on disconnect).\n\n```typescript\nexport default function handler(ctx) {\n ctx.socket.on('message', (data) => {\n ctx.socket.send(`Echo: ${data}`);\n });\n return () => { /* cleanup */ };\n}\n```\n\n## API \u2192 Socket (broadcast)\n\nIn HTTP handlers, `context.sockets` (when available): `context.sockets.emit(pattern, data)`. `pattern` is the socket route ('' for root, 'chat' for /api/ws/chat).\n\n## Config\n\n`sockets: { path: '/ws' }` \u2013 custom base path. `sockets: false` \u2013 disable.\n";
3
+ //# sourceMappingURL=websockets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websockets.d.ts","sourceRoot":"","sources":["../../../src/mcp-docs-server/resources/websockets.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,4BAA4B,CAAC;AAExD,eAAO,MAAM,kBAAkB,sxCAwC9B,CAAC"}
@@ -0,0 +1,42 @@
1
+ export const WEBSOCKETS_URI = 'vitek://docs/websockets';
2
+ export const WEBSOCKETS_CONTENT = `# Vitek – WebSockets
3
+
4
+ File-based socket routes: \`.socket.ts\` or \`.socket.js\` under \`src/api\`. Default base path \`/api/ws\`.
5
+
6
+ ## Naming
7
+
8
+ | File | Path (default base /api/ws) |
9
+ |------|-----------------------------|
10
+ | index.socket.js | /api/ws |
11
+ | chat.socket.js | /api/ws/chat |
12
+ | rooms/[id].socket.js | /api/ws/rooms/:id |
13
+
14
+ Same \`[param]\` and \`[...rest]\` rules as HTTP routes.
15
+
16
+ ## Handler context (VitekSocketContext)
17
+
18
+ - \`ctx.socket\` – WebSocket (send, on('message'), close)
19
+ - \`ctx.req\` – HTTP upgrade request
20
+ - \`ctx.params\` – route params
21
+ - \`ctx.path\` – full path (e.g. /api/ws/chat)
22
+ - \`ctx.api\` – (when available) internal API client: \`ctx.api.fetch(path, { method?, body? })\`
23
+
24
+ Export default handler; can return a cleanup function (runs on disconnect).
25
+
26
+ \`\`\`typescript
27
+ export default function handler(ctx) {
28
+ ctx.socket.on('message', (data) => {
29
+ ctx.socket.send(\`Echo: \${data}\`);
30
+ });
31
+ return () => { /* cleanup */ };
32
+ }
33
+ \`\`\`
34
+
35
+ ## API → Socket (broadcast)
36
+
37
+ In HTTP handlers, \`context.sockets\` (when available): \`context.sockets.emit(pattern, data)\`. \`pattern\` is the socket route ('' for root, 'chat' for /api/ws/chat).
38
+
39
+ ## Config
40
+
41
+ \`sockets: { path: '/ws' }\` – custom base path. \`sockets: false\` – disable.
42
+ `;
@@ -0,0 +1,2 @@
1
+ export declare function startMcpDocsServer(): Promise<void>;
2
+ //# sourceMappingURL=start-mcp-docs-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-mcp-docs-server.d.ts","sourceRoot":"","sources":["../../src/mcp-docs-server/start-mcp-docs-server.ts"],"names":[],"mappings":"AA4BA,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAwOxD"}
@@ -0,0 +1,171 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
6
+ import { z } from 'zod';
7
+ import { ROUTING_URI, ROUTING_CONTENT } from './resources/routing.js';
8
+ import { CONTEXT_URI, CONTEXT_CONTENT } from './resources/context.js';
9
+ import { RESPONSE_URI, RESPONSE_CONTENT } from './resources/response.js';
10
+ import { MIDDLEWARES_URI, MIDDLEWARES_CONTENT } from './resources/middlewares.js';
11
+ import { WEBSOCKETS_URI, WEBSOCKETS_CONTENT } from './resources/websockets.js';
12
+ import { VALIDATION_URI, VALIDATION_CONTENT } from './resources/validation.js';
13
+ import { ERRORS_URI, ERRORS_CONTENT } from './resources/errors.js';
14
+ import { PLUGIN_API_URI, PLUGIN_API_CONTENT } from './resources/plugin-api.js';
15
+ import { CONFIGURATION_URI, CONFIGURATION_CONTENT } from './resources/configuration.js';
16
+ import { INTROSPECTION_URI, INTROSPECTION_CONTENT } from './resources/introspection.js';
17
+ import { pathToRouteFilePath } from './tools/create-route.js';
18
+ import { pathToMiddlewareFilePath } from './tools/create-middleware.js';
19
+ import { pathToSocketFilePath } from './tools/create-socket.js';
20
+ import { suggestViteConfig } from './tools/suggest-vite-config.js';
21
+ import { validateConvention } from './tools/validate-convention.js';
22
+ function readPluginVersion() {
23
+ const here = dirname(fileURLToPath(import.meta.url));
24
+ const pkgPath = join(here, '../../package.json');
25
+ return JSON.parse(readFileSync(pkgPath, 'utf-8')).version;
26
+ }
27
+ export async function startMcpDocsServer() {
28
+ const server = new McpServer({
29
+ name: 'vitek-mcp-docs',
30
+ version: readPluginVersion(),
31
+ }, {
32
+ capabilities: {
33
+ resources: {},
34
+ tools: {},
35
+ },
36
+ });
37
+ server.registerResource('vitek-docs-routing', ROUTING_URI, {
38
+ title: 'Vitek routing',
39
+ description: 'File-based routing conventions and examples',
40
+ mimeType: 'text/plain',
41
+ }, async () => ({
42
+ contents: [{ uri: ROUTING_URI, text: ROUTING_CONTENT }],
43
+ }));
44
+ server.registerResource('vitek-docs-context', CONTEXT_URI, {
45
+ title: 'Vitek context',
46
+ description: 'VitekContext and VitekRequest',
47
+ mimeType: 'text/plain',
48
+ }, async () => ({
49
+ contents: [{ uri: CONTEXT_URI, text: CONTEXT_CONTENT }],
50
+ }));
51
+ server.registerResource('vitek-docs-response', RESPONSE_URI, {
52
+ title: 'Vitek response',
53
+ description: 'Response helpers and VitekResponse',
54
+ mimeType: 'text/plain',
55
+ }, async () => ({
56
+ contents: [{ uri: RESPONSE_URI, text: RESPONSE_CONTENT }],
57
+ }));
58
+ server.registerResource('vitek-docs-middlewares', MIDDLEWARES_URI, { title: 'Vitek middlewares', description: 'Global and hierarchical middlewares', mimeType: 'text/plain' }, async () => ({ contents: [{ uri: MIDDLEWARES_URI, text: MIDDLEWARES_CONTENT }] }));
59
+ server.registerResource('vitek-docs-websockets', WEBSOCKETS_URI, { title: 'Vitek WebSockets', description: 'File-based socket routes and context', mimeType: 'text/plain' }, async () => ({ contents: [{ uri: WEBSOCKETS_URI, text: WEBSOCKETS_CONTENT }] }));
60
+ server.registerResource('vitek-docs-validation', VALIDATION_URI, { title: 'Vitek validation', description: 'validateBody, validateQuery, ValidationRule', mimeType: 'text/plain' }, async () => ({ contents: [{ uri: VALIDATION_URI, text: VALIDATION_CONTENT }] }));
61
+ server.registerResource('vitek-docs-errors', ERRORS_URI, { title: 'Vitek errors', description: 'HttpError classes and onError', mimeType: 'text/plain' }, async () => ({ contents: [{ uri: ERRORS_URI, text: ERRORS_CONTENT }] }));
62
+ server.registerResource('vitek-docs-plugin-api', PLUGIN_API_URI, { title: 'Vitek plugin API', description: 'VitekPlugin, afterTypesGenerated, beforeApiRequest', mimeType: 'text/plain' }, async () => ({ contents: [{ uri: PLUGIN_API_URI, text: PLUGIN_API_CONTENT }] }));
63
+ server.registerResource('vitek-docs-configuration', CONFIGURATION_URI, { title: 'Vitek configuration', description: 'VitekOptions reference', mimeType: 'text/plain' }, async () => ({ contents: [{ uri: CONFIGURATION_URI, text: CONFIGURATION_CONTENT }] }));
64
+ server.registerResource('vitek-docs-introspection', INTROSPECTION_URI, { title: 'Vitek introspection', description: 'getManifest, getRoutes, getSockets, writeManifest', mimeType: 'text/plain' }, async () => ({ contents: [{ uri: INTROSPECTION_URI, text: INTROSPECTION_CONTENT }] }));
65
+ server.registerTool('vitek_create_route', {
66
+ title: 'Create Vitek route',
67
+ description: 'Returns a file path and code snippet for a new Vitek route. path can use [id], [...rest], or :id, *rest.',
68
+ inputSchema: {
69
+ path: z.string().describe('Route path, e.g. users/[id] or users/:id or posts/[...ids]'),
70
+ method: z
71
+ .enum(['get', 'post', 'put', 'patch', 'delete', 'head', 'options'])
72
+ .describe('HTTP method'),
73
+ apiDir: z.string().optional().default('src/api').describe('API directory'),
74
+ },
75
+ }, async ({ path, method, apiDir }) => {
76
+ try {
77
+ const { filePath, snippet } = pathToRouteFilePath(path, method, apiDir);
78
+ return {
79
+ content: [
80
+ {
81
+ type: 'text',
82
+ text: `File: ${filePath}\n\n${snippet}`,
83
+ },
84
+ ],
85
+ };
86
+ }
87
+ catch (err) {
88
+ const message = err instanceof Error ? err.message : String(err);
89
+ return {
90
+ content: [{ type: 'text', text: `Error: ${message}` }],
91
+ isError: true,
92
+ };
93
+ }
94
+ });
95
+ server.registerTool('vitek_create_middleware', {
96
+ title: 'Create Vitek middleware',
97
+ description: 'Returns file path and snippet for a new middleware. basePattern: e.g. "users" or "posts/[id]" or empty for global.',
98
+ inputSchema: {
99
+ basePattern: z.string().describe('Path segment for middleware scope, or empty for global (src/api/middleware.ts)'),
100
+ apiDir: z.string().optional().default('src/api').describe('API directory'),
101
+ },
102
+ }, async ({ basePattern, apiDir }) => {
103
+ try {
104
+ const { filePath, snippet } = pathToMiddlewareFilePath(basePattern, apiDir);
105
+ return { content: [{ type: 'text', text: `File: ${filePath}\n\n${snippet}` }] };
106
+ }
107
+ catch (err) {
108
+ const message = err instanceof Error ? err.message : String(err);
109
+ return { content: [{ type: 'text', text: `Error: ${message}` }], isError: true };
110
+ }
111
+ });
112
+ server.registerTool('vitek_create_socket', {
113
+ title: 'Create Vitek socket',
114
+ description: 'Returns file path and snippet for a new WebSocket handler. pattern: e.g. "chat" or "rooms/[id]".',
115
+ inputSchema: {
116
+ pattern: z.string().describe('Socket path pattern, e.g. chat or rooms/[id]'),
117
+ apiDir: z.string().optional().default('src/api').describe('API directory'),
118
+ },
119
+ }, async ({ pattern, apiDir }) => {
120
+ try {
121
+ const { filePath, snippet } = pathToSocketFilePath(pattern, apiDir);
122
+ return { content: [{ type: 'text', text: `File: ${filePath}\n\n${snippet}` }] };
123
+ }
124
+ catch (err) {
125
+ const message = err instanceof Error ? err.message : String(err);
126
+ return { content: [{ type: 'text', text: `Error: ${message}` }], isError: true };
127
+ }
128
+ });
129
+ server.registerTool('vitek_suggest_vite_config', {
130
+ title: 'Suggest Vite + Vitek config',
131
+ description: 'Returns a vite.config.ts snippet with vitek() and optional openApi, cors, apiDir, sockets.',
132
+ inputSchema: {
133
+ openApi: z.boolean().optional().describe('Enable OpenAPI docs'),
134
+ cors: z.boolean().optional().describe('Enable CORS'),
135
+ apiDir: z.string().optional().describe('API directory'),
136
+ apiBasePath: z.string().optional().describe('API base path'),
137
+ socketsPath: z.string().optional().describe('Custom socket path, e.g. /ws'),
138
+ },
139
+ }, async (args) => {
140
+ const options = {
141
+ openApi: args.openApi,
142
+ cors: args.cors,
143
+ apiDir: args.apiDir,
144
+ apiBasePath: args.apiBasePath,
145
+ sockets: args.socketsPath != null ? { path: args.socketsPath } : undefined,
146
+ };
147
+ const snippet = suggestViteConfig(options);
148
+ return { content: [{ type: 'text', text: snippet }] };
149
+ });
150
+ server.registerTool('vitek_validate_convention', {
151
+ title: 'Validate Vitek file convention',
152
+ description: 'Checks if a file path follows Vitek naming (route, middleware, or socket). Returns type, method/pattern if valid.',
153
+ inputSchema: {
154
+ filePath: z.string().describe('Path to file, e.g. src/api/users/[id].get.ts'),
155
+ apiDir: z.string().optional().default('src/api').describe('API directory'),
156
+ },
157
+ }, async ({ filePath, apiDir }) => {
158
+ const result = validateConvention(filePath, apiDir);
159
+ if (result.valid) {
160
+ const detail = result.type === 'route'
161
+ ? `method=${result.method} pattern=${result.pattern} params=[${result.params.join(', ')}]`
162
+ : result.type === 'middleware'
163
+ ? `basePattern=${result.basePattern || '(global)'}`
164
+ : `pattern=${result.pattern} params=[${result.params.join(', ')}]`;
165
+ return { content: [{ type: 'text', text: `Valid ${result.type}: ${detail}` }] };
166
+ }
167
+ return { content: [{ type: 'text', text: result.message }], isError: true };
168
+ });
169
+ const transport = new StdioServerTransport();
170
+ await server.connect(transport);
171
+ }
@@ -0,0 +1,5 @@
1
+ export declare function pathToMiddlewareFilePath(basePattern: string, apiDir?: string): {
2
+ filePath: string;
3
+ snippet: string;
4
+ };
5
+ //# sourceMappingURL=create-middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-middleware.d.ts","sourceRoot":"","sources":["../../../src/mcp-docs-server/tools/create-middleware.ts"],"names":[],"mappings":"AAQA,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,MAAM,GAAE,MAAkB,GACzB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAmBvC"}
@@ -0,0 +1,29 @@
1
+ function pathToFileSegment(segment) {
2
+ if (/^\[\.\.\.[^\]]+\]$/.test(segment))
3
+ return segment;
4
+ if (/^\[[^\]]+\]$/.test(segment))
5
+ return segment;
6
+ if (segment.startsWith('*'))
7
+ return `[...${segment.slice(1)}]`;
8
+ if (segment.startsWith(':'))
9
+ return `[${segment.slice(1)}]`;
10
+ return segment;
11
+ }
12
+ export function pathToMiddlewareFilePath(basePattern, apiDir = 'src/api') {
13
+ const normalized = basePattern.replace(/\\/g, '/').replace(/^\/+|\/+$/g, '');
14
+ const segments = normalized ? normalized.split('/').filter(Boolean) : [];
15
+ const fileSegments = segments.map((s) => pathToFileSegment(s));
16
+ const dirPart = fileSegments.length ? fileSegments.join('/') : '';
17
+ const filePath = dirPart
18
+ ? `${apiDir}/${dirPart}/middleware.ts`.replace(/\/+/g, '/')
19
+ : `${apiDir}/middleware.ts`.replace(/\/+/g, '/');
20
+ const snippet = `import type { Middleware } from "vitek-plugin";
21
+
22
+ export default [
23
+ async (context, next) => {
24
+ await next();
25
+ },
26
+ ] satisfies Middleware[];
27
+ `;
28
+ return { filePath, snippet };
29
+ }
@@ -0,0 +1,5 @@
1
+ export declare function pathToRouteFilePath(pathInput: string, method: string, apiDir?: string): {
2
+ filePath: string;
3
+ snippet: string;
4
+ };
5
+ //# sourceMappingURL=create-route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-route.d.ts","sourceRoot":"","sources":["../../../src/mcp-docs-server/tools/create-route.ts"],"names":[],"mappings":"AAUA,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,MAAkB,GACzB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAiCvC"}
@@ -0,0 +1,44 @@
1
+ const HTTP_METHODS = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options'];
2
+ function pathToFileSegment(segment) {
3
+ if (/^\[\.\.\.[^\]]+\]$/.test(segment))
4
+ return segment;
5
+ if (/^\[[^\]]+\]$/.test(segment))
6
+ return segment;
7
+ if (segment.startsWith('*'))
8
+ return `[...${segment.slice(1)}]`;
9
+ if (segment.startsWith(':'))
10
+ return `[${segment.slice(1)}]`;
11
+ return segment;
12
+ }
13
+ export function pathToRouteFilePath(pathInput, method, apiDir = 'src/api') {
14
+ const methodLower = method.toLowerCase();
15
+ if (!HTTP_METHODS.includes(methodLower)) {
16
+ throw new Error(`Invalid method: ${method}. Use one of ${HTTP_METHODS.join(', ')}`);
17
+ }
18
+ const normalized = pathInput.replace(/\\/g, '/').replace(/^\/+|\/+$/g, '');
19
+ const segments = normalized ? normalized.split('/').filter(Boolean) : [];
20
+ const fileSegments = segments.map((s) => pathToFileSegment(s));
21
+ const pathPart = fileSegments.length ? fileSegments.join('/') : 'index';
22
+ const fileName = `${pathPart}.${methodLower}.ts`;
23
+ const filePath = `${apiDir}/${fileName}`.replace(/\/+/g, '/');
24
+ const paramNames = segments
25
+ .filter((s) => s.startsWith(':') || s.startsWith('*') || /^\[\.\.\.[^\]]+\]$/.test(s) || /^\[[^\]]+\]$/.test(s))
26
+ .map((s) => {
27
+ if (s.startsWith('*'))
28
+ return s.slice(1);
29
+ if (s.startsWith(':'))
30
+ return s.slice(1);
31
+ const m = s.match(/^\[\.\.\.?([^\]]+)\]$/);
32
+ return m ? m[1] : s;
33
+ });
34
+ const paramsSnippet = paramNames.length > 0
35
+ ? ` const { params } = context;\n return { ${paramNames.map((p) => `${p}: params.${p}`).join(', ')} };`
36
+ : ' return { message: "ok" };';
37
+ const snippet = `import type { VitekContext } from "vitek-plugin";
38
+
39
+ export default async function handler(context: VitekContext) {
40
+ ${paramsSnippet}
41
+ }
42
+ `;
43
+ return { filePath, snippet };
44
+ }
@@ -0,0 +1,5 @@
1
+ export declare function pathToSocketFilePath(pattern: string, apiDir?: string): {
2
+ filePath: string;
3
+ snippet: string;
4
+ };
5
+ //# sourceMappingURL=create-socket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-socket.d.ts","sourceRoot":"","sources":["../../../src/mcp-docs-server/tools/create-socket.ts"],"names":[],"mappings":"AAQA,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,MAAkB,GACzB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA8BvC"}