@solongate/proxy 0.1.5 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/create.js CHANGED
@@ -4,9 +4,66 @@
4
4
  import { mkdirSync, writeFileSync, existsSync } from "fs";
5
5
  import { resolve, join } from "path";
6
6
  import { execSync } from "child_process";
7
+ var c = {
8
+ reset: "\x1B[0m",
9
+ bold: "\x1B[1m",
10
+ dim: "\x1B[2m",
11
+ italic: "\x1B[3m",
12
+ white: "\x1B[97m",
13
+ gray: "\x1B[90m",
14
+ blue1: "\x1B[38;2;20;50;160m",
15
+ blue2: "\x1B[38;2;40;80;190m",
16
+ blue3: "\x1B[38;2;60;110;215m",
17
+ blue4: "\x1B[38;2;90;140;230m",
18
+ blue5: "\x1B[38;2;130;170;240m",
19
+ blue6: "\x1B[38;2;170;200;250m",
20
+ green: "\x1B[38;2;80;200;120m",
21
+ red: "\x1B[38;2;220;80;80m",
22
+ cyan: "\x1B[38;2;100;200;220m",
23
+ yellow: "\x1B[38;2;220;200;80m",
24
+ bgBlue: "\x1B[48;2;20;50;160m"
25
+ };
7
26
  function log(msg) {
8
27
  process.stderr.write(msg + "\n");
9
28
  }
29
+ function printBanner(subtitle) {
30
+ const lines = [
31
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557",
32
+ " \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D",
33
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2557 ",
34
+ " \u255A\u2550\u2550\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u255D ",
35
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557",
36
+ " \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D"
37
+ ];
38
+ const colors = [c.blue1, c.blue2, c.blue3, c.blue4, c.blue5, c.blue6];
39
+ log("");
40
+ for (let i = 0; i < lines.length; i++) {
41
+ log(`${c.bold}${colors[i]}${lines[i]}${c.reset}`);
42
+ }
43
+ log("");
44
+ log(` ${c.dim}${c.italic}${subtitle}${c.reset}`);
45
+ log("");
46
+ }
47
+ function withSpinner(message, fn) {
48
+ const frames = ["\u28FE", "\u28FD", "\u28FB", "\u28BF", "\u287F", "\u28DF", "\u28EF", "\u28F7"];
49
+ let i = 0;
50
+ const id = setInterval(() => {
51
+ const color = i % 2 === 0 ? c.blue3 : c.blue5;
52
+ process.stderr.write(`\r ${color}${frames[i++ % frames.length]}${c.reset} ${c.dim}${message}${c.reset}`);
53
+ }, 80);
54
+ try {
55
+ const result = fn();
56
+ clearInterval(id);
57
+ process.stderr.write(`\r ${c.green}\u2713${c.reset} ${message}${" ".repeat(20)}
58
+ `);
59
+ return result;
60
+ } catch (err) {
61
+ clearInterval(id);
62
+ process.stderr.write(`\r ${c.red}\u2717${c.reset} ${message} \u2014 failed${" ".repeat(10)}
63
+ `);
64
+ throw err;
65
+ }
66
+ }
10
67
  function parseCreateArgs(argv) {
11
68
  const args = argv.slice(2);
12
69
  const opts = {
@@ -190,75 +247,53 @@ dist/
190
247
  `
191
248
  );
192
249
  }
193
- function withSpinner(message, fn) {
194
- const frames = ["\u280B", "\u2819", "\u2839", "\u2838", "\u283C", "\u2834", "\u2826", "\u2827", "\u2807", "\u280F"];
195
- let i = 0;
196
- const id = setInterval(() => {
197
- process.stderr.write(`\r ${frames[i++ % frames.length]} ${message}`);
198
- }, 80);
199
- try {
200
- fn();
201
- clearInterval(id);
202
- process.stderr.write(`\r \u2713 ${message}
203
- `);
204
- } catch {
205
- clearInterval(id);
206
- process.stderr.write(`\r \u2717 ${message} \u2014 failed
207
- `);
208
- }
209
- }
210
- function installDeps(dir) {
211
- withSpinner("Installing dependencies...", () => {
212
- execSync("npm install", { cwd: dir, stdio: "pipe" });
213
- });
214
- }
215
250
  async function main() {
216
251
  const opts = parseCreateArgs(process.argv);
217
252
  const dir = resolve(opts.name);
218
- log("");
219
- log(" ____ _ ____ _");
220
- log(" / ___| ___ | | ___ _ __ / ___| __ _| |_ ___");
221
- log(" \\___ \\ / _ \\| |/ _ \\| '_ \\| | _ / _` | __/ _ \\");
222
- log(" ___) | (_) | | (_) | | | | |_| | (_| | || __/");
223
- log(" |____/ \\___/|_|\\___/|_| |_|\\____|\\__,_|\\__\\___|");
224
- log("");
225
- log(" Create MCP Server");
226
- log("");
253
+ printBanner("Create MCP Server");
227
254
  if (existsSync(dir)) {
228
- log(` Error: Directory "${opts.name}" already exists.`);
255
+ log(` ${c.red}Error:${c.reset} Directory "${opts.name}" already exists.`);
229
256
  process.exit(1);
230
257
  }
231
- mkdirSync(dir, { recursive: true });
232
- log(` Project: ${opts.name}`);
233
- log(` Language: TypeScript`);
234
- log(` Policy: ${opts.policy}`);
235
- log("");
236
- createProject(dir, opts.name, opts.policy);
237
- log(" Files created:");
238
- log(" package.json");
239
- log(" tsconfig.json");
240
- log(" src/index.ts");
241
- log(" .mcp.json");
242
- log(" .gitignore");
258
+ log(` ${c.blue3}Project${c.reset} ${c.bold}${opts.name}${c.reset}`);
259
+ log(` ${c.blue3}Language${c.reset} TypeScript`);
260
+ log(` ${c.blue3}Policy${c.reset} ${opts.policy}`);
243
261
  log("");
262
+ withSpinner("Scaffolding project files...", () => {
263
+ mkdirSync(dir, { recursive: true });
264
+ createProject(dir, opts.name, opts.policy);
265
+ });
244
266
  if (!opts.noInstall) {
245
- installDeps(dir);
246
- log("");
267
+ withSpinner("Installing dependencies...", () => {
268
+ execSync("npm install", { cwd: dir, stdio: "pipe" });
269
+ });
247
270
  }
248
- const W = 46;
249
- const line = (s) => log(` \u2502 ${s.padEnd(W)} \u2502`);
250
- log(` \u250C${"\u2500".repeat(W + 2)}\u2510`);
251
- line("Project created!");
252
- line("");
253
- line(`cd ${opts.name}`);
254
- line("");
255
- line("npm run build # Build");
256
- line("npm run dev # Dev mode (tsx)");
257
- line("npm start # Run built server");
258
- line("");
259
- line("Set your API key:");
260
- line("export SOLONGATE_API_KEY=sg_live_xxx");
261
- log(` \u2514${"\u2500".repeat(W + 2)}\u2518`);
271
+ log("");
272
+ const W = 52;
273
+ const hr = "\u2500".repeat(W);
274
+ const pad = (s) => s.padEnd(W);
275
+ const bLine = (s) => log(` ${c.dim}\u2502${c.reset} ${pad(s)} ${c.dim}\u2502${c.reset}`);
276
+ const bEmpty = () => bLine("");
277
+ log(` ${c.dim}\u256D${hr}\u256E${c.reset}`);
278
+ log(` ${c.dim}\u2502${c.reset} ${c.green}${c.bold}${"\u2714 Project created successfully!".padEnd(W)}${c.reset} ${c.dim}\u2502${c.reset}`);
279
+ log(` ${c.dim}\u251C${hr}\u2524${c.reset}`);
280
+ bEmpty();
281
+ bLine(`${c.yellow}Next steps:${c.reset}`);
282
+ bEmpty();
283
+ bLine(` ${c.cyan}$${c.reset} cd ${c.bold}${opts.name}${c.reset}`);
284
+ bLine(` ${c.cyan}$${c.reset} npm run build`);
285
+ bLine(` ${c.cyan}$${c.reset} npm run dev ${c.dim}# dev mode${c.reset}`);
286
+ bLine(` ${c.cyan}$${c.reset} npm start ${c.dim}# production${c.reset}`);
287
+ bEmpty();
288
+ log(` ${c.dim}\u251C${hr}\u2524${c.reset}`);
289
+ bEmpty();
290
+ bLine(`${c.yellow}Set your API key:${c.reset}`);
291
+ bEmpty();
292
+ bLine(` ${c.cyan}$${c.reset} export SOLONGATE_API_KEY=${c.blue3}sg_live_xxx${c.reset}`);
293
+ bEmpty();
294
+ bLine(`${c.dim}Get your key at ${c.blue4}https://solongate.com${c.reset}`);
295
+ bEmpty();
296
+ log(` ${c.dim}\u2570${hr}\u256F${c.reset}`);
262
297
  log("");
263
298
  }
264
299
  main().catch((err) => {
package/dist/index.js CHANGED
@@ -143,14 +143,33 @@ POLICY PRESETS
143
143
  }
144
144
  async function main() {
145
145
  const options = parseInitArgs(process.argv);
146
+ const _c = {
147
+ reset: "\x1B[0m",
148
+ bold: "\x1B[1m",
149
+ dim: "\x1B[2m",
150
+ italic: "\x1B[3m",
151
+ blue1: "\x1B[38;2;20;50;160m",
152
+ blue2: "\x1B[38;2;40;80;190m",
153
+ blue3: "\x1B[38;2;60;110;215m",
154
+ blue4: "\x1B[38;2;90;140;230m",
155
+ blue5: "\x1B[38;2;130;170;240m",
156
+ blue6: "\x1B[38;2;170;200;250m"
157
+ };
158
+ const bannerLines = [
159
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557",
160
+ " \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D",
161
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2557 ",
162
+ " \u255A\u2550\u2550\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u255D ",
163
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557",
164
+ " \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D"
165
+ ];
166
+ const bannerColors = [_c.blue1, _c.blue2, _c.blue3, _c.blue4, _c.blue5, _c.blue6];
146
167
  console.error("");
147
- console.error(" ____ _ ____ _");
148
- console.error(" / ___| ___ | | ___ _ __ / ___| __ _| |_ ___");
149
- console.error(" \\___ \\ / _ \\| |/ _ \\| '_ \\| | _ / _` | __/ _ \\");
150
- console.error(" ___) | (_) | | (_) | | | | |_| | (_| | || __/");
151
- console.error(" |____/ \\___/|_|\\___/|_| |_|\\____|\\__,_|\\__\\___|");
168
+ for (let i = 0; i < bannerLines.length; i++) {
169
+ console.error(`${_c.bold}${bannerColors[i]}${bannerLines[i]}${_c.reset}`);
170
+ }
152
171
  console.error("");
153
- console.error(" Init Setup");
172
+ console.error(` ${_c.dim}${_c.italic}Init Setup${_c.reset}`);
154
173
  console.error("");
155
174
  const configInfo = findConfigFile(options.configPath);
156
175
  if (!configInfo) {
@@ -350,6 +369,24 @@ WHAT IT DOES
350
369
  function log2(msg) {
351
370
  process.stderr.write(msg + "\n");
352
371
  }
372
+ function printBanner(subtitle) {
373
+ const lines = [
374
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557",
375
+ " \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D",
376
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2557 ",
377
+ " \u255A\u2550\u2550\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u255D ",
378
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557",
379
+ " \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D"
380
+ ];
381
+ const colors = [c.blue1, c.blue2, c.blue3, c.blue4, c.blue5, c.blue6];
382
+ log2("");
383
+ for (let i = 0; i < lines.length; i++) {
384
+ log2(`${c.bold}${colors[i]}${lines[i]}${c.reset}`);
385
+ }
386
+ log2("");
387
+ log2(` ${c.dim}${c.italic}${subtitle}${c.reset}`);
388
+ log2("");
389
+ }
353
390
  function detectProject() {
354
391
  if (!existsSync3(resolve3("package.json"))) return false;
355
392
  try {
@@ -385,8 +422,8 @@ function findTsEntryFile() {
385
422
  "server.ts",
386
423
  "main.ts"
387
424
  ];
388
- for (const c of candidates) {
389
- const full = resolve3(c);
425
+ for (const c3 of candidates) {
426
+ const full = resolve3(c3);
390
427
  if (existsSync3(full)) {
391
428
  try {
392
429
  const content = readFileSync3(full, "utf-8");
@@ -397,8 +434,8 @@ function findTsEntryFile() {
397
434
  }
398
435
  }
399
436
  }
400
- for (const c of candidates) {
401
- if (existsSync3(resolve3(c))) return resolve3(c);
437
+ for (const c3 of candidates) {
438
+ if (existsSync3(resolve3(c3))) return resolve3(c3);
402
439
  }
403
440
  return null;
404
441
  }
@@ -536,15 +573,7 @@ function showDiff(result) {
536
573
  }
537
574
  async function main2() {
538
575
  const opts = parseInjectArgs(process.argv);
539
- log2("");
540
- log2(" ____ _ ____ _");
541
- log2(" / ___| ___ | | ___ _ __ / ___| __ _| |_ ___");
542
- log2(" \\___ \\ / _ \\| |/ _ \\| '_ \\| | _ / _` | __/ _ \\");
543
- log2(" ___) | (_) | | (_) | | | | |_| | (_| | || __/");
544
- log2(" |____/ \\___/|_|\\___/|_| |_|\\____|\\__,_|\\__\\___|");
545
- log2("");
546
- log2(" Inject SDK");
547
- log2("");
576
+ printBanner("Inject SDK");
548
577
  if (!detectProject()) {
549
578
  log2(" Could not detect a TypeScript MCP server project.");
550
579
  log2(" Make sure you are in a project directory with:");
@@ -625,9 +654,24 @@ async function main2() {
625
654
  log2(" \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518");
626
655
  log2("");
627
656
  }
657
+ var c;
628
658
  var init_inject = __esm({
629
659
  "src/inject.ts"() {
630
660
  "use strict";
661
+ c = {
662
+ reset: "\x1B[0m",
663
+ bold: "\x1B[1m",
664
+ dim: "\x1B[2m",
665
+ italic: "\x1B[3m",
666
+ green: "\x1B[38;2;80;200;120m",
667
+ red: "\x1B[38;2;220;80;80m",
668
+ blue1: "\x1B[38;2;20;50;160m",
669
+ blue2: "\x1B[38;2;40;80;190m",
670
+ blue3: "\x1B[38;2;60;110;215m",
671
+ blue4: "\x1B[38;2;90;140;230m",
672
+ blue5: "\x1B[38;2;130;170;240m",
673
+ blue6: "\x1B[38;2;170;200;250m"
674
+ };
631
675
  main2().catch((err) => {
632
676
  log2(`Fatal: ${err instanceof Error ? err.message : String(err)}`);
633
677
  process.exit(1);
@@ -643,6 +687,44 @@ import { execSync as execSync2 } from "child_process";
643
687
  function log3(msg) {
644
688
  process.stderr.write(msg + "\n");
645
689
  }
690
+ function printBanner2(subtitle) {
691
+ const lines = [
692
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557",
693
+ " \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D",
694
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2557 ",
695
+ " \u255A\u2550\u2550\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u255D ",
696
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557",
697
+ " \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D"
698
+ ];
699
+ const colors = [c2.blue1, c2.blue2, c2.blue3, c2.blue4, c2.blue5, c2.blue6];
700
+ log3("");
701
+ for (let i = 0; i < lines.length; i++) {
702
+ log3(`${c2.bold}${colors[i]}${lines[i]}${c2.reset}`);
703
+ }
704
+ log3("");
705
+ log3(` ${c2.dim}${c2.italic}${subtitle}${c2.reset}`);
706
+ log3("");
707
+ }
708
+ function withSpinner(message, fn) {
709
+ const frames = ["\u28FE", "\u28FD", "\u28FB", "\u28BF", "\u287F", "\u28DF", "\u28EF", "\u28F7"];
710
+ let i = 0;
711
+ const id = setInterval(() => {
712
+ const color = i % 2 === 0 ? c2.blue3 : c2.blue5;
713
+ process.stderr.write(`\r ${color}${frames[i++ % frames.length]}${c2.reset} ${c2.dim}${message}${c2.reset}`);
714
+ }, 80);
715
+ try {
716
+ const result = fn();
717
+ clearInterval(id);
718
+ process.stderr.write(`\r ${c2.green}\u2713${c2.reset} ${message}${" ".repeat(20)}
719
+ `);
720
+ return result;
721
+ } catch (err) {
722
+ clearInterval(id);
723
+ process.stderr.write(`\r ${c2.red}\u2717${c2.reset} ${message} \u2014 failed${" ".repeat(10)}
724
+ `);
725
+ throw err;
726
+ }
727
+ }
646
728
  function parseCreateArgs(argv) {
647
729
  const args = argv.slice(2);
648
730
  const opts = {
@@ -826,80 +908,78 @@ dist/
826
908
  `
827
909
  );
828
910
  }
829
- function withSpinner(message, fn) {
830
- const frames = ["\u280B", "\u2819", "\u2839", "\u2838", "\u283C", "\u2834", "\u2826", "\u2827", "\u2807", "\u280F"];
831
- let i = 0;
832
- const id = setInterval(() => {
833
- process.stderr.write(`\r ${frames[i++ % frames.length]} ${message}`);
834
- }, 80);
835
- try {
836
- fn();
837
- clearInterval(id);
838
- process.stderr.write(`\r \u2713 ${message}
839
- `);
840
- } catch {
841
- clearInterval(id);
842
- process.stderr.write(`\r \u2717 ${message} \u2014 failed
843
- `);
844
- }
845
- }
846
- function installDeps(dir) {
847
- withSpinner("Installing dependencies...", () => {
848
- execSync2("npm install", { cwd: dir, stdio: "pipe" });
849
- });
850
- }
851
911
  async function main3() {
852
912
  const opts = parseCreateArgs(process.argv);
853
913
  const dir = resolve4(opts.name);
854
- log3("");
855
- log3(" ____ _ ____ _");
856
- log3(" / ___| ___ | | ___ _ __ / ___| __ _| |_ ___");
857
- log3(" \\___ \\ / _ \\| |/ _ \\| '_ \\| | _ / _` | __/ _ \\");
858
- log3(" ___) | (_) | | (_) | | | | |_| | (_| | || __/");
859
- log3(" |____/ \\___/|_|\\___/|_| |_|\\____|\\__,_|\\__\\___|");
860
- log3("");
861
- log3(" Create MCP Server");
862
- log3("");
914
+ printBanner2("Create MCP Server");
863
915
  if (existsSync4(dir)) {
864
- log3(` Error: Directory "${opts.name}" already exists.`);
916
+ log3(` ${c2.red}Error:${c2.reset} Directory "${opts.name}" already exists.`);
865
917
  process.exit(1);
866
918
  }
867
- mkdirSync(dir, { recursive: true });
868
- log3(` Project: ${opts.name}`);
869
- log3(` Language: TypeScript`);
870
- log3(` Policy: ${opts.policy}`);
871
- log3("");
872
- createProject(dir, opts.name, opts.policy);
873
- log3(" Files created:");
874
- log3(" package.json");
875
- log3(" tsconfig.json");
876
- log3(" src/index.ts");
877
- log3(" .mcp.json");
878
- log3(" .gitignore");
919
+ log3(` ${c2.blue3}Project${c2.reset} ${c2.bold}${opts.name}${c2.reset}`);
920
+ log3(` ${c2.blue3}Language${c2.reset} TypeScript`);
921
+ log3(` ${c2.blue3}Policy${c2.reset} ${opts.policy}`);
879
922
  log3("");
923
+ withSpinner("Scaffolding project files...", () => {
924
+ mkdirSync(dir, { recursive: true });
925
+ createProject(dir, opts.name, opts.policy);
926
+ });
880
927
  if (!opts.noInstall) {
881
- installDeps(dir);
882
- log3("");
928
+ withSpinner("Installing dependencies...", () => {
929
+ execSync2("npm install", { cwd: dir, stdio: "pipe" });
930
+ });
883
931
  }
884
- const W = 46;
885
- const line = (s) => log3(` \u2502 ${s.padEnd(W)} \u2502`);
886
- log3(` \u250C${"\u2500".repeat(W + 2)}\u2510`);
887
- line("Project created!");
888
- line("");
889
- line(`cd ${opts.name}`);
890
- line("");
891
- line("npm run build # Build");
892
- line("npm run dev # Dev mode (tsx)");
893
- line("npm start # Run built server");
894
- line("");
895
- line("Set your API key:");
896
- line("export SOLONGATE_API_KEY=sg_live_xxx");
897
- log3(` \u2514${"\u2500".repeat(W + 2)}\u2518`);
932
+ log3("");
933
+ const W = 52;
934
+ const hr = "\u2500".repeat(W);
935
+ const pad = (s) => s.padEnd(W);
936
+ const bLine = (s) => log3(` ${c2.dim}\u2502${c2.reset} ${pad(s)} ${c2.dim}\u2502${c2.reset}`);
937
+ const bEmpty = () => bLine("");
938
+ log3(` ${c2.dim}\u256D${hr}\u256E${c2.reset}`);
939
+ log3(` ${c2.dim}\u2502${c2.reset} ${c2.green}${c2.bold}${"\u2714 Project created successfully!".padEnd(W)}${c2.reset} ${c2.dim}\u2502${c2.reset}`);
940
+ log3(` ${c2.dim}\u251C${hr}\u2524${c2.reset}`);
941
+ bEmpty();
942
+ bLine(`${c2.yellow}Next steps:${c2.reset}`);
943
+ bEmpty();
944
+ bLine(` ${c2.cyan}$${c2.reset} cd ${c2.bold}${opts.name}${c2.reset}`);
945
+ bLine(` ${c2.cyan}$${c2.reset} npm run build`);
946
+ bLine(` ${c2.cyan}$${c2.reset} npm run dev ${c2.dim}# dev mode${c2.reset}`);
947
+ bLine(` ${c2.cyan}$${c2.reset} npm start ${c2.dim}# production${c2.reset}`);
948
+ bEmpty();
949
+ log3(` ${c2.dim}\u251C${hr}\u2524${c2.reset}`);
950
+ bEmpty();
951
+ bLine(`${c2.yellow}Set your API key:${c2.reset}`);
952
+ bEmpty();
953
+ bLine(` ${c2.cyan}$${c2.reset} export SOLONGATE_API_KEY=${c2.blue3}sg_live_xxx${c2.reset}`);
954
+ bEmpty();
955
+ bLine(`${c2.dim}Get your key at ${c2.blue4}https://solongate.com${c2.reset}`);
956
+ bEmpty();
957
+ log3(` ${c2.dim}\u2570${hr}\u256F${c2.reset}`);
898
958
  log3("");
899
959
  }
960
+ var c2;
900
961
  var init_create = __esm({
901
962
  "src/create.ts"() {
902
963
  "use strict";
964
+ c2 = {
965
+ reset: "\x1B[0m",
966
+ bold: "\x1B[1m",
967
+ dim: "\x1B[2m",
968
+ italic: "\x1B[3m",
969
+ white: "\x1B[97m",
970
+ gray: "\x1B[90m",
971
+ blue1: "\x1B[38;2;20;50;160m",
972
+ blue2: "\x1B[38;2;40;80;190m",
973
+ blue3: "\x1B[38;2;60;110;215m",
974
+ blue4: "\x1B[38;2;90;140;230m",
975
+ blue5: "\x1B[38;2;130;170;240m",
976
+ blue6: "\x1B[38;2;170;200;250m",
977
+ green: "\x1B[38;2;80;200;120m",
978
+ red: "\x1B[38;2;220;80;80m",
979
+ cyan: "\x1B[38;2;100;200;220m",
980
+ yellow: "\x1B[38;2;220;200;80m",
981
+ bgBlue: "\x1B[48;2;20;50;160m"
982
+ };
903
983
  main3().catch((err) => {
904
984
  log3(`Fatal: ${err instanceof Error ? err.message : String(err)}`);
905
985
  process.exit(1);
package/dist/init.js CHANGED
@@ -145,14 +145,33 @@ POLICY PRESETS
145
145
  }
146
146
  async function main() {
147
147
  const options = parseInitArgs(process.argv);
148
+ const _c = {
149
+ reset: "\x1B[0m",
150
+ bold: "\x1B[1m",
151
+ dim: "\x1B[2m",
152
+ italic: "\x1B[3m",
153
+ blue1: "\x1B[38;2;20;50;160m",
154
+ blue2: "\x1B[38;2;40;80;190m",
155
+ blue3: "\x1B[38;2;60;110;215m",
156
+ blue4: "\x1B[38;2;90;140;230m",
157
+ blue5: "\x1B[38;2;130;170;240m",
158
+ blue6: "\x1B[38;2;170;200;250m"
159
+ };
160
+ const bannerLines = [
161
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557",
162
+ " \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D",
163
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2557 ",
164
+ " \u255A\u2550\u2550\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u255D ",
165
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557",
166
+ " \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D"
167
+ ];
168
+ const bannerColors = [_c.blue1, _c.blue2, _c.blue3, _c.blue4, _c.blue5, _c.blue6];
148
169
  console.error("");
149
- console.error(" ____ _ ____ _");
150
- console.error(" / ___| ___ | | ___ _ __ / ___| __ _| |_ ___");
151
- console.error(" \\___ \\ / _ \\| |/ _ \\| '_ \\| | _ / _` | __/ _ \\");
152
- console.error(" ___) | (_) | | (_) | | | | |_| | (_| | || __/");
153
- console.error(" |____/ \\___/|_|\\___/|_| |_|\\____|\\__,_|\\__\\___|");
170
+ for (let i = 0; i < bannerLines.length; i++) {
171
+ console.error(`${_c.bold}${bannerColors[i]}${bannerLines[i]}${_c.reset}`);
172
+ }
154
173
  console.error("");
155
- console.error(" Init Setup");
174
+ console.error(` ${_c.dim}${_c.italic}Init Setup${_c.reset}`);
156
175
  console.error("");
157
176
  const configInfo = findConfigFile(options.configPath);
158
177
  if (!configInfo) {
package/dist/inject.js CHANGED
@@ -61,6 +61,38 @@ WHAT IT DOES
61
61
  function log(msg) {
62
62
  process.stderr.write(msg + "\n");
63
63
  }
64
+ var c = {
65
+ reset: "\x1B[0m",
66
+ bold: "\x1B[1m",
67
+ dim: "\x1B[2m",
68
+ italic: "\x1B[3m",
69
+ green: "\x1B[38;2;80;200;120m",
70
+ red: "\x1B[38;2;220;80;80m",
71
+ blue1: "\x1B[38;2;20;50;160m",
72
+ blue2: "\x1B[38;2;40;80;190m",
73
+ blue3: "\x1B[38;2;60;110;215m",
74
+ blue4: "\x1B[38;2;90;140;230m",
75
+ blue5: "\x1B[38;2;130;170;240m",
76
+ blue6: "\x1B[38;2;170;200;250m"
77
+ };
78
+ function printBanner(subtitle) {
79
+ const lines = [
80
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557",
81
+ " \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D",
82
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2557 ",
83
+ " \u255A\u2550\u2550\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u255D ",
84
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557",
85
+ " \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D"
86
+ ];
87
+ const colors = [c.blue1, c.blue2, c.blue3, c.blue4, c.blue5, c.blue6];
88
+ log("");
89
+ for (let i = 0; i < lines.length; i++) {
90
+ log(`${c.bold}${colors[i]}${lines[i]}${c.reset}`);
91
+ }
92
+ log("");
93
+ log(` ${c.dim}${c.italic}${subtitle}${c.reset}`);
94
+ log("");
95
+ }
64
96
  function detectProject() {
65
97
  if (!existsSync(resolve("package.json"))) return false;
66
98
  try {
@@ -96,8 +128,8 @@ function findTsEntryFile() {
96
128
  "server.ts",
97
129
  "main.ts"
98
130
  ];
99
- for (const c of candidates) {
100
- const full = resolve(c);
131
+ for (const c2 of candidates) {
132
+ const full = resolve(c2);
101
133
  if (existsSync(full)) {
102
134
  try {
103
135
  const content = readFileSync(full, "utf-8");
@@ -108,8 +140,8 @@ function findTsEntryFile() {
108
140
  }
109
141
  }
110
142
  }
111
- for (const c of candidates) {
112
- if (existsSync(resolve(c))) return resolve(c);
143
+ for (const c2 of candidates) {
144
+ if (existsSync(resolve(c2))) return resolve(c2);
113
145
  }
114
146
  return null;
115
147
  }
@@ -247,15 +279,7 @@ function showDiff(result) {
247
279
  }
248
280
  async function main() {
249
281
  const opts = parseInjectArgs(process.argv);
250
- log("");
251
- log(" ____ _ ____ _");
252
- log(" / ___| ___ | | ___ _ __ / ___| __ _| |_ ___");
253
- log(" \\___ \\ / _ \\| |/ _ \\| '_ \\| | _ / _` | __/ _ \\");
254
- log(" ___) | (_) | | (_) | | | | |_| | (_| | || __/");
255
- log(" |____/ \\___/|_|\\___/|_| |_|\\____|\\__,_|\\__\\___|");
256
- log("");
257
- log(" Inject SDK");
258
- log("");
282
+ printBanner("Inject SDK");
259
283
  if (!detectProject()) {
260
284
  log(" Could not detect a TypeScript MCP server project.");
261
285
  log(" Make sure you are in a project directory with:");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solongate/proxy",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "description": "MCP security proxy — protect any MCP server with policies, input validation, rate limiting, and audit logging. Zero code changes required.",
5
5
  "type": "module",
6
6
  "bin": {