mcp-client-gen 0.0.1 โ†’ 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +42 -15
  2. package/dist/index.js +917 -18
  3. package/package.json +13 -5
package/README.md CHANGED
@@ -8,17 +8,17 @@ import { notion, github, slack } from "./lib/mcp-client";
8
8
  // Type-safe client calls with full IntelliSense
9
9
  const page = await notion.createPage({
10
10
  title: "Meeting Notes",
11
- content: "Discussion about Q4 roadmap..."
11
+ content: "Discussion about Q4 roadmap...",
12
12
  });
13
13
 
14
14
  const issue = await github.createIssue({
15
15
  title: "Bug: Login failure",
16
- body: "Users cannot authenticate..."
16
+ body: "Users cannot authenticate...",
17
17
  });
18
18
 
19
19
  await slack.notify({
20
20
  channel: "#dev",
21
- message: `New issue created: ${issue.url}`
21
+ message: `New issue created: ${issue.url}`,
22
22
  });
23
23
  ```
24
24
 
@@ -28,7 +28,8 @@ await slack.notify({
28
28
  ๐Ÿ”„ **Multi-Provider** - Connect to multiple MCP servers simultaneously
29
29
  ๐ŸŽฏ **Tree-Shakable** - Only bundle the methods you use
30
30
  โšก **Fast** - Built with Bun for optimal performance
31
- ๐Ÿ› ๏ธ **CLI-First** - Simple command-line interface
31
+ ๐Ÿ› ๏ธ **Interactive CLI** - Smart prompts with sensible defaults
32
+ โš™๏ธ **Flexible** - Works with multiple MCP config formats
32
33
 
33
34
  ## Installation
34
35
 
@@ -49,18 +50,27 @@ Create a `.mcp.json` file with your MCP server endpoints:
49
50
  "mcpServers": {
50
51
  "notion": {
51
52
  "type": "http",
52
- "url": "https://mcp.notion.com/mcp"
53
+ "url": "https://mcp.notion.com/mcp",
53
54
  },
54
55
  "github": {
55
- "type": "http",
56
- "url": "https://api.githubcopilot.com/mcp/"
57
- }
58
- }
56
+ "type": "http",
57
+ "url": "https://api.githubcopilot.com/mcp/",
58
+ },
59
+ },
59
60
  }
60
61
  ```
61
62
 
62
63
  ### 2. Generate Client SDK
63
64
 
65
+ **Interactive Mode (Recommended):**
66
+
67
+ ```bash
68
+ npx mcp-client-gen # Launch interactive prompts
69
+ npx mcp-client-gen -y # Accept all defaults and proceed
70
+ ```
71
+
72
+ **Direct Mode:**
73
+
64
74
  ```bash
65
75
  npx mcp-client-gen ./lib/mcp-client.ts
66
76
  ```
@@ -74,11 +84,21 @@ import { notion } from "./lib/mcp-client";
74
84
  const page = await notion.fetchPage("page-id");
75
85
  const newPage = await notion.createPage({
76
86
  title: "My Page",
77
- content: "Page content..."
87
+ content: "Page content...",
78
88
  });
79
89
  ```
80
90
 
81
- ## CLI Options
91
+ ## CLI Reference
92
+
93
+ ### Interactive Mode
94
+
95
+ ```bash
96
+ npx mcp-client-gen # Launch interactive prompts
97
+ npx mcp-client-gen -y # Accept defaults and proceed
98
+ npx mcp-client-gen --yes # Same as -y
99
+ ```
100
+
101
+ ### Direct Mode
82
102
 
83
103
  ```bash
84
104
  npx mcp-client-gen [options] <output-file>
@@ -87,11 +107,14 @@ Arguments:
87
107
  output-file Path for the generated client file
88
108
 
89
109
  Options:
90
- --config <file> MCP configuration file (default: .mcp.json)
110
+ --config <file> MCP configuration file (default: auto-discover)
111
+ -y, --yes Accept all defaults and skip prompts
91
112
  --help Show help information
92
113
 
93
114
  Examples:
94
- npx mcp-client-gen ./lib/mcp.ts
115
+ npx mcp-client-gen # Interactive mode
116
+ npx mcp-client-gen -y # Quick generation with defaults
117
+ npx mcp-client-gen ./lib/mcp.ts # Direct mode with output file
95
118
  npx mcp-client-gen --config custom.json ./src/clients.ts
96
119
  ```
97
120
 
@@ -100,20 +123,24 @@ Examples:
100
123
  ๐Ÿ”— **API Integration** - Connect to multiple services with one SDK
101
124
  ๐Ÿค– **Workflow Automation** - Build cross-platform automation scripts
102
125
  ๐Ÿ“Š **Data Synchronization** - Keep data in sync across different platforms
103
- ๐Ÿงช **Rapid Prototyping** - Quickly test integrations with type safety
126
+ ๐Ÿงช **Rapid Prototyping** - Quickly test integrations with type safety
104
127
 
105
128
  ## Development Status
106
129
 
107
130
  > **Preview Release** - This is an early preview. The core CLI and configuration parsing works, but MCP server introspection is still in development.
108
131
 
109
132
  **Current Status:**
133
+
110
134
  - โœ… CLI interface and configuration parsing
111
- - โœ… Multi-server client generation structure
135
+ - โœ… Interactive prompts with smart defaults
136
+ - โœ… Multi-server client generation structure
137
+ - โœ… Multiple MCP config format support (.mcp.json, .cursor/, .vscode/)
112
138
  - ๐Ÿšง MCP server schema introspection (in progress)
113
139
  - ๐Ÿšง Real-time type generation from server capabilities
114
140
  - ๐Ÿ“‹ Plugin system for custom transformations
115
141
 
116
142
  **Coming Soon:**
143
+
117
144
  - Full MCP protocol implementation
118
145
  - Authentication handling
119
146
  - Streaming support
package/dist/index.js CHANGED
@@ -1,15 +1,856 @@
1
1
  #!/usr/bin/env node
2
+ var __create = Object.create;
3
+ var __getProtoOf = Object.getPrototypeOf;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __toESM = (mod, isNodeMode, target) => {
8
+ target = mod != null ? __create(__getProtoOf(mod)) : {};
9
+ const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
10
+ for (let key of __getOwnPropNames(mod))
11
+ if (!__hasOwnProp.call(to, key))
12
+ __defProp(to, key, {
13
+ get: () => mod[key],
14
+ enumerable: true
15
+ });
16
+ return to;
17
+ };
18
+ var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
19
+
20
+ // node_modules/sisteransi/src/index.js
21
+ var require_src = __commonJS((exports, module) => {
22
+ var ESC = "\x1B";
23
+ var CSI = `${ESC}[`;
24
+ var beep = "\x07";
25
+ var cursor = {
26
+ to(x, y) {
27
+ if (!y)
28
+ return `${CSI}${x + 1}G`;
29
+ return `${CSI}${y + 1};${x + 1}H`;
30
+ },
31
+ move(x, y) {
32
+ let ret = "";
33
+ if (x < 0)
34
+ ret += `${CSI}${-x}D`;
35
+ else if (x > 0)
36
+ ret += `${CSI}${x}C`;
37
+ if (y < 0)
38
+ ret += `${CSI}${-y}A`;
39
+ else if (y > 0)
40
+ ret += `${CSI}${y}B`;
41
+ return ret;
42
+ },
43
+ up: (count = 1) => `${CSI}${count}A`,
44
+ down: (count = 1) => `${CSI}${count}B`,
45
+ forward: (count = 1) => `${CSI}${count}C`,
46
+ backward: (count = 1) => `${CSI}${count}D`,
47
+ nextLine: (count = 1) => `${CSI}E`.repeat(count),
48
+ prevLine: (count = 1) => `${CSI}F`.repeat(count),
49
+ left: `${CSI}G`,
50
+ hide: `${CSI}?25l`,
51
+ show: `${CSI}?25h`,
52
+ save: `${ESC}7`,
53
+ restore: `${ESC}8`
54
+ };
55
+ var scroll = {
56
+ up: (count = 1) => `${CSI}S`.repeat(count),
57
+ down: (count = 1) => `${CSI}T`.repeat(count)
58
+ };
59
+ var erase = {
60
+ screen: `${CSI}2J`,
61
+ up: (count = 1) => `${CSI}1J`.repeat(count),
62
+ down: (count = 1) => `${CSI}J`.repeat(count),
63
+ line: `${CSI}2K`,
64
+ lineEnd: `${CSI}K`,
65
+ lineStart: `${CSI}1K`,
66
+ lines(count) {
67
+ let clear = "";
68
+ for (let i = 0;i < count; i++)
69
+ clear += this.line + (i < count - 1 ? cursor.up() : "");
70
+ if (count)
71
+ clear += cursor.left;
72
+ return clear;
73
+ }
74
+ };
75
+ module.exports = { cursor, scroll, erase, beep };
76
+ });
77
+
78
+ // node_modules/picocolors/picocolors.js
79
+ var require_picocolors = __commonJS((exports, module) => {
80
+ var p = process || {};
81
+ var argv = p.argv || [];
82
+ var env = p.env || {};
83
+ var isColorSupported = !(!!env.NO_COLOR || argv.includes("--no-color")) && (!!env.FORCE_COLOR || argv.includes("--color") || p.platform === "win32" || (p.stdout || {}).isTTY && env.TERM !== "dumb" || !!env.CI);
84
+ var formatter = (open, close, replace = open) => (input) => {
85
+ let string = "" + input, index = string.indexOf(close, open.length);
86
+ return ~index ? open + replaceClose(string, close, replace, index) + close : open + string + close;
87
+ };
88
+ var replaceClose = (string, close, replace, index) => {
89
+ let result = "", cursor = 0;
90
+ do {
91
+ result += string.substring(cursor, index) + replace;
92
+ cursor = index + close.length;
93
+ index = string.indexOf(close, cursor);
94
+ } while (~index);
95
+ return result + string.substring(cursor);
96
+ };
97
+ var createColors = (enabled = isColorSupported) => {
98
+ let f = enabled ? formatter : () => String;
99
+ return {
100
+ isColorSupported: enabled,
101
+ reset: f("\x1B[0m", "\x1B[0m"),
102
+ bold: f("\x1B[1m", "\x1B[22m", "\x1B[22m\x1B[1m"),
103
+ dim: f("\x1B[2m", "\x1B[22m", "\x1B[22m\x1B[2m"),
104
+ italic: f("\x1B[3m", "\x1B[23m"),
105
+ underline: f("\x1B[4m", "\x1B[24m"),
106
+ inverse: f("\x1B[7m", "\x1B[27m"),
107
+ hidden: f("\x1B[8m", "\x1B[28m"),
108
+ strikethrough: f("\x1B[9m", "\x1B[29m"),
109
+ black: f("\x1B[30m", "\x1B[39m"),
110
+ red: f("\x1B[31m", "\x1B[39m"),
111
+ green: f("\x1B[32m", "\x1B[39m"),
112
+ yellow: f("\x1B[33m", "\x1B[39m"),
113
+ blue: f("\x1B[34m", "\x1B[39m"),
114
+ magenta: f("\x1B[35m", "\x1B[39m"),
115
+ cyan: f("\x1B[36m", "\x1B[39m"),
116
+ white: f("\x1B[37m", "\x1B[39m"),
117
+ gray: f("\x1B[90m", "\x1B[39m"),
118
+ bgBlack: f("\x1B[40m", "\x1B[49m"),
119
+ bgRed: f("\x1B[41m", "\x1B[49m"),
120
+ bgGreen: f("\x1B[42m", "\x1B[49m"),
121
+ bgYellow: f("\x1B[43m", "\x1B[49m"),
122
+ bgBlue: f("\x1B[44m", "\x1B[49m"),
123
+ bgMagenta: f("\x1B[45m", "\x1B[49m"),
124
+ bgCyan: f("\x1B[46m", "\x1B[49m"),
125
+ bgWhite: f("\x1B[47m", "\x1B[49m"),
126
+ blackBright: f("\x1B[90m", "\x1B[39m"),
127
+ redBright: f("\x1B[91m", "\x1B[39m"),
128
+ greenBright: f("\x1B[92m", "\x1B[39m"),
129
+ yellowBright: f("\x1B[93m", "\x1B[39m"),
130
+ blueBright: f("\x1B[94m", "\x1B[39m"),
131
+ magentaBright: f("\x1B[95m", "\x1B[39m"),
132
+ cyanBright: f("\x1B[96m", "\x1B[39m"),
133
+ whiteBright: f("\x1B[97m", "\x1B[39m"),
134
+ bgBlackBright: f("\x1B[100m", "\x1B[49m"),
135
+ bgRedBright: f("\x1B[101m", "\x1B[49m"),
136
+ bgGreenBright: f("\x1B[102m", "\x1B[49m"),
137
+ bgYellowBright: f("\x1B[103m", "\x1B[49m"),
138
+ bgBlueBright: f("\x1B[104m", "\x1B[49m"),
139
+ bgMagentaBright: f("\x1B[105m", "\x1B[49m"),
140
+ bgCyanBright: f("\x1B[106m", "\x1B[49m"),
141
+ bgWhiteBright: f("\x1B[107m", "\x1B[49m")
142
+ };
143
+ };
144
+ module.exports = createColors();
145
+ module.exports.createColors = createColors;
146
+ });
2
147
 
3
148
  // index.ts
4
149
  import { parseArgs } from "node:util";
5
- import { readFileSync, existsSync } from "node:fs";
150
+ import { readFileSync as readFileSync2, existsSync as existsSync3 } from "node:fs";
151
+ import { resolve as resolve3 } from "node:path";
152
+
153
+ // node_modules/@clack/core/dist/index.mjs
154
+ var import_sisteransi = __toESM(require_src(), 1);
155
+ import { stdin as j, stdout as M } from "node:process";
156
+ var import_picocolors = __toESM(require_picocolors(), 1);
157
+ import O from "node:readline";
158
+ import { Writable as X } from "node:stream";
159
+ function DD({ onlyFirst: e = false } = {}) {
160
+ const t = ["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?(?:\\u0007|\\u001B\\u005C|\\u009C))", "(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))"].join("|");
161
+ return new RegExp(t, e ? undefined : "g");
162
+ }
163
+ var uD = DD();
164
+ function P(e) {
165
+ if (typeof e != "string")
166
+ throw new TypeError(`Expected a \`string\`, got \`${typeof e}\``);
167
+ return e.replace(uD, "");
168
+ }
169
+ function L(e) {
170
+ return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e;
171
+ }
172
+ var W = { exports: {} };
173
+ (function(e) {
174
+ var u = {};
175
+ e.exports = u, u.eastAsianWidth = function(F) {
176
+ var s = F.charCodeAt(0), i = F.length == 2 ? F.charCodeAt(1) : 0, D = s;
177
+ return 55296 <= s && s <= 56319 && 56320 <= i && i <= 57343 && (s &= 1023, i &= 1023, D = s << 10 | i, D += 65536), D == 12288 || 65281 <= D && D <= 65376 || 65504 <= D && D <= 65510 ? "F" : D == 8361 || 65377 <= D && D <= 65470 || 65474 <= D && D <= 65479 || 65482 <= D && D <= 65487 || 65490 <= D && D <= 65495 || 65498 <= D && D <= 65500 || 65512 <= D && D <= 65518 ? "H" : 4352 <= D && D <= 4447 || 4515 <= D && D <= 4519 || 4602 <= D && D <= 4607 || 9001 <= D && D <= 9002 || 11904 <= D && D <= 11929 || 11931 <= D && D <= 12019 || 12032 <= D && D <= 12245 || 12272 <= D && D <= 12283 || 12289 <= D && D <= 12350 || 12353 <= D && D <= 12438 || 12441 <= D && D <= 12543 || 12549 <= D && D <= 12589 || 12593 <= D && D <= 12686 || 12688 <= D && D <= 12730 || 12736 <= D && D <= 12771 || 12784 <= D && D <= 12830 || 12832 <= D && D <= 12871 || 12880 <= D && D <= 13054 || 13056 <= D && D <= 19903 || 19968 <= D && D <= 42124 || 42128 <= D && D <= 42182 || 43360 <= D && D <= 43388 || 44032 <= D && D <= 55203 || 55216 <= D && D <= 55238 || 55243 <= D && D <= 55291 || 63744 <= D && D <= 64255 || 65040 <= D && D <= 65049 || 65072 <= D && D <= 65106 || 65108 <= D && D <= 65126 || 65128 <= D && D <= 65131 || 110592 <= D && D <= 110593 || 127488 <= D && D <= 127490 || 127504 <= D && D <= 127546 || 127552 <= D && D <= 127560 || 127568 <= D && D <= 127569 || 131072 <= D && D <= 194367 || 177984 <= D && D <= 196605 || 196608 <= D && D <= 262141 ? "W" : 32 <= D && D <= 126 || 162 <= D && D <= 163 || 165 <= D && D <= 166 || D == 172 || D == 175 || 10214 <= D && D <= 10221 || 10629 <= D && D <= 10630 ? "Na" : D == 161 || D == 164 || 167 <= D && D <= 168 || D == 170 || 173 <= D && D <= 174 || 176 <= D && D <= 180 || 182 <= D && D <= 186 || 188 <= D && D <= 191 || D == 198 || D == 208 || 215 <= D && D <= 216 || 222 <= D && D <= 225 || D == 230 || 232 <= D && D <= 234 || 236 <= D && D <= 237 || D == 240 || 242 <= D && D <= 243 || 247 <= D && D <= 250 || D == 252 || D == 254 || D == 257 || D == 273 || D == 275 || D == 283 || 294 <= D && D <= 295 || D == 299 || 305 <= D && D <= 307 || D == 312 || 319 <= D && D <= 322 || D == 324 || 328 <= D && D <= 331 || D == 333 || 338 <= D && D <= 339 || 358 <= D && D <= 359 || D == 363 || D == 462 || D == 464 || D == 466 || D == 468 || D == 470 || D == 472 || D == 474 || D == 476 || D == 593 || D == 609 || D == 708 || D == 711 || 713 <= D && D <= 715 || D == 717 || D == 720 || 728 <= D && D <= 731 || D == 733 || D == 735 || 768 <= D && D <= 879 || 913 <= D && D <= 929 || 931 <= D && D <= 937 || 945 <= D && D <= 961 || 963 <= D && D <= 969 || D == 1025 || 1040 <= D && D <= 1103 || D == 1105 || D == 8208 || 8211 <= D && D <= 8214 || 8216 <= D && D <= 8217 || 8220 <= D && D <= 8221 || 8224 <= D && D <= 8226 || 8228 <= D && D <= 8231 || D == 8240 || 8242 <= D && D <= 8243 || D == 8245 || D == 8251 || D == 8254 || D == 8308 || D == 8319 || 8321 <= D && D <= 8324 || D == 8364 || D == 8451 || D == 8453 || D == 8457 || D == 8467 || D == 8470 || 8481 <= D && D <= 8482 || D == 8486 || D == 8491 || 8531 <= D && D <= 8532 || 8539 <= D && D <= 8542 || 8544 <= D && D <= 8555 || 8560 <= D && D <= 8569 || D == 8585 || 8592 <= D && D <= 8601 || 8632 <= D && D <= 8633 || D == 8658 || D == 8660 || D == 8679 || D == 8704 || 8706 <= D && D <= 8707 || 8711 <= D && D <= 8712 || D == 8715 || D == 8719 || D == 8721 || D == 8725 || D == 8730 || 8733 <= D && D <= 8736 || D == 8739 || D == 8741 || 8743 <= D && D <= 8748 || D == 8750 || 8756 <= D && D <= 8759 || 8764 <= D && D <= 8765 || D == 8776 || D == 8780 || D == 8786 || 8800 <= D && D <= 8801 || 8804 <= D && D <= 8807 || 8810 <= D && D <= 8811 || 8814 <= D && D <= 8815 || 8834 <= D && D <= 8835 || 8838 <= D && D <= 8839 || D == 8853 || D == 8857 || D == 8869 || D == 8895 || D == 8978 || 9312 <= D && D <= 9449 || 9451 <= D && D <= 9547 || 9552 <= D && D <= 9587 || 9600 <= D && D <= 9615 || 9618 <= D && D <= 9621 || 9632 <= D && D <= 9633 || 9635 <= D && D <= 9641 || 9650 <= D && D <= 9651 || 9654 <= D && D <= 9655 || 9660 <= D && D <= 9661 || 9664 <= D && D <= 9665 || 9670 <= D && D <= 9672 || D == 9675 || 9678 <= D && D <= 9681 || 9698 <= D && D <= 9701 || D == 9711 || 9733 <= D && D <= 9734 || D == 9737 || 9742 <= D && D <= 9743 || 9748 <= D && D <= 9749 || D == 9756 || D == 9758 || D == 9792 || D == 9794 || 9824 <= D && D <= 9825 || 9827 <= D && D <= 9829 || 9831 <= D && D <= 9834 || 9836 <= D && D <= 9837 || D == 9839 || 9886 <= D && D <= 9887 || 9918 <= D && D <= 9919 || 9924 <= D && D <= 9933 || 9935 <= D && D <= 9953 || D == 9955 || 9960 <= D && D <= 9983 || D == 10045 || D == 10071 || 10102 <= D && D <= 10111 || 11093 <= D && D <= 11097 || 12872 <= D && D <= 12879 || 57344 <= D && D <= 63743 || 65024 <= D && D <= 65039 || D == 65533 || 127232 <= D && D <= 127242 || 127248 <= D && D <= 127277 || 127280 <= D && D <= 127337 || 127344 <= D && D <= 127386 || 917760 <= D && D <= 917999 || 983040 <= D && D <= 1048573 || 1048576 <= D && D <= 1114109 ? "A" : "N";
178
+ }, u.characterLength = function(F) {
179
+ var s = this.eastAsianWidth(F);
180
+ return s == "F" || s == "W" || s == "A" ? 2 : 1;
181
+ };
182
+ function t(F) {
183
+ return F.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[^\uD800-\uDFFF]/g) || [];
184
+ }
185
+ u.length = function(F) {
186
+ for (var s = t(F), i = 0, D = 0;D < s.length; D++)
187
+ i = i + this.characterLength(s[D]);
188
+ return i;
189
+ }, u.slice = function(F, s, i) {
190
+ textLen = u.length(F), s = s || 0, i = i || 1, s < 0 && (s = textLen + s), i < 0 && (i = textLen + i);
191
+ for (var D = "", C = 0, n = t(F), E = 0;E < n.length; E++) {
192
+ var a = n[E], o = u.length(a);
193
+ if (C >= s - (o == 2 ? 1 : 0))
194
+ if (C + o <= i)
195
+ D += a;
196
+ else
197
+ break;
198
+ C += o;
199
+ }
200
+ return D;
201
+ };
202
+ })(W);
203
+ var tD = W.exports;
204
+ var eD = L(tD);
205
+ var FD = function() {
206
+ return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67)\uDB40\uDC7F|(?:\uD83E\uDDD1\uD83C\uDFFF\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFC-\uDFFF])|\uD83D\uDC68(?:\uD83C\uDFFB(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|[\u2695\u2696\u2708]\uFE0F|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))?|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])\uFE0F|\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC)?|(?:\uD83D\uDC69(?:\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69]))|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC69(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83E\uDDD1(?:\u200D(?:\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDE36\u200D\uD83C\uDF2B|\uD83C\uDFF3\uFE0F\u200D\u26A7|\uD83D\uDC3B\u200D\u2744|(?:(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\uD83C\uDFF4\u200D\u2620|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])\u200D[\u2640\u2642]|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u3030\u303D\u3297\u3299]|\uD83C[\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]|\uD83D[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3])\uFE0F|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDE35\u200D\uD83D\uDCAB|\uD83D\uDE2E\u200D\uD83D\uDCA8|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83E\uDDD1(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83D\uDC69(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF4\uD83C\uDDF2|\uD83D\uDC08\u200D\u2B1B|\u2764\uFE0F\u200D(?:\uD83D\uDD25|\uD83E\uDE79)|\uD83D\uDC41\uFE0F|\uD83C\uDFF3\uFE0F|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|[#\*0-9]\uFE0F\u20E3|\u2764\uFE0F|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF4|(?:[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270C\u270D]|\uD83D[\uDD74\uDD90])(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC08\uDC15\uDC3B\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE2E\uDE35\uDE36\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5]|\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD]|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0D\uDD0E\uDD10-\uDD17\uDD1D\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78\uDD7A-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCB\uDDD0\uDDE0-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6]|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26A7\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5-\uDED7\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDD77\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g;
207
+ };
208
+ var sD = L(FD);
209
+ function p(e, u = {}) {
210
+ if (typeof e != "string" || e.length === 0 || (u = { ambiguousIsNarrow: true, ...u }, e = P(e), e.length === 0))
211
+ return 0;
212
+ e = e.replace(sD(), " ");
213
+ const t = u.ambiguousIsNarrow ? 1 : 2;
214
+ let F = 0;
215
+ for (const s of e) {
216
+ const i = s.codePointAt(0);
217
+ if (i <= 31 || i >= 127 && i <= 159 || i >= 768 && i <= 879)
218
+ continue;
219
+ switch (eD.eastAsianWidth(s)) {
220
+ case "F":
221
+ case "W":
222
+ F += 2;
223
+ break;
224
+ case "A":
225
+ F += t;
226
+ break;
227
+ default:
228
+ F += 1;
229
+ }
230
+ }
231
+ return F;
232
+ }
233
+ var w = 10;
234
+ var N = (e = 0) => (u) => `\x1B[${u + e}m`;
235
+ var I = (e = 0) => (u) => `\x1B[${38 + e};5;${u}m`;
236
+ var R = (e = 0) => (u, t, F) => `\x1B[${38 + e};2;${u};${t};${F}m`;
237
+ var r = { modifier: { reset: [0, 0], bold: [1, 22], dim: [2, 22], italic: [3, 23], underline: [4, 24], overline: [53, 55], inverse: [7, 27], hidden: [8, 28], strikethrough: [9, 29] }, color: { black: [30, 39], red: [31, 39], green: [32, 39], yellow: [33, 39], blue: [34, 39], magenta: [35, 39], cyan: [36, 39], white: [37, 39], blackBright: [90, 39], gray: [90, 39], grey: [90, 39], redBright: [91, 39], greenBright: [92, 39], yellowBright: [93, 39], blueBright: [94, 39], magentaBright: [95, 39], cyanBright: [96, 39], whiteBright: [97, 39] }, bgColor: { bgBlack: [40, 49], bgRed: [41, 49], bgGreen: [42, 49], bgYellow: [43, 49], bgBlue: [44, 49], bgMagenta: [45, 49], bgCyan: [46, 49], bgWhite: [47, 49], bgBlackBright: [100, 49], bgGray: [100, 49], bgGrey: [100, 49], bgRedBright: [101, 49], bgGreenBright: [102, 49], bgYellowBright: [103, 49], bgBlueBright: [104, 49], bgMagentaBright: [105, 49], bgCyanBright: [106, 49], bgWhiteBright: [107, 49] } };
238
+ Object.keys(r.modifier);
239
+ var iD = Object.keys(r.color);
240
+ var CD = Object.keys(r.bgColor);
241
+ [...iD];
242
+ function rD() {
243
+ const e = new Map;
244
+ for (const [u, t] of Object.entries(r)) {
245
+ for (const [F, s] of Object.entries(t))
246
+ r[F] = { open: `\x1B[${s[0]}m`, close: `\x1B[${s[1]}m` }, t[F] = r[F], e.set(s[0], s[1]);
247
+ Object.defineProperty(r, u, { value: t, enumerable: false });
248
+ }
249
+ return Object.defineProperty(r, "codes", { value: e, enumerable: false }), r.color.close = "\x1B[39m", r.bgColor.close = "\x1B[49m", r.color.ansi = N(), r.color.ansi256 = I(), r.color.ansi16m = R(), r.bgColor.ansi = N(w), r.bgColor.ansi256 = I(w), r.bgColor.ansi16m = R(w), Object.defineProperties(r, { rgbToAnsi256: { value: (u, t, F) => u === t && t === F ? u < 8 ? 16 : u > 248 ? 231 : Math.round((u - 8) / 247 * 24) + 232 : 16 + 36 * Math.round(u / 255 * 5) + 6 * Math.round(t / 255 * 5) + Math.round(F / 255 * 5), enumerable: false }, hexToRgb: { value: (u) => {
250
+ const t = /[a-f\d]{6}|[a-f\d]{3}/i.exec(u.toString(16));
251
+ if (!t)
252
+ return [0, 0, 0];
253
+ let [F] = t;
254
+ F.length === 3 && (F = [...F].map((i) => i + i).join(""));
255
+ const s = Number.parseInt(F, 16);
256
+ return [s >> 16 & 255, s >> 8 & 255, s & 255];
257
+ }, enumerable: false }, hexToAnsi256: { value: (u) => r.rgbToAnsi256(...r.hexToRgb(u)), enumerable: false }, ansi256ToAnsi: { value: (u) => {
258
+ if (u < 8)
259
+ return 30 + u;
260
+ if (u < 16)
261
+ return 90 + (u - 8);
262
+ let t, F, s;
263
+ if (u >= 232)
264
+ t = ((u - 232) * 10 + 8) / 255, F = t, s = t;
265
+ else {
266
+ u -= 16;
267
+ const C = u % 36;
268
+ t = Math.floor(u / 36) / 5, F = Math.floor(C / 6) / 5, s = C % 6 / 5;
269
+ }
270
+ const i = Math.max(t, F, s) * 2;
271
+ if (i === 0)
272
+ return 30;
273
+ let D = 30 + (Math.round(s) << 2 | Math.round(F) << 1 | Math.round(t));
274
+ return i === 2 && (D += 60), D;
275
+ }, enumerable: false }, rgbToAnsi: { value: (u, t, F) => r.ansi256ToAnsi(r.rgbToAnsi256(u, t, F)), enumerable: false }, hexToAnsi: { value: (u) => r.ansi256ToAnsi(r.hexToAnsi256(u)), enumerable: false } }), r;
276
+ }
277
+ var ED = rD();
278
+ var d = new Set(["\x1B", "ย›"]);
279
+ var oD = 39;
280
+ var y = "\x07";
281
+ var V = "[";
282
+ var nD = "]";
283
+ var G = "m";
284
+ var _ = `${nD}8;;`;
285
+ var z = (e) => `${d.values().next().value}${V}${e}${G}`;
286
+ var K = (e) => `${d.values().next().value}${_}${e}${y}`;
287
+ var aD = (e) => e.split(" ").map((u) => p(u));
288
+ var k = (e, u, t) => {
289
+ const F = [...u];
290
+ let s = false, i = false, D = p(P(e[e.length - 1]));
291
+ for (const [C, n] of F.entries()) {
292
+ const E = p(n);
293
+ if (D + E <= t ? e[e.length - 1] += n : (e.push(n), D = 0), d.has(n) && (s = true, i = F.slice(C + 1).join("").startsWith(_)), s) {
294
+ i ? n === y && (s = false, i = false) : n === G && (s = false);
295
+ continue;
296
+ }
297
+ D += E, D === t && C < F.length - 1 && (e.push(""), D = 0);
298
+ }
299
+ !D && e[e.length - 1].length > 0 && e.length > 1 && (e[e.length - 2] += e.pop());
300
+ };
301
+ var hD = (e) => {
302
+ const u = e.split(" ");
303
+ let t = u.length;
304
+ for (;t > 0 && !(p(u[t - 1]) > 0); )
305
+ t--;
306
+ return t === u.length ? e : u.slice(0, t).join(" ") + u.slice(t).join("");
307
+ };
308
+ var lD = (e, u, t = {}) => {
309
+ if (t.trim !== false && e.trim() === "")
310
+ return "";
311
+ let F = "", s, i;
312
+ const D = aD(e);
313
+ let C = [""];
314
+ for (const [E, a] of e.split(" ").entries()) {
315
+ t.trim !== false && (C[C.length - 1] = C[C.length - 1].trimStart());
316
+ let o = p(C[C.length - 1]);
317
+ if (E !== 0 && (o >= u && (t.wordWrap === false || t.trim === false) && (C.push(""), o = 0), (o > 0 || t.trim === false) && (C[C.length - 1] += " ", o++)), t.hard && D[E] > u) {
318
+ const c = u - o, f = 1 + Math.floor((D[E] - c - 1) / u);
319
+ Math.floor((D[E] - 1) / u) < f && C.push(""), k(C, a, u);
320
+ continue;
321
+ }
322
+ if (o + D[E] > u && o > 0 && D[E] > 0) {
323
+ if (t.wordWrap === false && o < u) {
324
+ k(C, a, u);
325
+ continue;
326
+ }
327
+ C.push("");
328
+ }
329
+ if (o + D[E] > u && t.wordWrap === false) {
330
+ k(C, a, u);
331
+ continue;
332
+ }
333
+ C[C.length - 1] += a;
334
+ }
335
+ t.trim !== false && (C = C.map((E) => hD(E)));
336
+ const n = [...C.join(`
337
+ `)];
338
+ for (const [E, a] of n.entries()) {
339
+ if (F += a, d.has(a)) {
340
+ const { groups: c } = new RegExp(`(?:\\${V}(?<code>\\d+)m|\\${_}(?<uri>.*)${y})`).exec(n.slice(E).join("")) || { groups: {} };
341
+ if (c.code !== undefined) {
342
+ const f = Number.parseFloat(c.code);
343
+ s = f === oD ? undefined : f;
344
+ } else
345
+ c.uri !== undefined && (i = c.uri.length === 0 ? undefined : c.uri);
346
+ }
347
+ const o = ED.codes.get(Number(s));
348
+ n[E + 1] === `
349
+ ` ? (i && (F += K("")), s && o && (F += z(o))) : a === `
350
+ ` && (s && o && (F += z(s)), i && (F += K(i)));
351
+ }
352
+ return F;
353
+ };
354
+ function Y(e, u, t) {
355
+ return String(e).normalize().replace(/\r\n/g, `
356
+ `).split(`
357
+ `).map((F) => lD(F, u, t)).join(`
358
+ `);
359
+ }
360
+ var xD = ["up", "down", "left", "right", "space", "enter", "cancel"];
361
+ var B = { actions: new Set(xD), aliases: new Map([["k", "up"], ["j", "down"], ["h", "left"], ["l", "right"], ["\x03", "cancel"], ["escape", "cancel"]]) };
362
+ function $(e, u) {
363
+ if (typeof e == "string")
364
+ return B.aliases.get(e) === u;
365
+ for (const t of e)
366
+ if (t !== undefined && $(t, u))
367
+ return true;
368
+ return false;
369
+ }
370
+ function BD(e, u) {
371
+ if (e === u)
372
+ return;
373
+ const t = e.split(`
374
+ `), F = u.split(`
375
+ `), s = [];
376
+ for (let i = 0;i < Math.max(t.length, F.length); i++)
377
+ t[i] !== F[i] && s.push(i);
378
+ return s;
379
+ }
380
+ var AD = globalThis.process.platform.startsWith("win");
381
+ var S = Symbol("clack:cancel");
382
+ function pD(e) {
383
+ return e === S;
384
+ }
385
+ function m(e, u) {
386
+ const t = e;
387
+ t.isTTY && t.setRawMode(u);
388
+ }
389
+ var gD = Object.defineProperty;
390
+ var vD = (e, u, t) => (u in e) ? gD(e, u, { enumerable: true, configurable: true, writable: true, value: t }) : e[u] = t;
391
+ var h = (e, u, t) => (vD(e, typeof u != "symbol" ? u + "" : u, t), t);
392
+
393
+ class x {
394
+ constructor(u, t = true) {
395
+ h(this, "input"), h(this, "output"), h(this, "_abortSignal"), h(this, "rl"), h(this, "opts"), h(this, "_render"), h(this, "_track", false), h(this, "_prevFrame", ""), h(this, "_subscribers", new Map), h(this, "_cursor", 0), h(this, "state", "initial"), h(this, "error", ""), h(this, "value");
396
+ const { input: F = j, output: s = M, render: i, signal: D, ...C } = u;
397
+ this.opts = C, this.onKeypress = this.onKeypress.bind(this), this.close = this.close.bind(this), this.render = this.render.bind(this), this._render = i.bind(this), this._track = t, this._abortSignal = D, this.input = F, this.output = s;
398
+ }
399
+ unsubscribe() {
400
+ this._subscribers.clear();
401
+ }
402
+ setSubscriber(u, t) {
403
+ const F = this._subscribers.get(u) ?? [];
404
+ F.push(t), this._subscribers.set(u, F);
405
+ }
406
+ on(u, t) {
407
+ this.setSubscriber(u, { cb: t });
408
+ }
409
+ once(u, t) {
410
+ this.setSubscriber(u, { cb: t, once: true });
411
+ }
412
+ emit(u, ...t) {
413
+ const F = this._subscribers.get(u) ?? [], s = [];
414
+ for (const i of F)
415
+ i.cb(...t), i.once && s.push(() => F.splice(F.indexOf(i), 1));
416
+ for (const i of s)
417
+ i();
418
+ }
419
+ prompt() {
420
+ return new Promise((u, t) => {
421
+ if (this._abortSignal) {
422
+ if (this._abortSignal.aborted)
423
+ return this.state = "cancel", this.close(), u(S);
424
+ this._abortSignal.addEventListener("abort", () => {
425
+ this.state = "cancel", this.close();
426
+ }, { once: true });
427
+ }
428
+ const F = new X;
429
+ F._write = (s, i, D) => {
430
+ this._track && (this.value = this.rl?.line.replace(/\t/g, ""), this._cursor = this.rl?.cursor ?? 0, this.emit("value", this.value)), D();
431
+ }, this.input.pipe(F), this.rl = O.createInterface({ input: this.input, output: F, tabSize: 2, prompt: "", escapeCodeTimeout: 50, terminal: true }), O.emitKeypressEvents(this.input, this.rl), this.rl.prompt(), this.opts.initialValue !== undefined && this._track && this.rl.write(this.opts.initialValue), this.input.on("keypress", this.onKeypress), m(this.input, true), this.output.on("resize", this.render), this.render(), this.once("submit", () => {
432
+ this.output.write(import_sisteransi.cursor.show), this.output.off("resize", this.render), m(this.input, false), u(this.value);
433
+ }), this.once("cancel", () => {
434
+ this.output.write(import_sisteransi.cursor.show), this.output.off("resize", this.render), m(this.input, false), u(S);
435
+ });
436
+ });
437
+ }
438
+ onKeypress(u, t) {
439
+ if (this.state === "error" && (this.state = "active"), t?.name && (!this._track && B.aliases.has(t.name) && this.emit("cursor", B.aliases.get(t.name)), B.actions.has(t.name) && this.emit("cursor", t.name)), u && (u.toLowerCase() === "y" || u.toLowerCase() === "n") && this.emit("confirm", u.toLowerCase() === "y"), u === "\t" && this.opts.placeholder && (this.value || (this.rl?.write(this.opts.placeholder), this.emit("value", this.opts.placeholder))), u && this.emit("key", u.toLowerCase()), t?.name === "return") {
440
+ if (this.opts.validate) {
441
+ const F = this.opts.validate(this.value);
442
+ F && (this.error = F instanceof Error ? F.message : F, this.state = "error", this.rl?.write(this.value));
443
+ }
444
+ this.state !== "error" && (this.state = "submit");
445
+ }
446
+ $([u, t?.name, t?.sequence], "cancel") && (this.state = "cancel"), (this.state === "submit" || this.state === "cancel") && this.emit("finalize"), this.render(), (this.state === "submit" || this.state === "cancel") && this.close();
447
+ }
448
+ close() {
449
+ this.input.unpipe(), this.input.removeListener("keypress", this.onKeypress), this.output.write(`
450
+ `), m(this.input, false), this.rl?.close(), this.rl = undefined, this.emit(`${this.state}`, this.value), this.unsubscribe();
451
+ }
452
+ restoreCursor() {
453
+ const u = Y(this._prevFrame, process.stdout.columns, { hard: true }).split(`
454
+ `).length - 1;
455
+ this.output.write(import_sisteransi.cursor.move(-999, u * -1));
456
+ }
457
+ render() {
458
+ const u = Y(this._render(this) ?? "", process.stdout.columns, { hard: true });
459
+ if (u !== this._prevFrame) {
460
+ if (this.state === "initial")
461
+ this.output.write(import_sisteransi.cursor.hide);
462
+ else {
463
+ const t = BD(this._prevFrame, u);
464
+ if (this.restoreCursor(), t && t?.length === 1) {
465
+ const F = t[0];
466
+ this.output.write(import_sisteransi.cursor.move(0, F)), this.output.write(import_sisteransi.erase.lines(1));
467
+ const s = u.split(`
468
+ `);
469
+ this.output.write(s[F]), this._prevFrame = u, this.output.write(import_sisteransi.cursor.move(0, s.length - F - 1));
470
+ return;
471
+ }
472
+ if (t && t?.length > 1) {
473
+ const F = t[0];
474
+ this.output.write(import_sisteransi.cursor.move(0, F)), this.output.write(import_sisteransi.erase.down());
475
+ const s = u.split(`
476
+ `).slice(F);
477
+ this.output.write(s.join(`
478
+ `)), this._prevFrame = u;
479
+ return;
480
+ }
481
+ this.output.write(import_sisteransi.erase.down());
482
+ }
483
+ this.output.write(u), this.state === "initial" && (this.state = "active"), this._prevFrame = u;
484
+ }
485
+ }
486
+ }
487
+ var A;
488
+ A = new WeakMap;
489
+ var kD = Object.defineProperty;
490
+ var $D = (e, u, t) => (u in e) ? kD(e, u, { enumerable: true, configurable: true, writable: true, value: t }) : e[u] = t;
491
+ var H = (e, u, t) => ($D(e, typeof u != "symbol" ? u + "" : u, t), t);
492
+ var SD = class extends x {
493
+ constructor(u) {
494
+ super(u, false), H(this, "options"), H(this, "cursor", 0), this.options = u.options, this.value = [...u.initialValues ?? []], this.cursor = Math.max(this.options.findIndex(({ value: t }) => t === u.cursorAt), 0), this.on("key", (t) => {
495
+ t === "a" && this.toggleAll();
496
+ }), this.on("cursor", (t) => {
497
+ switch (t) {
498
+ case "left":
499
+ case "up":
500
+ this.cursor = this.cursor === 0 ? this.options.length - 1 : this.cursor - 1;
501
+ break;
502
+ case "down":
503
+ case "right":
504
+ this.cursor = this.cursor === this.options.length - 1 ? 0 : this.cursor + 1;
505
+ break;
506
+ case "space":
507
+ this.toggleValue();
508
+ break;
509
+ }
510
+ });
511
+ }
512
+ get _value() {
513
+ return this.options[this.cursor].value;
514
+ }
515
+ toggleAll() {
516
+ const u = this.value.length === this.options.length;
517
+ this.value = u ? [] : this.options.map((t) => t.value);
518
+ }
519
+ toggleValue() {
520
+ const u = this.value.includes(this._value);
521
+ this.value = u ? this.value.filter((t) => t !== this._value) : [...this.value, this._value];
522
+ }
523
+ };
524
+ class RD extends x {
525
+ get valueWithCursor() {
526
+ if (this.state === "submit")
527
+ return this.value;
528
+ if (this.cursor >= this.value.length)
529
+ return `${this.value}โ–ˆ`;
530
+ const u = this.value.slice(0, this.cursor), [t, ...F] = this.value.slice(this.cursor);
531
+ return `${u}${import_picocolors.default.inverse(t)}${F.join("")}`;
532
+ }
533
+ get cursor() {
534
+ return this._cursor;
535
+ }
536
+ constructor(u) {
537
+ super(u), this.on("finalize", () => {
538
+ this.value || (this.value = u.defaultValue);
539
+ });
540
+ }
541
+ }
542
+
543
+ // node_modules/@clack/prompts/dist/index.mjs
544
+ var import_picocolors2 = __toESM(require_picocolors(), 1);
545
+ var import_sisteransi2 = __toESM(require_src(), 1);
546
+ import y2 from "node:process";
547
+ function ce() {
548
+ return y2.platform !== "win32" ? y2.env.TERM !== "linux" : !!y2.env.CI || !!y2.env.WT_SESSION || !!y2.env.TERMINUS_SUBLIME || y2.env.ConEmuTask === "{cmd::Cmder}" || y2.env.TERM_PROGRAM === "Terminus-Sublime" || y2.env.TERM_PROGRAM === "vscode" || y2.env.TERM === "xterm-256color" || y2.env.TERM === "alacritty" || y2.env.TERMINAL_EMULATOR === "JetBrains-JediTerm";
549
+ }
550
+ var V2 = ce();
551
+ var u = (t, n) => V2 ? t : n;
552
+ var le = u("โ—†", "*");
553
+ var L2 = u("โ– ", "x");
554
+ var W2 = u("โ–ฒ", "x");
555
+ var C = u("โ—‡", "o");
556
+ var ue = u("โ”Œ", "T");
557
+ var o = u("โ”‚", "|");
558
+ var d2 = u("โ””", "โ€”");
559
+ var k2 = u("โ—", ">");
560
+ var P2 = u("โ—‹", " ");
561
+ var A2 = u("โ—ป", "[โ€ข]");
562
+ var T = u("โ—ผ", "[+]");
563
+ var F = u("โ—ป", "[ ]");
564
+ var $e = u("โ–ช", "โ€ข");
565
+ var _2 = u("โ”€", "-");
566
+ var me = u("โ•ฎ", "+");
567
+ var de = u("โ”œ", "+");
568
+ var pe = u("โ•ฏ", "+");
569
+ var q = u("โ—", "โ€ข");
570
+ var D = u("โ—†", "*");
571
+ var U = u("โ–ฒ", "!");
572
+ var K2 = u("โ– ", "x");
573
+ var b2 = (t) => {
574
+ switch (t) {
575
+ case "initial":
576
+ case "active":
577
+ return import_picocolors2.default.cyan(le);
578
+ case "cancel":
579
+ return import_picocolors2.default.red(L2);
580
+ case "error":
581
+ return import_picocolors2.default.yellow(W2);
582
+ case "submit":
583
+ return import_picocolors2.default.green(C);
584
+ }
585
+ };
586
+ var G2 = (t) => {
587
+ const { cursor: n, options: r2, style: i } = t, s = t.maxItems ?? Number.POSITIVE_INFINITY, c = Math.max(process.stdout.rows - 4, 0), a = Math.min(c, Math.max(s, 5));
588
+ let l2 = 0;
589
+ n >= l2 + a - 3 ? l2 = Math.max(Math.min(n - a + 3, r2.length - a), 0) : n < l2 + 2 && (l2 = Math.max(n - 2, 0));
590
+ const $2 = a < r2.length && l2 > 0, g = a < r2.length && l2 + a < r2.length;
591
+ return r2.slice(l2, l2 + a).map((p2, v2, f) => {
592
+ const j2 = v2 === 0 && $2, E = v2 === f.length - 1 && g;
593
+ return j2 || E ? import_picocolors2.default.dim("...") : i(p2, v2 + l2 === n);
594
+ });
595
+ };
596
+ var he = (t) => new RD({ validate: t.validate, placeholder: t.placeholder, defaultValue: t.defaultValue, initialValue: t.initialValue, render() {
597
+ const n = `${import_picocolors2.default.gray(o)}
598
+ ${b2(this.state)} ${t.message}
599
+ `, r2 = t.placeholder ? import_picocolors2.default.inverse(t.placeholder[0]) + import_picocolors2.default.dim(t.placeholder.slice(1)) : import_picocolors2.default.inverse(import_picocolors2.default.hidden("_")), i = this.value ? this.valueWithCursor : r2;
600
+ switch (this.state) {
601
+ case "error":
602
+ return `${n.trim()}
603
+ ${import_picocolors2.default.yellow(o)} ${i}
604
+ ${import_picocolors2.default.yellow(d2)} ${import_picocolors2.default.yellow(this.error)}
605
+ `;
606
+ case "submit":
607
+ return `${n}${import_picocolors2.default.gray(o)} ${import_picocolors2.default.dim(this.value || t.placeholder)}`;
608
+ case "cancel":
609
+ return `${n}${import_picocolors2.default.gray(o)} ${import_picocolors2.default.strikethrough(import_picocolors2.default.dim(this.value ?? ""))}${this.value?.trim() ? `
610
+ ${import_picocolors2.default.gray(o)}` : ""}`;
611
+ default:
612
+ return `${n}${import_picocolors2.default.cyan(o)} ${i}
613
+ ${import_picocolors2.default.cyan(d2)}
614
+ `;
615
+ }
616
+ } }).prompt();
617
+ var fe = (t) => {
618
+ const n = (r2, i) => {
619
+ const s = r2.label ?? String(r2.value);
620
+ return i === "active" ? `${import_picocolors2.default.cyan(A2)} ${s} ${r2.hint ? import_picocolors2.default.dim(`(${r2.hint})`) : ""}` : i === "selected" ? `${import_picocolors2.default.green(T)} ${import_picocolors2.default.dim(s)} ${r2.hint ? import_picocolors2.default.dim(`(${r2.hint})`) : ""}` : i === "cancelled" ? `${import_picocolors2.default.strikethrough(import_picocolors2.default.dim(s))}` : i === "active-selected" ? `${import_picocolors2.default.green(T)} ${s} ${r2.hint ? import_picocolors2.default.dim(`(${r2.hint})`) : ""}` : i === "submitted" ? `${import_picocolors2.default.dim(s)}` : `${import_picocolors2.default.dim(F)} ${import_picocolors2.default.dim(s)}`;
621
+ };
622
+ return new SD({ options: t.options, initialValues: t.initialValues, required: t.required ?? true, cursorAt: t.cursorAt, validate(r2) {
623
+ if (this.required && r2.length === 0)
624
+ return `Please select at least one option.
625
+ ${import_picocolors2.default.reset(import_picocolors2.default.dim(`Press ${import_picocolors2.default.gray(import_picocolors2.default.bgWhite(import_picocolors2.default.inverse(" space ")))} to select, ${import_picocolors2.default.gray(import_picocolors2.default.bgWhite(import_picocolors2.default.inverse(" enter ")))} to submit`))}`;
626
+ }, render() {
627
+ const r2 = `${import_picocolors2.default.gray(o)}
628
+ ${b2(this.state)} ${t.message}
629
+ `, i = (s, c) => {
630
+ const a = this.value.includes(s.value);
631
+ return c && a ? n(s, "active-selected") : a ? n(s, "selected") : n(s, c ? "active" : "inactive");
632
+ };
633
+ switch (this.state) {
634
+ case "submit":
635
+ return `${r2}${import_picocolors2.default.gray(o)} ${this.options.filter(({ value: s }) => this.value.includes(s)).map((s) => n(s, "submitted")).join(import_picocolors2.default.dim(", ")) || import_picocolors2.default.dim("none")}`;
636
+ case "cancel": {
637
+ const s = this.options.filter(({ value: c }) => this.value.includes(c)).map((c) => n(c, "cancelled")).join(import_picocolors2.default.dim(", "));
638
+ return `${r2}${import_picocolors2.default.gray(o)} ${s.trim() ? `${s}
639
+ ${import_picocolors2.default.gray(o)}` : ""}`;
640
+ }
641
+ case "error": {
642
+ const s = this.error.split(`
643
+ `).map((c, a) => a === 0 ? `${import_picocolors2.default.yellow(d2)} ${import_picocolors2.default.yellow(c)}` : ` ${c}`).join(`
644
+ `);
645
+ return `${r2 + import_picocolors2.default.yellow(o)} ${G2({ options: this.options, cursor: this.cursor, maxItems: t.maxItems, style: i }).join(`
646
+ ${import_picocolors2.default.yellow(o)} `)}
647
+ ${s}
648
+ `;
649
+ }
650
+ default:
651
+ return `${r2}${import_picocolors2.default.cyan(o)} ${G2({ options: this.options, cursor: this.cursor, maxItems: t.maxItems, style: i }).join(`
652
+ ${import_picocolors2.default.cyan(o)} `)}
653
+ ${import_picocolors2.default.cyan(d2)}
654
+ `;
655
+ }
656
+ } }).prompt();
657
+ };
658
+ var xe = (t = "") => {
659
+ process.stdout.write(`${import_picocolors2.default.gray(d2)} ${import_picocolors2.default.red(t)}
660
+
661
+ `);
662
+ };
663
+ var Ie = (t = "") => {
664
+ process.stdout.write(`${import_picocolors2.default.gray(ue)} ${t}
665
+ `);
666
+ };
667
+ var Se = (t = "") => {
668
+ process.stdout.write(`${import_picocolors2.default.gray(o)}
669
+ ${import_picocolors2.default.gray(d2)} ${t}
670
+
671
+ `);
672
+ };
673
+ var J = `${import_picocolors2.default.gray(o)} `;
674
+
675
+ // lib/prompts.ts
676
+ import { existsSync as existsSync2 } from "node:fs";
677
+ import { resolve as resolve2 } from "node:path";
678
+
679
+ // lib/config.ts
680
+ import { existsSync, readFileSync } from "node:fs";
6
681
  import { resolve } from "node:path";
682
+ var MCP_CONFIG_PATHS = [
683
+ ".mcp.local.json",
684
+ ".mcp.json",
685
+ ".cursor/mcp.local.json",
686
+ ".cursor/mcp.json",
687
+ ".vscode/mcp.local.json",
688
+ ".vscode/mcp.json"
689
+ ];
690
+ async function findMcpConfigFiles(cwd = process.cwd()) {
691
+ const foundFiles = [];
692
+ for (const configPath of MCP_CONFIG_PATHS) {
693
+ const fullPath = resolve(cwd, configPath);
694
+ if (existsSync(fullPath)) {
695
+ foundFiles.push(fullPath);
696
+ }
697
+ }
698
+ return foundFiles;
699
+ }
700
+ function getMcpServers(paths) {
701
+ const servers = [];
702
+ const seenUrls = new Set;
703
+ for (const path of paths) {
704
+ try {
705
+ const content = readFileSync(path, "utf8");
706
+ const config = JSON.parse(content);
707
+ const isVSCodeFormat = !!config.servers;
708
+ const serverConfigs = config.mcpServers || config.servers;
709
+ if (serverConfigs && typeof serverConfigs === "object") {
710
+ for (const [, serverConfig] of Object.entries(serverConfigs)) {
711
+ if (typeof serverConfig === "object" && serverConfig !== null) {
712
+ const server = serverConfig;
713
+ const trimmedUrl = typeof server.url === "string" ? server.url.trim() : "";
714
+ if (trimmedUrl && !seenUrls.has(trimmedUrl)) {
715
+ let serverType = null;
716
+ if (server.type === "http" || server.type === "sse") {
717
+ serverType = server.type;
718
+ } else if (server.type === "stdio" || server.command) {
719
+ continue;
720
+ } else if (!server.type) {
721
+ if (isVSCodeFormat || config.mcpServers) {
722
+ serverType = "http";
723
+ }
724
+ }
725
+ if (serverType) {
726
+ seenUrls.add(trimmedUrl);
727
+ servers.push({
728
+ type: serverType,
729
+ url: trimmedUrl
730
+ });
731
+ }
732
+ }
733
+ }
734
+ }
735
+ }
736
+ } catch (error) {
737
+ continue;
738
+ }
739
+ }
740
+ return servers;
741
+ }
742
+
743
+ // lib/prompts.ts
744
+ async function promptForConfigFiles(cwd = process.cwd()) {
745
+ const availableFiles = await findMcpConfigFiles(cwd);
746
+ if (availableFiles.length === 0) {
747
+ throw new Error("No MCP configuration files found. Create a .mcp.json file with your MCP server configuration.");
748
+ }
749
+ const configSelection = await fe({
750
+ message: "Select MCP configuration files to use:",
751
+ options: availableFiles.map((file) => ({
752
+ value: file,
753
+ label: file.replace(cwd + "/", ""),
754
+ hint: `Found at ${file}`
755
+ })),
756
+ initialValues: availableFiles,
757
+ required: true
758
+ });
759
+ if (pD(configSelection)) {
760
+ xe("Operation cancelled");
761
+ process.exit(0);
762
+ }
763
+ return configSelection;
764
+ }
765
+ async function promptForServers(configFiles) {
766
+ const allServers = getMcpServers(configFiles);
767
+ if (allServers.length === 0) {
768
+ throw new Error("No valid MCP servers found in configuration files. Check your .mcp.json configuration.");
769
+ }
770
+ const serverSelection = await fe({
771
+ message: "Select MCP servers to include:",
772
+ options: allServers.map((server) => ({
773
+ value: server,
774
+ label: `${server.url}`,
775
+ hint: `Type: ${server.type}`
776
+ })),
777
+ initialValues: allServers,
778
+ required: true
779
+ });
780
+ if (pD(serverSelection)) {
781
+ xe("Operation cancelled");
782
+ process.exit(0);
783
+ }
784
+ return serverSelection;
785
+ }
786
+ async function promptForOutputFile(cwd = process.cwd()) {
787
+ const srcExists = existsSync2(resolve2(cwd, "src"));
788
+ const defaultPath = srcExists ? "src/lib/mcp-client.ts" : "lib/mcp-client.ts";
789
+ const outputPath = await he({
790
+ message: "Enter output file path:",
791
+ placeholder: defaultPath,
792
+ defaultValue: defaultPath,
793
+ validate: (value) => {
794
+ if (!value || value.trim() === "") {
795
+ return "Output file path is required";
796
+ }
797
+ if (!value.endsWith(".ts")) {
798
+ return "Output file must have .ts extension";
799
+ }
800
+ return;
801
+ }
802
+ });
803
+ if (pD(outputPath)) {
804
+ xe("Operation cancelled");
805
+ process.exit(0);
806
+ }
807
+ return outputPath.trim();
808
+ }
809
+ async function runInteractiveSetup(cwd = process.cwd(), useDefaults = false) {
810
+ if (useDefaults) {
811
+ const configFiles = await findMcpConfigFiles(cwd);
812
+ if (configFiles.length === 0) {
813
+ throw new Error("No MCP configuration files found. Create a .mcp.json file with your MCP server configuration.");
814
+ }
815
+ const servers = getMcpServers(configFiles);
816
+ if (servers.length === 0) {
817
+ throw new Error("No valid MCP servers found in configuration files. Check your .mcp.json configuration.");
818
+ }
819
+ const srcExists = existsSync2(resolve2(cwd, "src"));
820
+ const outputFile = srcExists ? "src/lib/mcp-client.ts" : "lib/mcp-client.ts";
821
+ console.log(`\uD83D\uDE80 Using defaults: ${servers.length} server${servers.length !== 1 ? "s" : ""} โ†’ ${outputFile}`);
822
+ return {
823
+ configFiles,
824
+ servers,
825
+ outputFile
826
+ };
827
+ }
828
+ Ie("\uD83E\uDDE9 MCP Client Generator");
829
+ try {
830
+ const configFiles = await promptForConfigFiles(cwd);
831
+ const servers = await promptForServers(configFiles);
832
+ const outputFile = await promptForOutputFile(cwd);
833
+ Se(`\x05 Configuration complete! Generating client for ${servers.length} server${servers.length !== 1 ? "s" : ""}`);
834
+ return {
835
+ configFiles,
836
+ servers,
837
+ outputFile
838
+ };
839
+ } catch (error) {
840
+ xe(`Error: ${error.message}`);
841
+ process.exit(1);
842
+ }
843
+ }
844
+
845
+ // index.ts
7
846
  function showHelp() {
8
847
  console.log(`
9
848
  mcp-client-gen - Generate type-safe MCP client SDK
10
849
 
11
850
  Usage:
12
- npx mcp-client-gen <output-file>
851
+ npx mcp-client-gen # Launch interactive mode
852
+ npx mcp-client-gen -y # Accept defaults and proceed
853
+ npx mcp-client-gen <output-file> # Use specific output file
13
854
  npx mcp-client-gen --config <config-file> <output-file>
14
855
 
15
856
  Arguments:
@@ -17,10 +858,13 @@ Arguments:
17
858
 
18
859
  Options:
19
860
  --config <file> Path to MCP configuration file (default: .mcp.json)
861
+ -y, --yes Accept all defaults and skip interactive prompts
20
862
  --help Show this help message
21
863
 
22
- Example:
23
- npx mcp-client-gen ./lib/mcp-client.ts
864
+ Examples:
865
+ npx mcp-client-gen # Interactive mode with prompts
866
+ npx mcp-client-gen -y # Quick generation with defaults
867
+ npx mcp-client-gen ./lib/mcp-client.ts # Specify output file
24
868
  npx mcp-client-gen --config custom.mcp.json ./lib/mcp.ts
25
869
  `);
26
870
  }
@@ -29,7 +873,8 @@ function parseArguments() {
29
873
  const { values, positionals } = parseArgs({
30
874
  options: {
31
875
  config: { type: "string" },
32
- help: { type: "boolean", short: "h" }
876
+ help: { type: "boolean", short: "h" },
877
+ yes: { type: "boolean", short: "y" }
33
878
  },
34
879
  allowPositionals: true
35
880
  });
@@ -38,13 +883,16 @@ function parseArguments() {
38
883
  return null;
39
884
  }
40
885
  if (positionals.length === 0) {
41
- console.error("Error: Missing output file argument");
42
- showHelp();
43
- process.exit(1);
886
+ return {
887
+ output: "",
888
+ config: values.config,
889
+ yes: values.yes || false
890
+ };
44
891
  }
45
892
  return {
46
893
  output: positionals[0],
47
- config: values.config
894
+ config: values.config,
895
+ yes: values.yes || false
48
896
  };
49
897
  } catch (error) {
50
898
  console.error("Error parsing arguments:", error.message);
@@ -53,22 +901,22 @@ function parseArguments() {
53
901
  }
54
902
  }
55
903
  function loadMCPConfig(configPath) {
56
- const defaultConfigPath = resolve(process.cwd(), ".mcp.json");
57
- const actualConfigPath = configPath ? resolve(process.cwd(), configPath) : defaultConfigPath;
58
- if (!existsSync(actualConfigPath)) {
904
+ const defaultConfigPath = resolve3(process.cwd(), ".mcp.json");
905
+ const actualConfigPath = configPath ? resolve3(process.cwd(), configPath) : defaultConfigPath;
906
+ if (!existsSync3(actualConfigPath)) {
59
907
  console.error(`Error: Configuration file not found: ${actualConfigPath}`);
60
908
  console.error("Create a .mcp.json file with your MCP server configuration.");
61
909
  process.exit(1);
62
910
  }
63
911
  try {
64
- const configContent = readFileSync(actualConfigPath, "utf-8");
912
+ const configContent = readFileSync2(actualConfigPath, "utf-8");
65
913
  return JSON.parse(configContent);
66
914
  } catch (error) {
67
915
  console.error(`Error reading configuration file: ${error.message}`);
68
916
  process.exit(1);
69
917
  }
70
918
  }
71
- async function generateMCPClient(args) {
919
+ async function generateMCPClientFromConfig(args) {
72
920
  const config = loadMCPConfig(args.config);
73
921
  const serverNames = Object.keys(config.mcpServers);
74
922
  console.log(`Generating MCP client SDK from ${serverNames.length} servers...`);
@@ -76,7 +924,12 @@ async function generateMCPClient(args) {
76
924
  console.log("โณ Connecting to MCP servers...");
77
925
  console.log("โณ Fetching server capabilities...");
78
926
  console.log("โณ Generating TypeScript client...");
79
- const clientExports = serverNames.map((name) => `export const ${name} = new ${capitalize(name)}Client("${config.mcpServers[name].url}");`).join(`
927
+ const clientExports = serverNames.map((name) => {
928
+ const server = config.mcpServers[name];
929
+ if (!server)
930
+ throw new Error(`Server ${name} not found in configuration`);
931
+ return `export const ${name} = new ${capitalize(name)}Client("${server.url}");`;
932
+ }).join(`
80
933
  `);
81
934
  const clientClasses = serverNames.map((name) => `
82
935
  export class ${capitalize(name)}Client {
@@ -90,7 +943,7 @@ export class ${capitalize(name)}Client {
90
943
  }`).join(`
91
944
  `);
92
945
  const clientCode = `// Generated MCP client SDK
93
- // Generated from: ${Object.entries(config.mcpServers).map(([name, server]) => `${name} (${server.url})`).join(", ")}
946
+ // Generated from: ${Object.entries(config.mcpServers).map(([name, server]) => `${name} (${server?.url || "unknown"})`).join(", ")}
94
947
 
95
948
  ${clientClasses}
96
949
 
@@ -102,15 +955,61 @@ Usage:`);
102
955
  console.log(`import { ${serverNames[0]} } from "${args.output.replace(".ts", ".js")}";`);
103
956
  console.log(`const result = await ${serverNames[0]}.fetchPage("123");`);
104
957
  }
958
+ async function generateMCPClientFromServers(servers, outputFile) {
959
+ console.log(`Generating MCP client SDK from ${servers.length} servers...`);
960
+ console.log(`Servers: ${servers.map((s) => s.url).join(", ")}`);
961
+ console.log("โณ Connecting to MCP servers...");
962
+ console.log("โณ Fetching server capabilities...");
963
+ console.log("โณ Generating TypeScript client...");
964
+ const serverNames = servers.map((_3, index) => `server${index + 1}`);
965
+ const clientExports = servers.map((server, index) => `export const server${index + 1} = new Server${index + 1}Client("${server.url}");`).join(`
966
+ `);
967
+ const clientClasses = servers.map((server, index) => `
968
+ export class Server${index + 1}Client {
969
+ constructor(private serverUrl: string) {}
970
+
971
+ // TODO: Generated methods based on server capabilities
972
+ async fetchPage(id: string) {
973
+ // Implementation will be generated based on MCP server schema
974
+ throw new Error("Not implemented yet");
975
+ }
976
+ }`).join(`
977
+ `);
978
+ const clientCode = `// Generated MCP client SDK
979
+ // Generated from: ${servers.map((s) => `${s.url} (${s.type})`).join(", ")}
980
+
981
+ ${clientClasses}
982
+
983
+ ${clientExports}
984
+ `;
985
+ console.log(`โœ… Generated client saved to ${outputFile}`);
986
+ console.log(`
987
+ Usage:`);
988
+ console.log(`import { ${serverNames[0]} } from "${outputFile.replace(".ts", ".js")}";`);
989
+ console.log(`const result = await ${serverNames[0]}.fetchPage("123");`);
990
+ }
105
991
  function capitalize(str) {
106
992
  return str.charAt(0).toUpperCase() + str.slice(1);
107
993
  }
108
994
  async function main() {
109
995
  const args = parseArguments();
110
- if (!args)
996
+ if (!args) {
997
+ console.error("Error: No arguments provided and help not requested");
998
+ showHelp();
999
+ process.exit(1);
1000
+ }
1001
+ if (!args.output) {
1002
+ try {
1003
+ const result = await runInteractiveSetup(process.cwd(), args.yes);
1004
+ await generateMCPClientFromServers(result.servers, result.outputFile);
1005
+ } catch (error) {
1006
+ console.error("Error:", error.message);
1007
+ process.exit(1);
1008
+ }
111
1009
  return;
1010
+ }
112
1011
  try {
113
- await generateMCPClient(args);
1012
+ await generateMCPClientFromConfig(args);
114
1013
  } catch (error) {
115
1014
  console.error("Error:", error.message);
116
1015
  process.exit(1);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "mcp-client-gen",
3
- "version": "0.0.1",
4
- "description": "CLI tool that generates MCP client from an MCP server",
3
+ "version": "0.0.2",
4
+ "description": "Interactive CLI tool that generates type-safe TypeScript clients from MCP servers",
5
5
  "module": "dist/index.js",
6
6
  "type": "module",
7
7
  "bin": {
@@ -18,12 +18,13 @@
18
18
  "codegen",
19
19
  "anthropic",
20
20
  "cli",
21
+ "interactive",
21
22
  "typescript",
22
23
  "api-client",
23
- "openapi",
24
+ "prompts",
24
25
  "schema",
25
26
  "tool",
26
- "oauth"
27
+ "type-safe"
27
28
  ],
28
29
  "author": "Konstantin Tarkus <koistya@kriasoft.com>",
29
30
  "license": "MIT",
@@ -35,12 +36,19 @@
35
36
  "bugs": {
36
37
  "url": "https://github.com/kriasoft/mcp-client-gen/issues"
37
38
  },
39
+ "dependencies": {
40
+ "@clack/prompts": "^0.11.0",
41
+ "ts-morph": "^26.0.0"
42
+ },
38
43
  "peerDependencies": {
44
+ "@modelcontextprotocol/sdk": "^1.17.2",
39
45
  "typescript": "^5.9.2"
40
46
  },
41
47
  "devDependencies": {
48
+ "@modelcontextprotocol/sdk": "^1.17.2",
42
49
  "@types/bun": "latest",
43
- "prettier": "^3.6.2"
50
+ "prettier": "^3.6.2",
51
+ "typescript": "^5.9.2"
44
52
  },
45
53
  "scripts": {
46
54
  "build": "bun build index.ts --outdir dist --target node",