@mcpmake/core 0.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.
Files changed (323) hide show
  1. package/dist/analyzer/auth-detector.d.ts +13 -0
  2. package/dist/analyzer/auth-detector.d.ts.map +1 -0
  3. package/dist/analyzer/auth-detector.js +143 -0
  4. package/dist/analyzer/auth-detector.js.map +1 -0
  5. package/dist/analyzer/dom-parser.d.ts +11 -0
  6. package/dist/analyzer/dom-parser.d.ts.map +1 -0
  7. package/dist/analyzer/dom-parser.js +260 -0
  8. package/dist/analyzer/dom-parser.js.map +1 -0
  9. package/dist/analyzer/goal-crawler.d.ts +26 -0
  10. package/dist/analyzer/goal-crawler.d.ts.map +1 -0
  11. package/dist/analyzer/goal-crawler.js +178 -0
  12. package/dist/analyzer/goal-crawler.js.map +1 -0
  13. package/dist/analyzer/hybrid-detector.d.ts +29 -0
  14. package/dist/analyzer/hybrid-detector.d.ts.map +1 -0
  15. package/dist/analyzer/hybrid-detector.js +97 -0
  16. package/dist/analyzer/hybrid-detector.js.map +1 -0
  17. package/dist/analyzer/index.d.ts +13 -0
  18. package/dist/analyzer/index.d.ts.map +1 -0
  19. package/dist/analyzer/index.js +9 -0
  20. package/dist/analyzer/index.js.map +1 -0
  21. package/dist/analyzer/screenshot-capture.d.ts +30 -0
  22. package/dist/analyzer/screenshot-capture.d.ts.map +1 -0
  23. package/dist/analyzer/screenshot-capture.js +43 -0
  24. package/dist/analyzer/screenshot-capture.js.map +1 -0
  25. package/dist/analyzer/selector-builder.d.ts +20 -0
  26. package/dist/analyzer/selector-builder.d.ts.map +1 -0
  27. package/dist/analyzer/selector-builder.js +200 -0
  28. package/dist/analyzer/selector-builder.js.map +1 -0
  29. package/dist/analyzer/semantic-analyzer.d.ts +14 -0
  30. package/dist/analyzer/semantic-analyzer.d.ts.map +1 -0
  31. package/dist/analyzer/semantic-analyzer.js +146 -0
  32. package/dist/analyzer/semantic-analyzer.js.map +1 -0
  33. package/dist/analyzer/site-crawler.d.ts +39 -0
  34. package/dist/analyzer/site-crawler.d.ts.map +1 -0
  35. package/dist/analyzer/site-crawler.js +236 -0
  36. package/dist/analyzer/site-crawler.js.map +1 -0
  37. package/dist/config/configurable-command.d.ts +14 -0
  38. package/dist/config/configurable-command.d.ts.map +1 -0
  39. package/dist/config/configurable-command.js +71 -0
  40. package/dist/config/configurable-command.js.map +1 -0
  41. package/dist/config/mcpmake-config.d.ts +69 -0
  42. package/dist/config/mcpmake-config.d.ts.map +1 -0
  43. package/dist/config/mcpmake-config.js +209 -0
  44. package/dist/config/mcpmake-config.js.map +1 -0
  45. package/dist/emitter/code-writer.d.ts +9 -0
  46. package/dist/emitter/code-writer.d.ts.map +1 -0
  47. package/dist/emitter/code-writer.js +26 -0
  48. package/dist/emitter/code-writer.js.map +1 -0
  49. package/dist/emitter/index.d.ts +33 -0
  50. package/dist/emitter/index.d.ts.map +1 -0
  51. package/dist/emitter/index.js +297 -0
  52. package/dist/emitter/index.js.map +1 -0
  53. package/dist/emitter/mcpb-bundler.d.ts +32 -0
  54. package/dist/emitter/mcpb-bundler.d.ts.map +1 -0
  55. package/dist/emitter/mcpb-bundler.js +173 -0
  56. package/dist/emitter/mcpb-bundler.js.map +1 -0
  57. package/dist/emitter/project-scaffolder.d.ts +5 -0
  58. package/dist/emitter/project-scaffolder.d.ts.map +1 -0
  59. package/dist/emitter/project-scaffolder.js +101 -0
  60. package/dist/emitter/project-scaffolder.js.map +1 -0
  61. package/dist/emitter/python-template-loader.d.ts +5 -0
  62. package/dist/emitter/python-template-loader.d.ts.map +1 -0
  63. package/dist/emitter/python-template-loader.js +31 -0
  64. package/dist/emitter/python-template-loader.js.map +1 -0
  65. package/dist/emitter/python-templates/dockerfile.hbs +14 -0
  66. package/dist/emitter/python-templates/env.example.hbs +12 -0
  67. package/dist/emitter/python-templates/requirements.txt.hbs +4 -0
  68. package/dist/emitter/python-templates/server.py.hbs +93 -0
  69. package/dist/emitter/site-scaffolder.d.ts +14 -0
  70. package/dist/emitter/site-scaffolder.d.ts.map +1 -0
  71. package/dist/emitter/site-scaffolder.js +71 -0
  72. package/dist/emitter/site-scaffolder.js.map +1 -0
  73. package/dist/emitter/site-template-loader.d.ts +6 -0
  74. package/dist/emitter/site-template-loader.d.ts.map +1 -0
  75. package/dist/emitter/site-template-loader.js +48 -0
  76. package/dist/emitter/site-template-loader.js.map +1 -0
  77. package/dist/emitter/site-templates/browser-manager.ts.hbs +233 -0
  78. package/dist/emitter/site-templates/config.ts.hbs +28 -0
  79. package/dist/emitter/site-templates/dockerfile.hbs +31 -0
  80. package/dist/emitter/site-templates/env.example.hbs +19 -0
  81. package/dist/emitter/site-templates/package.json.hbs +26 -0
  82. package/dist/emitter/site-templates/server-main-http.ts.hbs +108 -0
  83. package/dist/emitter/site-templates/server-main.ts.hbs +23 -0
  84. package/dist/emitter/site-templates/tool-handler-action.ts.hbs +86 -0
  85. package/dist/emitter/site-templates/tool-handler-form.ts.hbs +116 -0
  86. package/dist/emitter/site-templates/tool-handler-lifecycle.ts.hbs +146 -0
  87. package/dist/emitter/site-templates/tool-index.ts.hbs +11 -0
  88. package/dist/emitter/template-loader.d.ts +2 -0
  89. package/dist/emitter/template-loader.d.ts.map +1 -0
  90. package/dist/emitter/template-loader.js +28 -0
  91. package/dist/emitter/template-loader.js.map +1 -0
  92. package/dist/emitter/templates/auth-provider.ts.hbs +57 -0
  93. package/dist/emitter/templates/config.ts.hbs +110 -0
  94. package/dist/emitter/templates/discovery.ts.hbs +320 -0
  95. package/dist/emitter/templates/dockerfile.hbs +34 -0
  96. package/dist/emitter/templates/env.example.hbs +52 -0
  97. package/dist/emitter/templates/gitignore.hbs +5 -0
  98. package/dist/emitter/templates/http-executor.ts.hbs +159 -0
  99. package/dist/emitter/templates/oauth.ts.hbs +188 -0
  100. package/dist/emitter/templates/package.json.hbs +25 -0
  101. package/dist/emitter/templates/prompts.ts.hbs +22 -0
  102. package/dist/emitter/templates/readme.md.hbs +156 -0
  103. package/dist/emitter/templates/resources.ts.hbs +63 -0
  104. package/dist/emitter/templates/response-filter.ts.hbs +128 -0
  105. package/dist/emitter/templates/server-main-http.ts.hbs +442 -0
  106. package/dist/emitter/templates/server-main.ts.hbs +40 -0
  107. package/dist/emitter/templates/task-handlers.ts.hbs +189 -0
  108. package/dist/emitter/templates/task-manager.ts.hbs +139 -0
  109. package/dist/emitter/templates/task-sse.ts.hbs +105 -0
  110. package/dist/emitter/templates/tool-handler.ts.hbs +142 -0
  111. package/dist/emitter/templates/tool-index.ts.hbs +42 -0
  112. package/dist/emitter/templates/tool-test.ts.hbs +57 -0
  113. package/dist/emitter/templates/trace.ts.hbs +79 -0
  114. package/dist/emitter/templates/tsconfig.json.hbs +16 -0
  115. package/dist/emitter/templates/types.ts.hbs +5 -0
  116. package/dist/emitter/worker-template-loader.d.ts +6 -0
  117. package/dist/emitter/worker-template-loader.d.ts.map +1 -0
  118. package/dist/emitter/worker-template-loader.js +34 -0
  119. package/dist/emitter/worker-template-loader.js.map +1 -0
  120. package/dist/emitter/worker-templates/config.ts.hbs +93 -0
  121. package/dist/emitter/worker-templates/dev-vars.example.hbs +27 -0
  122. package/dist/emitter/worker-templates/gitignore.hbs +6 -0
  123. package/dist/emitter/worker-templates/package.json.hbs +24 -0
  124. package/dist/emitter/worker-templates/readme.md.hbs +73 -0
  125. package/dist/emitter/worker-templates/server.test.ts.hbs +20 -0
  126. package/dist/emitter/worker-templates/tool-handler.ts.hbs +103 -0
  127. package/dist/emitter/worker-templates/tool-index.ts.hbs +28 -0
  128. package/dist/emitter/worker-templates/tsconfig.json.hbs +17 -0
  129. package/dist/emitter/worker-templates/worker.ts.hbs +286 -0
  130. package/dist/emitter/worker-templates/wrangler.toml.hbs +19 -0
  131. package/dist/generator/spec-generator.d.ts +7 -0
  132. package/dist/generator/spec-generator.d.ts.map +1 -0
  133. package/dist/generator/spec-generator.js +51 -0
  134. package/dist/generator/spec-generator.js.map +1 -0
  135. package/dist/index.d.ts +75 -0
  136. package/dist/index.d.ts.map +1 -0
  137. package/dist/index.js +101 -0
  138. package/dist/index.js.map +1 -0
  139. package/dist/parser/har-filter.d.ts +9 -0
  140. package/dist/parser/har-filter.d.ts.map +1 -0
  141. package/dist/parser/har-filter.js +72 -0
  142. package/dist/parser/har-filter.js.map +1 -0
  143. package/dist/parser/har-loader.d.ts +3 -0
  144. package/dist/parser/har-loader.d.ts.map +1 -0
  145. package/dist/parser/har-loader.js +15 -0
  146. package/dist/parser/har-loader.js.map +1 -0
  147. package/dist/parser/har-normalizer.d.ts +21 -0
  148. package/dist/parser/har-normalizer.d.ts.map +1 -0
  149. package/dist/parser/har-normalizer.js +79 -0
  150. package/dist/parser/har-normalizer.js.map +1 -0
  151. package/dist/parser/index.d.ts +11 -0
  152. package/dist/parser/index.d.ts.map +1 -0
  153. package/dist/parser/index.js +7 -0
  154. package/dist/parser/index.js.map +1 -0
  155. package/dist/parser/openapi-loader.d.ts +7 -0
  156. package/dist/parser/openapi-loader.d.ts.map +1 -0
  157. package/dist/parser/openapi-loader.js +309 -0
  158. package/dist/parser/openapi-loader.js.map +1 -0
  159. package/dist/parser/operation-extractor.d.ts +14 -0
  160. package/dist/parser/operation-extractor.d.ts.map +1 -0
  161. package/dist/parser/operation-extractor.js +156 -0
  162. package/dist/parser/operation-extractor.js.map +1 -0
  163. package/dist/parser/overlay-loader.d.ts +11 -0
  164. package/dist/parser/overlay-loader.d.ts.map +1 -0
  165. package/dist/parser/overlay-loader.js +185 -0
  166. package/dist/parser/overlay-loader.js.map +1 -0
  167. package/dist/parser/postman-loader.d.ts +10 -0
  168. package/dist/parser/postman-loader.d.ts.map +1 -0
  169. package/dist/parser/postman-loader.js +107 -0
  170. package/dist/parser/postman-loader.js.map +1 -0
  171. package/dist/parser/schema-converter.d.ts +13 -0
  172. package/dist/parser/schema-converter.d.ts.map +1 -0
  173. package/dist/parser/schema-converter.js +118 -0
  174. package/dist/parser/schema-converter.js.map +1 -0
  175. package/dist/plugins/adapter.d.ts +41 -0
  176. package/dist/plugins/adapter.d.ts.map +1 -0
  177. package/dist/plugins/adapter.js +16 -0
  178. package/dist/plugins/adapter.js.map +1 -0
  179. package/dist/plugins/loader.d.ts +26 -0
  180. package/dist/plugins/loader.d.ts.map +1 -0
  181. package/dist/plugins/loader.js +59 -0
  182. package/dist/plugins/loader.js.map +1 -0
  183. package/dist/pricing.d.ts +56 -0
  184. package/dist/pricing.d.ts.map +1 -0
  185. package/dist/pricing.js +134 -0
  186. package/dist/pricing.js.map +1 -0
  187. package/dist/providers/index.d.ts +16 -0
  188. package/dist/providers/index.d.ts.map +1 -0
  189. package/dist/providers/index.js +57 -0
  190. package/dist/providers/index.js.map +1 -0
  191. package/dist/recorder/browser-recorder.d.ts +23 -0
  192. package/dist/recorder/browser-recorder.d.ts.map +1 -0
  193. package/dist/recorder/browser-recorder.js +206 -0
  194. package/dist/recorder/browser-recorder.js.map +1 -0
  195. package/dist/rescan/diff-engine.d.ts +6 -0
  196. package/dist/rescan/diff-engine.d.ts.map +1 -0
  197. package/dist/rescan/diff-engine.js +313 -0
  198. package/dist/rescan/diff-engine.js.map +1 -0
  199. package/dist/rescan/index.d.ts +4 -0
  200. package/dist/rescan/index.d.ts.map +1 -0
  201. package/dist/rescan/index.js +3 -0
  202. package/dist/rescan/index.js.map +1 -0
  203. package/dist/rescan/rescan-runner.d.ts +43 -0
  204. package/dist/rescan/rescan-runner.d.ts.map +1 -0
  205. package/dist/rescan/rescan-runner.js +70 -0
  206. package/dist/rescan/rescan-runner.js.map +1 -0
  207. package/dist/rescan/rescan-scheduler.d.ts +42 -0
  208. package/dist/rescan/rescan-scheduler.d.ts.map +1 -0
  209. package/dist/rescan/rescan-scheduler.js +180 -0
  210. package/dist/rescan/rescan-scheduler.js.map +1 -0
  211. package/dist/site-transformer/browser-tools.d.ts +11 -0
  212. package/dist/site-transformer/browser-tools.d.ts.map +1 -0
  213. package/dist/site-transformer/browser-tools.js +60 -0
  214. package/dist/site-transformer/browser-tools.js.map +1 -0
  215. package/dist/site-transformer/index.d.ts +3 -0
  216. package/dist/site-transformer/index.d.ts.map +1 -0
  217. package/dist/site-transformer/index.js +3 -0
  218. package/dist/site-transformer/index.js.map +1 -0
  219. package/dist/site-transformer/selector-healer.d.ts +9 -0
  220. package/dist/site-transformer/selector-healer.d.ts.map +1 -0
  221. package/dist/site-transformer/selector-healer.js +107 -0
  222. package/dist/site-transformer/selector-healer.js.map +1 -0
  223. package/dist/site-transformer/tool-generator.d.ts +14 -0
  224. package/dist/site-transformer/tool-generator.d.ts.map +1 -0
  225. package/dist/site-transformer/tool-generator.js +246 -0
  226. package/dist/site-transformer/tool-generator.js.map +1 -0
  227. package/dist/transformer/auth-detector.d.ts +29 -0
  228. package/dist/transformer/auth-detector.d.ts.map +1 -0
  229. package/dist/transformer/auth-detector.js +104 -0
  230. package/dist/transformer/auth-detector.js.map +1 -0
  231. package/dist/transformer/catalog-builder.d.ts +19 -0
  232. package/dist/transformer/catalog-builder.d.ts.map +1 -0
  233. package/dist/transformer/catalog-builder.js +57 -0
  234. package/dist/transformer/catalog-builder.js.map +1 -0
  235. package/dist/transformer/client-compat.d.ts +7 -0
  236. package/dist/transformer/client-compat.d.ts.map +1 -0
  237. package/dist/transformer/client-compat.js +45 -0
  238. package/dist/transformer/client-compat.js.map +1 -0
  239. package/dist/transformer/har-clusterer.d.ts +10 -0
  240. package/dist/transformer/har-clusterer.d.ts.map +1 -0
  241. package/dist/transformer/har-clusterer.js +28 -0
  242. package/dist/transformer/har-clusterer.js.map +1 -0
  243. package/dist/transformer/har-dedup.d.ts +11 -0
  244. package/dist/transformer/har-dedup.d.ts.map +1 -0
  245. package/dist/transformer/har-dedup.js +82 -0
  246. package/dist/transformer/har-dedup.js.map +1 -0
  247. package/dist/transformer/har-schema-inferrer.d.ts +16 -0
  248. package/dist/transformer/har-schema-inferrer.d.ts.map +1 -0
  249. package/dist/transformer/har-schema-inferrer.js +91 -0
  250. package/dist/transformer/har-schema-inferrer.js.map +1 -0
  251. package/dist/transformer/har-to-operations.d.ts +14 -0
  252. package/dist/transformer/har-to-operations.d.ts.map +1 -0
  253. package/dist/transformer/har-to-operations.js +193 -0
  254. package/dist/transformer/har-to-operations.js.map +1 -0
  255. package/dist/transformer/index.d.ts +9 -0
  256. package/dist/transformer/index.d.ts.map +1 -0
  257. package/dist/transformer/index.js +7 -0
  258. package/dist/transformer/index.js.map +1 -0
  259. package/dist/transformer/llm-namer.d.ts +7 -0
  260. package/dist/transformer/llm-namer.d.ts.map +1 -0
  261. package/dist/transformer/llm-namer.js +60 -0
  262. package/dist/transformer/llm-namer.js.map +1 -0
  263. package/dist/transformer/naming.d.ts +5 -0
  264. package/dist/transformer/naming.d.ts.map +1 -0
  265. package/dist/transformer/naming.js +31 -0
  266. package/dist/transformer/naming.js.map +1 -0
  267. package/dist/transformer/operation-filter.d.ts +14 -0
  268. package/dist/transformer/operation-filter.d.ts.map +1 -0
  269. package/dist/transformer/operation-filter.js +53 -0
  270. package/dist/transformer/operation-filter.js.map +1 -0
  271. package/dist/transformer/resource-builder.d.ts +13 -0
  272. package/dist/transformer/resource-builder.d.ts.map +1 -0
  273. package/dist/transformer/resource-builder.js +87 -0
  274. package/dist/transformer/resource-builder.js.map +1 -0
  275. package/dist/transformer/schema-merger.d.ts +15 -0
  276. package/dist/transformer/schema-merger.d.ts.map +1 -0
  277. package/dist/transformer/schema-merger.js +66 -0
  278. package/dist/transformer/schema-merger.js.map +1 -0
  279. package/dist/transformer/stainless-config.d.ts +75 -0
  280. package/dist/transformer/stainless-config.d.ts.map +1 -0
  281. package/dist/transformer/stainless-config.js +59 -0
  282. package/dist/transformer/stainless-config.js.map +1 -0
  283. package/dist/transformer/stainless-translator.d.ts +61 -0
  284. package/dist/transformer/stainless-translator.d.ts.map +1 -0
  285. package/dist/transformer/stainless-translator.js +375 -0
  286. package/dist/transformer/stainless-translator.js.map +1 -0
  287. package/dist/transformer/tool-builder.d.ts +4 -0
  288. package/dist/transformer/tool-builder.d.ts.map +1 -0
  289. package/dist/transformer/tool-builder.js +119 -0
  290. package/dist/transformer/tool-builder.js.map +1 -0
  291. package/dist/types/index.d.ts +140 -0
  292. package/dist/types/index.d.ts.map +1 -0
  293. package/dist/types/index.js +2 -0
  294. package/dist/types/index.js.map +1 -0
  295. package/dist/types/site.d.ts +285 -0
  296. package/dist/types/site.d.ts.map +1 -0
  297. package/dist/types/site.js +9 -0
  298. package/dist/types/site.js.map +1 -0
  299. package/dist/utils/fail.d.ts +49 -0
  300. package/dist/utils/fail.d.ts.map +1 -0
  301. package/dist/utils/fail.js +223 -0
  302. package/dist/utils/fail.js.map +1 -0
  303. package/dist/utils/fs.d.ts +6 -0
  304. package/dist/utils/fs.d.ts.map +1 -0
  305. package/dist/utils/fs.js +29 -0
  306. package/dist/utils/fs.js.map +1 -0
  307. package/dist/utils/interactive.d.ts +7 -0
  308. package/dist/utils/interactive.d.ts.map +1 -0
  309. package/dist/utils/interactive.js +31 -0
  310. package/dist/utils/interactive.js.map +1 -0
  311. package/dist/utils/logger.d.ts +2 -0
  312. package/dist/utils/logger.d.ts.map +1 -0
  313. package/dist/utils/logger.js +3 -0
  314. package/dist/utils/logger.js.map +1 -0
  315. package/dist/utils/sanitize.d.ts +29 -0
  316. package/dist/utils/sanitize.d.ts.map +1 -0
  317. package/dist/utils/sanitize.js +45 -0
  318. package/dist/utils/sanitize.js.map +1 -0
  319. package/dist/utils/watcher.d.ts +12 -0
  320. package/dist/utils/watcher.d.ts.map +1 -0
  321. package/dist/utils/watcher.js +37 -0
  322. package/dist/utils/watcher.js.map +1 -0
  323. package/package.json +45 -0
@@ -0,0 +1,223 @@
1
+ /**
2
+ * Centralized failure exit with opt-in, redacted error reporting.
3
+ *
4
+ * Why a shared helper instead of wrapping citty's `runMain`: the commands don't
5
+ * `throw` on user-facing failures — they call `logger.error(...)` and then
6
+ * `process.exit(1)` directly. `process.exit()` terminates the event loop
7
+ * synchronously and bypasses every `try/catch` (including citty's `runMain`
8
+ * handler), so a wrapper around `runMain` would never observe these exits. The
9
+ * only reliable place to hook reporting is the failure site itself, so each
10
+ * command calls `await fail(...)` where it used to log-and-exit.
11
+ *
12
+ * Telemetry is strictly opt-in (consent modes `prompt` | `auto` | `off`), never
13
+ * blocks or breaks the CLI (timeout + swallowed errors, mirroring
14
+ * `fetchPricing`), and auto-degrades to `off` in non-TTY / CI environments so it
15
+ * can never hang a pipeline waiting for input.
16
+ */
17
+ import os from 'node:os';
18
+ import { readFileSync } from 'node:fs';
19
+ import { fileURLToPath } from 'node:url';
20
+ import { consola } from 'consola';
21
+ import { logger } from './logger.js';
22
+ import { loadConfig, globalConfig } from '../config/mcpmake-config.js';
23
+ import { DEFAULT_PRICING_SERVER } from '../pricing.js';
24
+ /**
25
+ * Read this package's version from its own package.json at runtime so the
26
+ * reported version never drifts from the published one. `package.json` always
27
+ * sits two levels up from the compiled `dist/utils/fail.js` (and from this
28
+ * source file), and npm always ships it. Best-effort: this runs on the failure
29
+ * path, so any read/parse error degrades to `'unknown'` rather than throwing.
30
+ */
31
+ function readCliVersion() {
32
+ try {
33
+ const pkgPath = fileURLToPath(new URL('../../package.json', import.meta.url));
34
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
35
+ return typeof pkg.version === 'string' ? pkg.version : 'unknown';
36
+ }
37
+ catch {
38
+ return 'unknown';
39
+ }
40
+ }
41
+ const CLI_VERSION = readCliVersion();
42
+ /** How long to wait for the report POST before giving up (never blocks longer). */
43
+ const REPORT_TIMEOUT_MS = 4_000;
44
+ /** Server-side caps — fields are truncated to these lengths before sending. */
45
+ const CAPS = {
46
+ command: 200,
47
+ errorMessage: 2000,
48
+ stack: 16_000,
49
+ cliVersion: 40,
50
+ platform: 60,
51
+ nodeVersion: 40,
52
+ };
53
+ // --- Redaction helpers -----------------------------------------------------
54
+ /** Replace the user's home directory (and generic /Users|/home/<name>) with `~`. */
55
+ function redactHomePaths(input) {
56
+ let out = input;
57
+ const home = os.homedir();
58
+ if (home) {
59
+ out = out.split(home).join('~');
60
+ }
61
+ // Catch home dirs other than the current user's (e.g. paths from logs/CI).
62
+ out = out.replace(/\/(?:Users|home)\/[^/\s]+/g, '~');
63
+ return out;
64
+ }
65
+ /** Strip bearer tokens: `Bearer <token>` → `Bearer [redacted]`. */
66
+ function redactBearerTokens(input) {
67
+ return input.replace(/Bearer\s+\S+/g, 'Bearer [redacted]');
68
+ }
69
+ /** Strip mcpmake-style tokens (`mf_<hex>`). */
70
+ function redactMfTokens(input) {
71
+ return input.replace(/mf_[a-f0-9]+/g, 'mf_[redacted]');
72
+ }
73
+ /** Strip URL query strings (`?foo=bar` → `?[redacted]`) so creds in URLs don't leak. */
74
+ function redactQueryStrings(input) {
75
+ return input.replace(/\?[^\s'"]+/g, '?[redacted]');
76
+ }
77
+ /**
78
+ * Apply every redaction pass. Run on both errorMessage and stack before use.
79
+ *
80
+ * Exported (as `redactText`) so the redaction contract can be unit-tested
81
+ * directly without invoking `fail()` (which calls `process.exit`).
82
+ */
83
+ export function redactText(input) {
84
+ return redactQueryStrings(redactMfTokens(redactBearerTokens(redactHomePaths(input))));
85
+ }
86
+ /** @deprecated internal alias — prefer the exported `redactText`. */
87
+ const redact = redactText;
88
+ function truncate(input, max) {
89
+ return input.length > max ? input.slice(0, max) : input;
90
+ }
91
+ // --- Payload assembly ------------------------------------------------------
92
+ /**
93
+ * Best-effort command name from argv, e.g. `from openapi` or `deploy`. Joins the
94
+ * first one or two non-flag tokens (subcommands like `from openapi` need two).
95
+ */
96
+ function deriveCommand() {
97
+ const tokens = process.argv.slice(2).filter((t) => !t.startsWith('-'));
98
+ return tokens.slice(0, 2).join(' ');
99
+ }
100
+ function buildPayload(message, error) {
101
+ const errorMessage = error instanceof Error && error.message ? error.message : message;
102
+ const stack = error instanceof Error && error.stack ? error.stack : '';
103
+ return {
104
+ // Redact the command too: a positional arg can be a path or URL with creds
105
+ // (e.g. a mistyped `mcpmake /Users/me/secret.yaml`).
106
+ command: truncate(redact(deriveCommand()), CAPS.command),
107
+ errorMessage: truncate(redact(errorMessage), CAPS.errorMessage),
108
+ stack: truncate(redact(stack), CAPS.stack),
109
+ cliVersion: truncate(CLI_VERSION, CAPS.cliVersion),
110
+ platform: truncate(`${process.platform} ${process.arch}`, CAPS.platform),
111
+ nodeVersion: truncate(process.version, CAPS.nodeVersion),
112
+ };
113
+ }
114
+ /**
115
+ * Pure consent resolver: given the configured mode and the environment, decide
116
+ * the effective {@link ConsentMode}.
117
+ *
118
+ * Auto-degrades to `'off'` whenever there is no interactive TTY or we're in CI —
119
+ * otherwise the CLI could hang waiting for input that will never come. Exported
120
+ * so this branchy decision can be unit-tested without touching real env/config.
121
+ */
122
+ export function resolveTelemetryMode(env) {
123
+ const value = env.configured;
124
+ const mode = value === 'prompt' || value === 'auto' || value === 'off' ? value : 'prompt';
125
+ // Critical: never prompt or block when there is no interactive TTY or we're in
126
+ // CI — otherwise the CLI hangs waiting for input that will never come.
127
+ if (!env.isTTY || env.ci) {
128
+ return 'off';
129
+ }
130
+ return mode;
131
+ }
132
+ /** Read the `telemetry` global config key; default `prompt`. Then apply env gates. */
133
+ function resolveConsent() {
134
+ let configured;
135
+ try {
136
+ const loaded = loadConfig();
137
+ if (loaded) {
138
+ configured = globalConfig(loaded.data).telemetry;
139
+ }
140
+ }
141
+ catch {
142
+ // A malformed config must never block a failure exit — keep the default.
143
+ }
144
+ return resolveTelemetryMode({
145
+ // consola.prompt reads stdin and writes stdout, so require BOTH to be a TTY —
146
+ // otherwise a redirected stream could let a prompt appear (or block) wrongly.
147
+ configured,
148
+ isTTY: Boolean(process.stdout.isTTY) && Boolean(process.stdin.isTTY),
149
+ ci: Boolean(process.env.CI),
150
+ });
151
+ }
152
+ // --- Reporting -------------------------------------------------------------
153
+ function reportServer() {
154
+ return process.env.MCPMAKE_SERVER || DEFAULT_PRICING_SERVER;
155
+ }
156
+ /** Multi-line preview of exactly what will be sent (already redacted). */
157
+ function previewReport(payload) {
158
+ logger.info('');
159
+ logger.info('Opt-in error report (redacted) — exactly what would be sent:');
160
+ logger.info(` command: ${payload.command || '(none)'}`);
161
+ logger.info(` errorMessage: ${payload.errorMessage}`);
162
+ if (payload.stack) {
163
+ logger.info(` stack: ${payload.stack.split('\n')[0]} ...`);
164
+ }
165
+ logger.info(` cliVersion: ${payload.cliVersion}`);
166
+ logger.info(` platform: ${payload.platform}`);
167
+ logger.info(` nodeVersion: ${payload.nodeVersion}`);
168
+ logger.info('Not sent: no file contents, no environment variables, no secrets.');
169
+ logger.info('');
170
+ }
171
+ /**
172
+ * POST the report. Mirrors the AbortController + timeout + swallow-everything
173
+ * pattern in `fetchPricing`: this must never throw or block the CLI. The server
174
+ * rejects `Content-Encoding`, so we send a plain JSON body.
175
+ */
176
+ async function sendReport(payload) {
177
+ const controller = new AbortController();
178
+ const timer = setTimeout(() => controller.abort(), REPORT_TIMEOUT_MS);
179
+ try {
180
+ const base = reportServer().replace(/\/+$/, '');
181
+ await fetch(`${base}/api/telemetry/report`, {
182
+ method: 'POST',
183
+ headers: { 'Content-Type': 'application/json' },
184
+ body: JSON.stringify(payload),
185
+ signal: controller.signal,
186
+ });
187
+ }
188
+ catch {
189
+ // Reporting is best-effort; a failure here must never affect the CLI.
190
+ }
191
+ finally {
192
+ clearTimeout(timer);
193
+ }
194
+ }
195
+ /**
196
+ * Log a user-facing failure message, optionally report it (consent permitting),
197
+ * then exit with code 1. Never throws; always exits.
198
+ */
199
+ export async function fail(message, error) {
200
+ logger.error(message);
201
+ const consent = resolveConsent();
202
+ if (consent !== 'off') {
203
+ const payload = buildPayload(message, error);
204
+ try {
205
+ if (consent === 'prompt') {
206
+ previewReport(payload);
207
+ const ok = await consola.prompt('Send this report?', { type: 'confirm' });
208
+ if (ok === true) {
209
+ await sendReport(payload);
210
+ }
211
+ }
212
+ else {
213
+ // auto: send silently.
214
+ await sendReport(payload);
215
+ }
216
+ }
217
+ catch {
218
+ // Prompting/reporting must never get in the way of the exit.
219
+ }
220
+ }
221
+ process.exit(1);
222
+ }
223
+ //# sourceMappingURL=fail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fail.js","sourceRoot":"","sources":["../../src/utils/fail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function ensureDir(dir: string): Promise<void>;
2
+ export declare function writeFileSafe(filePath: string, content: string, options: {
3
+ force: boolean;
4
+ }): Promise<boolean>;
5
+ export declare function pathExists(filePath: string): Promise<boolean>;
6
+ //# sourceMappingURL=fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"AAGA,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1D;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,GAC1B,OAAO,CAAC,OAAO,CAAC,CAYlB;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE"}
@@ -0,0 +1,29 @@
1
+ import { mkdir, writeFile, access } from 'node:fs/promises';
2
+ import { dirname } from 'node:path';
3
+ export async function ensureDir(dir) {
4
+ await mkdir(dir, { recursive: true });
5
+ }
6
+ export async function writeFileSafe(filePath, content, options) {
7
+ if (!options.force) {
8
+ try {
9
+ await access(filePath);
10
+ return false; // file exists, skip
11
+ }
12
+ catch {
13
+ // file doesn't exist, proceed
14
+ }
15
+ }
16
+ await ensureDir(dirname(filePath));
17
+ await writeFile(filePath, content, 'utf-8');
18
+ return true;
19
+ }
20
+ export async function pathExists(filePath) {
21
+ try {
22
+ await access(filePath);
23
+ return true;
24
+ }
25
+ catch {
26
+ return false;
27
+ }
28
+ }
29
+ //# sourceMappingURL=fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW;IACzC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAAgB,EAChB,OAAe,EACf,OAA2B;IAE3B,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;YACvB,OAAO,KAAK,CAAC,CAAC,oBAAoB;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,8BAA8B;QAChC,CAAC;IACH,CAAC;IACD,MAAM,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnC,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { OperationDescriptor } from '../types/index.js';
2
+ /**
3
+ * Show detected operations and let user confirm, skip, or rename before generation.
4
+ * Returns the filtered/modified list of operations to proceed with.
5
+ */
6
+ export declare function confirmOperations(operations: OperationDescriptor[]): Promise<OperationDescriptor[]>;
7
+ //# sourceMappingURL=interactive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../src/utils/interactive.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAG7D;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,mBAAmB,EAAE,GAChC,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAoChC"}
@@ -0,0 +1,31 @@
1
+ import { createInterface } from 'node:readline';
2
+ import { logger } from './logger.js';
3
+ /**
4
+ * Show detected operations and let user confirm, skip, or rename before generation.
5
+ * Returns the filtered/modified list of operations to proceed with.
6
+ */
7
+ export async function confirmOperations(operations) {
8
+ const rl = createInterface({ input: process.stdin, output: process.stderr });
9
+ const ask = (question) => new Promise((resolve) => rl.question(question, resolve));
10
+ logger.info('');
11
+ logger.info(`Detected ${operations.length} operations:`);
12
+ logger.info('');
13
+ for (let i = 0; i < operations.length; i++) {
14
+ const op = operations[i];
15
+ logger.info(` ${i + 1}. [${op.method.toUpperCase()}] ${op.path} → ${op.operationId}` +
16
+ (op.summary ? ` — ${op.summary}` : ''));
17
+ }
18
+ logger.info('');
19
+ const answer = await ask('Enter numbers to exclude (comma-separated), or press Enter to keep all: ');
20
+ rl.close();
21
+ if (!answer.trim())
22
+ return operations;
23
+ const excludeIndices = new Set(answer
24
+ .split(',')
25
+ .map((s) => parseInt(s.trim(), 10) - 1)
26
+ .filter((n) => !isNaN(n) && n >= 0 && n < operations.length));
27
+ const result = operations.filter((_, i) => !excludeIndices.has(i));
28
+ logger.info(`Proceeding with ${result.length} operations (excluded ${excludeIndices.size})`);
29
+ return result;
30
+ }
31
+ //# sourceMappingURL=interactive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive.js","sourceRoot":"","sources":["../../src/utils/interactive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,UAAiC;IAEjC,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAE7E,MAAM,GAAG,GAAG,CAAC,QAAgB,EAAmB,EAAE,CAChD,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAE3D,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,MAAM,CAAC,IAAI,CAAC,YAAY,UAAU,CAAC,MAAM,cAAc,CAAC,CAAC;IACzD,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEhB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,CAAC,IAAI,CACT,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,WAAW,EAAE;YACvE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CACzC,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,MAAM,MAAM,GAAG,MAAM,GAAG,CACtB,0EAA0E,CAC3E,CAAC;IACF,EAAE,CAAC,KAAK,EAAE,CAAC;IAEX,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,UAAU,CAAC;IAEtC,MAAM,cAAc,GAAG,IAAI,GAAG,CAC5B,MAAM;SACH,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;SACtC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAC/D,CAAC;IAEF,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,MAAM,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,MAAM,yBAAyB,cAAc,CAAC,IAAI,GAAG,CAAC,CAAC;IAC7F,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const logger: import("consola").ConsolaInstance;
2
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM,mCAA6B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { consola } from 'consola';
2
+ export const logger = consola.withTag('mcpmake');
3
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Sanitize a string for safe embedding in a JavaScript/TypeScript single-quoted string literal.
3
+ * Escapes backslashes, single quotes, and newlines.
4
+ */
5
+ export declare function escapeStringLiteral(str: string): string;
6
+ /**
7
+ * Sanitize a string for safe embedding in a JavaScript/TypeScript template literal.
8
+ * Escapes backticks, ${} expressions, and backslashes.
9
+ */
10
+ export declare function escapeTemplateLiteral(str: string): string;
11
+ /**
12
+ * Validate that an identifier (operationId, param name) contains only safe characters.
13
+ * Strips anything that isn't alphanumeric, underscore, or hyphen.
14
+ */
15
+ export declare function sanitizeIdentifier(str: string): string;
16
+ /**
17
+ * Validate that a URL path template contains only safe characters.
18
+ * Allows: alphanumeric, /, {, }, -, _, .
19
+ */
20
+ export declare function sanitizePathTemplate(str: string): string;
21
+ /**
22
+ * Sanitize a file name — strip path separators and traversal sequences.
23
+ */
24
+ export declare function sanitizeFileName(str: string): string;
25
+ /**
26
+ * Check if a key is a dangerous prototype pollution key.
27
+ */
28
+ export declare function isDangerousKey(key: string): boolean;
29
+ //# sourceMappingURL=sanitize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/utils/sanitize.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKpD;AAID;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEnD"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Sanitize a string for safe embedding in a JavaScript/TypeScript single-quoted string literal.
3
+ * Escapes backslashes, single quotes, and newlines.
4
+ */
5
+ export function escapeStringLiteral(str) {
6
+ return str.replace(/\\/g, '\\\\').replace(/'/g, "\\'").replace(/\n/g, '\\n').replace(/\r/g, '');
7
+ }
8
+ /**
9
+ * Sanitize a string for safe embedding in a JavaScript/TypeScript template literal.
10
+ * Escapes backticks, ${} expressions, and backslashes.
11
+ */
12
+ export function escapeTemplateLiteral(str) {
13
+ return str.replace(/\\/g, '\\\\').replace(/`/g, '\\`').replace(/\$\{/g, '\\${');
14
+ }
15
+ /**
16
+ * Validate that an identifier (operationId, param name) contains only safe characters.
17
+ * Strips anything that isn't alphanumeric, underscore, or hyphen.
18
+ */
19
+ export function sanitizeIdentifier(str) {
20
+ return str.replace(/[^a-zA-Z0-9_\-]/g, '');
21
+ }
22
+ /**
23
+ * Validate that a URL path template contains only safe characters.
24
+ * Allows: alphanumeric, /, {, }, -, _, .
25
+ */
26
+ export function sanitizePathTemplate(str) {
27
+ return str.replace(/[^a-zA-Z0-9/{}._\-]/g, '');
28
+ }
29
+ /**
30
+ * Sanitize a file name — strip path separators and traversal sequences.
31
+ */
32
+ export function sanitizeFileName(str) {
33
+ return str
34
+ .replace(/\.\./g, '')
35
+ .replace(/[/\\]/g, '')
36
+ .replace(/[^a-zA-Z0-9._\-]/g, '');
37
+ }
38
+ const DANGEROUS_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
39
+ /**
40
+ * Check if a key is a dangerous prototype pollution key.
41
+ */
42
+ export function isDangerousKey(key) {
43
+ return DANGEROUS_KEYS.has(key);
44
+ }
45
+ //# sourceMappingURL=sanitize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../../src/utils/sanitize.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAClG,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAC/C,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAClF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,OAAO,GAAG,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,OAAO,GAAG,CAAC,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,OAAO,GAAG;SACP,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;SACpB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC;AAE1E;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,OAAO,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { type FSWatcher } from 'node:fs';
2
+ export interface WatchOptions {
3
+ filePath: string;
4
+ onChange: () => Promise<void>;
5
+ debounceMs?: number;
6
+ }
7
+ /**
8
+ * Watch a file for changes and invoke a callback.
9
+ * Debounces rapid successive changes (e.g., editor save + format).
10
+ */
11
+ export declare function watchFile(options: WatchOptions): FSWatcher;
12
+ //# sourceMappingURL=watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/utils/watcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,SAAS,EAAE,MAAM,SAAS,CAAC;AAGhD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,SAAS,CA4B1D"}
@@ -0,0 +1,37 @@
1
+ import { watch } from 'node:fs';
2
+ import { logger } from './logger.js';
3
+ /**
4
+ * Watch a file for changes and invoke a callback.
5
+ * Debounces rapid successive changes (e.g., editor save + format).
6
+ */
7
+ export function watchFile(options) {
8
+ const debounceMs = options.debounceMs ?? 500;
9
+ let timer;
10
+ let running = false;
11
+ const watcher = watch(options.filePath, (eventType) => {
12
+ if (eventType !== 'change')
13
+ return;
14
+ if (running)
15
+ return;
16
+ if (timer)
17
+ clearTimeout(timer);
18
+ timer = setTimeout(async () => {
19
+ running = true;
20
+ logger.info('Spec file changed, regenerating...');
21
+ try {
22
+ await options.onChange();
23
+ logger.success('Regeneration complete');
24
+ }
25
+ catch (err) {
26
+ logger.error(`Regeneration failed: ${err instanceof Error ? err.message : err}`);
27
+ }
28
+ finally {
29
+ running = false;
30
+ }
31
+ }, debounceMs);
32
+ });
33
+ logger.info(`Watching for changes: ${options.filePath}`);
34
+ logger.info('Press Ctrl+C to stop');
35
+ return watcher;
36
+ }
37
+ //# sourceMappingURL=watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/utils/watcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAkB,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAQrC;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,OAAqB;IAC7C,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,GAAG,CAAC;IAC7C,IAAI,KAAgD,CAAC;IACrD,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE;QACpD,IAAI,SAAS,KAAK,QAAQ;YAAE,OAAO;QACnC,IAAI,OAAO;YAAE,OAAO;QAEpB,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QAC/B,KAAK,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;YAC5B,OAAO,GAAG,IAAI,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;YAClD,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACzB,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;YAC1C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CAAC,wBAAwB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YACnF,CAAC;oBAAS,CAAC;gBACT,OAAO,GAAG,KAAK,CAAC;YAClB,CAAC;QACH,CAAC,EAAE,UAAU,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,yBAAyB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACzD,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAEpC,OAAO,OAAO,CAAC;AACjB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@mcpmake/core",
3
+ "version": "0.2.0",
4
+ "description": "Shared generation library for mcpmake — parse APIs (OpenAPI/HAR/Postman/websites) and emit MCP servers.",
5
+ "type": "module",
6
+ "license": "Apache-2.0",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/starkyru/mcpmake-cli.git",
10
+ "directory": "packages/core"
11
+ },
12
+ "homepage": "https://mcpmake.dev",
13
+ "exports": {
14
+ ".": {
15
+ "types": "./dist/index.d.ts",
16
+ "import": "./dist/index.js"
17
+ }
18
+ },
19
+ "files": [
20
+ "dist"
21
+ ],
22
+ "publishConfig": {
23
+ "access": "public"
24
+ },
25
+ "scripts": {
26
+ "build": "bash scripts/build.sh",
27
+ "typecheck": "tsc --noEmit",
28
+ "test": "vitest run"
29
+ },
30
+ "dependencies": {
31
+ "@anthropic-ai/sdk": "^0.90.0",
32
+ "@apidevtools/swagger-parser": "^12.1.0",
33
+ "citty": "^0.1.6",
34
+ "consola": "^3.4.2",
35
+ "handlebars": "^4.7.8",
36
+ "json-schema-to-zod": "^2.4.1",
37
+ "marked": "^12.0.2",
38
+ "openapi-types": "^12.1.3",
39
+ "playwright": "^1.59.1",
40
+ "yaml": "^2.7.0"
41
+ },
42
+ "engines": {
43
+ "node": ">=20.0.0"
44
+ }
45
+ }