create-skillet 0.1.1

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/run.js ADDED
@@ -0,0 +1,1948 @@
1
+ // src/run.ts
2
+ import { createRequire } from "module";
3
+ import { confirm as confirm2 } from "@inquirer/prompts";
4
+
5
+ // ../ui/dist/colors.js
6
+ import chalk from "chalk";
7
+ var ember500 = chalk.rgb(232, 116, 59);
8
+ var emberChar = chalk.rgb(156, 68, 28);
9
+ var ember400 = chalk.rgb(240, 146, 90);
10
+ var irisBright = chalk.rgb(167, 139, 250);
11
+ var iris = chalk.rgb(124, 58, 237);
12
+ var basil = chalk.rgb(47, 182, 124);
13
+ var chili = chalk.rgb(229, 72, 77);
14
+ var dim = chalk.dim;
15
+
16
+ // ../ui/dist/header.js
17
+ function renderFullHeader(opts) {
18
+ if (!process.stdout.isTTY || process.env.CI)
19
+ return "";
20
+ const taglinePart = opts.tagline ? `${dim(opts.tagline)}
21
+ ` : "";
22
+ return `
23
+ ${opts.wordmark}
24
+ ${taglinePart}${opts.attributionLine}
25
+
26
+ `;
27
+ }
28
+
29
+ // ../ui/dist/spinner.js
30
+ var CLEAR_LINE = "\r\x1B[2K";
31
+ var SPINNER_CHAR = "\u2819";
32
+ function createTTYSpinner() {
33
+ let _active = false;
34
+ return {
35
+ start(label) {
36
+ _active = true;
37
+ process.stdout.write(`${SPINNER_CHAR} ${label}`);
38
+ },
39
+ succeed(label) {
40
+ if (_active)
41
+ process.stdout.write(CLEAR_LINE);
42
+ _active = false;
43
+ process.stdout.write(`\u2713 ${label}
44
+ `);
45
+ },
46
+ fail(label) {
47
+ if (_active)
48
+ process.stdout.write(CLEAR_LINE);
49
+ _active = false;
50
+ process.stdout.write(`\u2717 ${label}
51
+ `);
52
+ }
53
+ };
54
+ }
55
+ function createNoOpSpinner() {
56
+ return {
57
+ start(_label) {
58
+ },
59
+ succeed(label) {
60
+ process.stdout.write(`${label}
61
+ `);
62
+ },
63
+ fail(label) {
64
+ process.stdout.write(`${label}
65
+ `);
66
+ }
67
+ };
68
+ }
69
+ function createSpinner(isTTY = process.stdout.isTTY ?? false) {
70
+ return isTTY ? createTTYSpinner() : createNoOpSpinner();
71
+ }
72
+
73
+ // ../ui/dist/wordmark.js
74
+ import { Chalk } from "chalk";
75
+
76
+ // ../../node_modules/.pnpm/figlet@1.11.0/node_modules/figlet/dist/node-figlet.mjs
77
+ import * as fs from "fs";
78
+ import * as path from "path";
79
+
80
+ // ../../node_modules/.pnpm/figlet@1.11.0/node_modules/figlet/dist/figlet-C8Ns3Vyn.js
81
+ var LAYOUT = {
82
+ FULL_WIDTH: 0,
83
+ FITTING: 1,
84
+ SMUSHING: 2,
85
+ CONTROLLED_SMUSHING: 3
86
+ };
87
+ var FigletFont = class {
88
+ constructor() {
89
+ this.comment = "";
90
+ this.numChars = 0;
91
+ this.options = {};
92
+ }
93
+ };
94
+ var fontList = [
95
+ "1Row",
96
+ "3-D",
97
+ "3D Diagonal",
98
+ "3D-ASCII",
99
+ "3x5",
100
+ "4Max",
101
+ "5 Line Oblique",
102
+ "AMC 3 Line",
103
+ "AMC 3 Liv1",
104
+ "AMC AAA01",
105
+ "AMC Neko",
106
+ "AMC Razor",
107
+ "AMC Razor2",
108
+ "AMC Slash",
109
+ "AMC Slider",
110
+ "AMC Thin",
111
+ "AMC Tubes",
112
+ "AMC Untitled",
113
+ "ANSI Compact",
114
+ "ANSI Regular",
115
+ "ANSI Shadow",
116
+ "ASCII 12",
117
+ "ASCII 9",
118
+ "ASCII New Roman",
119
+ "Acrobatic",
120
+ "Alligator",
121
+ "Alligator2",
122
+ "Alpha",
123
+ "Alphabet",
124
+ "Arrows",
125
+ "Avatar",
126
+ "B1FF",
127
+ "Babyface Lame",
128
+ "Babyface Leet",
129
+ "Banner",
130
+ "Banner3-D",
131
+ "Banner3",
132
+ "Banner4",
133
+ "Barbwire",
134
+ "Basic",
135
+ "Bear",
136
+ "Bell",
137
+ "Benjamin",
138
+ "Big ASCII 12",
139
+ "Big ASCII 9",
140
+ "Big Chief",
141
+ "Big Money-ne",
142
+ "Big Money-nw",
143
+ "Big Money-se",
144
+ "Big Money-sw",
145
+ "Big Mono 12",
146
+ "Big Mono 9",
147
+ "Big",
148
+ "Bigfig",
149
+ "Binary",
150
+ "Block",
151
+ "Blocks",
152
+ "Bloody",
153
+ "BlurVision ASCII",
154
+ "Bolger",
155
+ "Braced",
156
+ "Bright",
157
+ "Broadway KB",
158
+ "Broadway",
159
+ "Bubble",
160
+ "Bulbhead",
161
+ "Caligraphy",
162
+ "Caligraphy2",
163
+ "Calvin S",
164
+ "Cards",
165
+ "Catwalk",
166
+ "Chiseled",
167
+ "Chunky",
168
+ "Circle",
169
+ "Classy",
170
+ "Coder Mini",
171
+ "Coinstak",
172
+ "Cola",
173
+ "Colossal",
174
+ "Computer",
175
+ "Contessa",
176
+ "Contrast",
177
+ "Cosmike",
178
+ "Cosmike2",
179
+ "Crawford",
180
+ "Crawford2",
181
+ "Crazy",
182
+ "Cricket",
183
+ "Cursive",
184
+ "Cyberlarge",
185
+ "Cybermedium",
186
+ "Cybersmall",
187
+ "Cygnet",
188
+ "DANC4",
189
+ "DOS Rebel",
190
+ "DWhistled",
191
+ "Dancing Font",
192
+ "Decimal",
193
+ "Def Leppard",
194
+ "Delta Corps Priest 1",
195
+ "DiamFont",
196
+ "Diamond",
197
+ "Diet Cola",
198
+ "Digital",
199
+ "Doh",
200
+ "Doom",
201
+ "Dot Matrix",
202
+ "Double Shorts",
203
+ "Double",
204
+ "Dr Pepper",
205
+ "Efti Chess",
206
+ "Efti Font",
207
+ "Efti Italic",
208
+ "Efti Piti",
209
+ "Efti Robot",
210
+ "Efti Wall",
211
+ "Efti Water",
212
+ "Electronic",
213
+ "Elite",
214
+ "Emboss 2",
215
+ "Emboss",
216
+ "Epic",
217
+ "Fender",
218
+ "Filter",
219
+ "Fire Font-k",
220
+ "Fire Font-s",
221
+ "Flipped",
222
+ "Flower Power",
223
+ "Font Font",
224
+ "Four Tops",
225
+ "Fraktur",
226
+ "Fun Face",
227
+ "Fun Faces",
228
+ "Future Smooth",
229
+ "Future Thin",
230
+ "Future",
231
+ "Fuzzy",
232
+ "Georgi16",
233
+ "Georgia11",
234
+ "Ghost",
235
+ "Ghoulish",
236
+ "Glenyn",
237
+ "Goofy",
238
+ "Gothic",
239
+ "Graceful",
240
+ "Gradient",
241
+ "Graffiti",
242
+ "Greek",
243
+ "Heart Left",
244
+ "Heart Right",
245
+ "Henry 3D",
246
+ "Hex",
247
+ "Hieroglyphs",
248
+ "Hollywood",
249
+ "Horizontal Left",
250
+ "Horizontal Right",
251
+ "ICL-1900",
252
+ "Impossible",
253
+ "Invita",
254
+ "Isometric1",
255
+ "Isometric2",
256
+ "Isometric3",
257
+ "Isometric4",
258
+ "Italic",
259
+ "Ivrit",
260
+ "JS Block Letters",
261
+ "JS Bracket Letters",
262
+ "JS Capital Curves",
263
+ "JS Cursive",
264
+ "JS Stick Letters",
265
+ "Jacky",
266
+ "Jazmine",
267
+ "Jerusalem",
268
+ "Katakana",
269
+ "Kban",
270
+ "Keyboard",
271
+ "Knob",
272
+ "Konto Slant",
273
+ "Konto",
274
+ "LCD",
275
+ "Larry 3D 2",
276
+ "Larry 3D",
277
+ "Lean",
278
+ "Letter",
279
+ "Letters",
280
+ "Lil Devil",
281
+ "Line Blocks",
282
+ "Linux",
283
+ "Lockergnome",
284
+ "Madrid",
285
+ "Marquee",
286
+ "Maxfour",
287
+ "Merlin1",
288
+ "Merlin2",
289
+ "Mike",
290
+ "Mini",
291
+ "Mirror",
292
+ "Mnemonic",
293
+ "Modular",
294
+ "Mono 12",
295
+ "Mono 9",
296
+ "Morse",
297
+ "Morse2",
298
+ "Moscow",
299
+ "Mshebrew210",
300
+ "Muzzle",
301
+ "NScript",
302
+ "NT Greek",
303
+ "NV Script",
304
+ "Nancyj-Fancy",
305
+ "Nancyj-Improved",
306
+ "Nancyj-Underlined",
307
+ "Nancyj",
308
+ "Nipples",
309
+ "O8",
310
+ "OS2",
311
+ "Octal",
312
+ "Ogre",
313
+ "Old Banner",
314
+ "Pagga",
315
+ "Patorjk's Cheese",
316
+ "Patorjk-HeX",
317
+ "Pawp",
318
+ "Peaks Slant",
319
+ "Peaks",
320
+ "Pebbles",
321
+ "Pepper",
322
+ "Poison",
323
+ "Puffy",
324
+ "Puzzle",
325
+ "Pyramid",
326
+ "Rammstein",
327
+ "Rebel",
328
+ "Rectangles",
329
+ "Red Phoenix",
330
+ "Relief",
331
+ "Relief2",
332
+ "Reverse",
333
+ "Roman",
334
+ "Rot13",
335
+ "Rotated",
336
+ "Rounded",
337
+ "Rowan Cap",
338
+ "Rozzo",
339
+ "RubiFont",
340
+ "Runic",
341
+ "Runyc",
342
+ "S Blood",
343
+ "SL Script",
344
+ "Santa Clara",
345
+ "Script",
346
+ "Serifcap",
347
+ "Shaded Blocky",
348
+ "Shadow",
349
+ "Shimrod",
350
+ "Short",
351
+ "Slant Relief",
352
+ "Slant",
353
+ "Slide",
354
+ "Small ASCII 12",
355
+ "Small ASCII 9",
356
+ "Small Block",
357
+ "Small Braille",
358
+ "Small Caps",
359
+ "Small Isometric1",
360
+ "Small Keyboard",
361
+ "Small Mono 12",
362
+ "Small Mono 9",
363
+ "Small Poison",
364
+ "Small Script",
365
+ "Small Shadow",
366
+ "Small Slant",
367
+ "Small Tengwar",
368
+ "Small",
369
+ "Soft",
370
+ "Speed",
371
+ "Spliff",
372
+ "Stacey",
373
+ "Stampate",
374
+ "Stampatello",
375
+ "Standard",
376
+ "Star Strips",
377
+ "Star Wars",
378
+ "Stellar",
379
+ "Stforek",
380
+ "Stick Letters",
381
+ "Stop",
382
+ "Straight",
383
+ "Stronger Than All",
384
+ "Sub-Zero",
385
+ "Swamp Land",
386
+ "Swan",
387
+ "Sweet",
388
+ "THIS",
389
+ "Tanja",
390
+ "Tengwar",
391
+ "Term",
392
+ "Terrace",
393
+ "Test1",
394
+ "The Edge",
395
+ "Thick",
396
+ "Thin",
397
+ "Thorned",
398
+ "Three Point",
399
+ "Ticks Slant",
400
+ "Ticks",
401
+ "Tiles",
402
+ "Tinker-Toy",
403
+ "Tmplr",
404
+ "Tombstone",
405
+ "Train",
406
+ "Trek",
407
+ "Tsalagi",
408
+ "Tubular",
409
+ "Twisted",
410
+ "Two Point",
411
+ "USA Flag",
412
+ "Univers",
413
+ "Upside Down Text",
414
+ "Varsity",
415
+ "Wavescape",
416
+ "Wavy",
417
+ "Weird",
418
+ "Wet Letter",
419
+ "Whimsy",
420
+ "WideTerm",
421
+ "Wow",
422
+ "miniwi"
423
+ ];
424
+ var renamedFonts = {
425
+ "ANSI-Compact": "ANSI Compact"
426
+ };
427
+ var getFontName = (name) => {
428
+ return renamedFonts[name] ? renamedFonts[name] : name;
429
+ };
430
+ function escapeRegExpChar(char) {
431
+ const specialChars = /[.*+?^${}()|[\]\\]/;
432
+ return specialChars.test(char) ? "\\" + char : char;
433
+ }
434
+ var figlet = (() => {
435
+ const { FULL_WIDTH = 0, FITTING, SMUSHING, CONTROLLED_SMUSHING } = LAYOUT;
436
+ const figFonts = {};
437
+ const figDefaults = {
438
+ font: "Standard",
439
+ fontPath: "./fonts",
440
+ fetchFontIfMissing: true
441
+ };
442
+ function removeEndChar(line, lineNum, fontHeight) {
443
+ const endChar = escapeRegExpChar(line.trim().slice(-1)) || "@";
444
+ const endCharRegEx = lineNum === fontHeight - 1 ? new RegExp(endChar + endChar + "?\\s*$") : new RegExp(endChar + "\\s*$");
445
+ return line.replace(endCharRegEx, "");
446
+ }
447
+ function getSmushingRules(oldLayout = -1, newLayout = null) {
448
+ let rules = {};
449
+ let val;
450
+ let codes = [
451
+ [16384, "vLayout", SMUSHING],
452
+ [8192, "vLayout", FITTING],
453
+ [4096, "vRule5", true],
454
+ [2048, "vRule4", true],
455
+ [1024, "vRule3", true],
456
+ [512, "vRule2", true],
457
+ [256, "vRule1", true],
458
+ [128, "hLayout", SMUSHING],
459
+ [64, "hLayout", FITTING],
460
+ [32, "hRule6", true],
461
+ [16, "hRule5", true],
462
+ [8, "hRule4", true],
463
+ [4, "hRule3", true],
464
+ [2, "hRule2", true],
465
+ [1, "hRule1", true]
466
+ ];
467
+ val = newLayout !== null ? newLayout : oldLayout;
468
+ for (const [code, rule, value] of codes) {
469
+ if (val >= code) {
470
+ val -= code;
471
+ if (rules[rule] === void 0) {
472
+ rules[rule] = value;
473
+ }
474
+ } else if (rule !== "vLayout" && rule !== "hLayout") {
475
+ rules[rule] = false;
476
+ }
477
+ }
478
+ if (typeof rules["hLayout"] === "undefined") {
479
+ if (oldLayout === 0) {
480
+ rules["hLayout"] = FITTING;
481
+ } else if (oldLayout === -1) {
482
+ rules["hLayout"] = FULL_WIDTH;
483
+ } else {
484
+ if (rules["hRule1"] || rules["hRule2"] || rules["hRule3"] || rules["hRule4"] || rules["hRule5"] || rules["hRule6"]) {
485
+ rules["hLayout"] = CONTROLLED_SMUSHING;
486
+ } else {
487
+ rules["hLayout"] = SMUSHING;
488
+ }
489
+ }
490
+ } else if (rules["hLayout"] === SMUSHING) {
491
+ if (rules["hRule1"] || rules["hRule2"] || rules["hRule3"] || rules["hRule4"] || rules["hRule5"] || rules["hRule6"]) {
492
+ rules["hLayout"] = CONTROLLED_SMUSHING;
493
+ }
494
+ }
495
+ if (typeof rules["vLayout"] === "undefined") {
496
+ if (rules["vRule1"] || rules["vRule2"] || rules["vRule3"] || rules["vRule4"] || rules["vRule5"]) {
497
+ rules["vLayout"] = CONTROLLED_SMUSHING;
498
+ } else {
499
+ rules["vLayout"] = FULL_WIDTH;
500
+ }
501
+ } else if (rules["vLayout"] === SMUSHING) {
502
+ if (rules["vRule1"] || rules["vRule2"] || rules["vRule3"] || rules["vRule4"] || rules["vRule5"]) {
503
+ rules["vLayout"] = CONTROLLED_SMUSHING;
504
+ }
505
+ }
506
+ return rules;
507
+ }
508
+ function hRule1_Smush(ch1, ch2, hardBlank = "") {
509
+ if (ch1 === ch2 && ch1 !== hardBlank) {
510
+ return ch1;
511
+ }
512
+ return false;
513
+ }
514
+ function hRule2_Smush(ch1, ch2) {
515
+ let rule2Str = "|/\\[]{}()<>";
516
+ if (ch1 === "_") {
517
+ if (rule2Str.indexOf(ch2) !== -1) {
518
+ return ch2;
519
+ }
520
+ } else if (ch2 === "_") {
521
+ if (rule2Str.indexOf(ch1) !== -1) {
522
+ return ch1;
523
+ }
524
+ }
525
+ return false;
526
+ }
527
+ function hRule3_Smush(ch1, ch2) {
528
+ let rule3Classes = "| /\\ [] {} () <>";
529
+ let r3_pos1 = rule3Classes.indexOf(ch1);
530
+ let r3_pos2 = rule3Classes.indexOf(ch2);
531
+ if (r3_pos1 !== -1 && r3_pos2 !== -1) {
532
+ if (r3_pos1 !== r3_pos2 && Math.abs(r3_pos1 - r3_pos2) !== 1) {
533
+ const startPos = Math.max(r3_pos1, r3_pos2);
534
+ const endPos = startPos + 1;
535
+ return rule3Classes.substring(startPos, endPos);
536
+ }
537
+ }
538
+ return false;
539
+ }
540
+ function hRule4_Smush(ch1, ch2) {
541
+ let rule4Str = "[] {} ()";
542
+ let r4_pos1 = rule4Str.indexOf(ch1);
543
+ let r4_pos2 = rule4Str.indexOf(ch2);
544
+ if (r4_pos1 !== -1 && r4_pos2 !== -1) {
545
+ if (Math.abs(r4_pos1 - r4_pos2) <= 1) {
546
+ return "|";
547
+ }
548
+ }
549
+ return false;
550
+ }
551
+ function hRule5_Smush(ch1, ch2) {
552
+ const patterns = {
553
+ "/\\": "|",
554
+ "\\/": "Y",
555
+ "><": "X"
556
+ };
557
+ return patterns[ch1 + ch2] || false;
558
+ }
559
+ function hRule6_Smush(ch1, ch2, hardBlank = "") {
560
+ if (ch1 === hardBlank && ch2 === hardBlank) {
561
+ return hardBlank;
562
+ }
563
+ return false;
564
+ }
565
+ function vRule1_Smush(ch1, ch2) {
566
+ if (ch1 === ch2) {
567
+ return ch1;
568
+ }
569
+ return false;
570
+ }
571
+ function vRule2_Smush(ch1, ch2) {
572
+ return hRule2_Smush(ch1, ch2);
573
+ }
574
+ function vRule3_Smush(ch1, ch2) {
575
+ return hRule3_Smush(ch1, ch2);
576
+ }
577
+ function vRule4_Smush(ch1, ch2) {
578
+ if (ch1 === "-" && ch2 === "_" || ch1 === "_" && ch2 === "-") {
579
+ return "=";
580
+ }
581
+ return false;
582
+ }
583
+ function vRule5_Smush(ch1, ch2) {
584
+ if (ch1 === "|" && ch2 === "|") {
585
+ return "|";
586
+ }
587
+ return false;
588
+ }
589
+ function uni_Smush(ch1, ch2, hardBlank) {
590
+ if (ch2 === " " || ch2 === "") {
591
+ return ch1;
592
+ } else if (ch2 === hardBlank && ch1 !== " ") {
593
+ return ch1;
594
+ } else {
595
+ return ch2;
596
+ }
597
+ }
598
+ function canVerticalSmush(txt1, txt2, opts) {
599
+ if (opts.fittingRules && opts.fittingRules.vLayout === FULL_WIDTH) {
600
+ return "invalid";
601
+ }
602
+ let ii, len = Math.min(txt1.length, txt2.length), ch1, ch2, endSmush = false, validSmush;
603
+ if (len === 0) {
604
+ return "invalid";
605
+ }
606
+ for (ii = 0; ii < len; ii++) {
607
+ ch1 = txt1.substring(ii, ii + 1);
608
+ ch2 = txt2.substring(ii, ii + 1);
609
+ if (ch1 !== " " && ch2 !== " ") {
610
+ if (opts.fittingRules && opts.fittingRules.vLayout === FITTING) {
611
+ return "invalid";
612
+ } else if (opts.fittingRules && opts.fittingRules.vLayout === SMUSHING) {
613
+ return "end";
614
+ } else {
615
+ if (vRule5_Smush(ch1, ch2)) {
616
+ endSmush = endSmush || false;
617
+ continue;
618
+ }
619
+ validSmush = false;
620
+ validSmush = opts.fittingRules && opts.fittingRules.vRule1 ? vRule1_Smush(ch1, ch2) : validSmush;
621
+ validSmush = !validSmush && opts.fittingRules && opts.fittingRules.vRule2 ? vRule2_Smush(ch1, ch2) : validSmush;
622
+ validSmush = !validSmush && opts.fittingRules && opts.fittingRules.vRule3 ? vRule3_Smush(ch1, ch2) : validSmush;
623
+ validSmush = !validSmush && opts.fittingRules && opts.fittingRules.vRule4 ? vRule4_Smush(ch1, ch2) : validSmush;
624
+ endSmush = true;
625
+ if (!validSmush) {
626
+ return "invalid";
627
+ }
628
+ }
629
+ }
630
+ }
631
+ if (endSmush) {
632
+ return "end";
633
+ } else {
634
+ return "valid";
635
+ }
636
+ }
637
+ function getVerticalSmushDist(lines1, lines2, opts) {
638
+ let maxDist = lines1.length;
639
+ let len1 = lines1.length;
640
+ let subLines1, subLines2, slen;
641
+ let curDist = 1;
642
+ let ii, ret, result;
643
+ while (curDist <= maxDist) {
644
+ subLines1 = lines1.slice(Math.max(0, len1 - curDist), len1);
645
+ subLines2 = lines2.slice(0, Math.min(maxDist, curDist));
646
+ slen = subLines2.length;
647
+ result = "";
648
+ for (ii = 0; ii < slen; ii++) {
649
+ ret = canVerticalSmush(subLines1[ii], subLines2[ii], opts);
650
+ if (ret === "end") {
651
+ result = ret;
652
+ } else if (ret === "invalid") {
653
+ result = ret;
654
+ break;
655
+ } else {
656
+ if (result === "") {
657
+ result = "valid";
658
+ }
659
+ }
660
+ }
661
+ if (result === "invalid") {
662
+ curDist--;
663
+ break;
664
+ }
665
+ if (result === "end") {
666
+ break;
667
+ }
668
+ if (result === "valid") {
669
+ curDist++;
670
+ }
671
+ }
672
+ return Math.min(maxDist, curDist);
673
+ }
674
+ function verticallySmushLines(line1, line2, opts) {
675
+ let ii, len = Math.min(line1.length, line2.length);
676
+ let ch1, ch2, result = "", validSmush;
677
+ const fittingRules = opts.fittingRules || {};
678
+ for (ii = 0; ii < len; ii++) {
679
+ ch1 = line1.substring(ii, ii + 1);
680
+ ch2 = line2.substring(ii, ii + 1);
681
+ if (ch1 !== " " && ch2 !== " ") {
682
+ if (fittingRules.vLayout === FITTING) {
683
+ result += uni_Smush(ch1, ch2);
684
+ } else if (fittingRules.vLayout === SMUSHING) {
685
+ result += uni_Smush(ch1, ch2);
686
+ } else {
687
+ validSmush = false;
688
+ validSmush = fittingRules.vRule5 ? vRule5_Smush(ch1, ch2) : validSmush;
689
+ validSmush = !validSmush && fittingRules.vRule1 ? vRule1_Smush(ch1, ch2) : validSmush;
690
+ validSmush = !validSmush && fittingRules.vRule2 ? vRule2_Smush(ch1, ch2) : validSmush;
691
+ validSmush = !validSmush && fittingRules.vRule3 ? vRule3_Smush(ch1, ch2) : validSmush;
692
+ validSmush = !validSmush && fittingRules.vRule4 ? vRule4_Smush(ch1, ch2) : validSmush;
693
+ result += validSmush;
694
+ }
695
+ } else {
696
+ result += uni_Smush(ch1, ch2);
697
+ }
698
+ }
699
+ return result;
700
+ }
701
+ function verticalSmush(lines1, lines2, overlap, opts) {
702
+ let len1 = lines1.length;
703
+ let len2 = lines2.length;
704
+ let piece1 = lines1.slice(0, Math.max(0, len1 - overlap));
705
+ let piece2_1 = lines1.slice(Math.max(0, len1 - overlap), len1);
706
+ let piece2_2 = lines2.slice(0, Math.min(overlap, len2));
707
+ let ii, len, line, piece2 = [], piece3;
708
+ len = piece2_1.length;
709
+ for (ii = 0; ii < len; ii++) {
710
+ if (ii >= len2) {
711
+ line = piece2_1[ii];
712
+ } else {
713
+ line = verticallySmushLines(piece2_1[ii], piece2_2[ii], opts);
714
+ }
715
+ piece2.push(line);
716
+ }
717
+ piece3 = lines2.slice(Math.min(overlap, len2), len2);
718
+ return [...piece1, ...piece2, ...piece3];
719
+ }
720
+ function padLines(lines, numSpaces) {
721
+ const padding = " ".repeat(numSpaces);
722
+ return lines.map((line) => line + padding);
723
+ }
724
+ function smushVerticalFigLines(output, lines, opts) {
725
+ let len1 = output[0].length;
726
+ let len2 = lines[0].length;
727
+ let overlap;
728
+ if (len1 > len2) {
729
+ lines = padLines(lines, len1 - len2);
730
+ } else if (len2 > len1) {
731
+ output = padLines(output, len2 - len1);
732
+ }
733
+ overlap = getVerticalSmushDist(output, lines, opts);
734
+ return verticalSmush(output, lines, overlap, opts);
735
+ }
736
+ function getHorizontalSmushLength(txt1, txt2, opts) {
737
+ const fittingRules = opts.fittingRules || {};
738
+ if (fittingRules.hLayout === FULL_WIDTH) {
739
+ return 0;
740
+ }
741
+ let ii, len1 = txt1.length, len2 = txt2.length;
742
+ let maxDist = len1;
743
+ let curDist = 1;
744
+ let breakAfter = false;
745
+ let seg1, seg2, ch1, ch2;
746
+ if (len1 === 0) {
747
+ return 0;
748
+ }
749
+ distCal: while (curDist <= maxDist) {
750
+ const seg1StartPos = len1 - curDist;
751
+ seg1 = txt1.substring(seg1StartPos, seg1StartPos + curDist);
752
+ seg2 = txt2.substring(0, Math.min(curDist, len2));
753
+ for (ii = 0; ii < Math.min(curDist, len2); ii++) {
754
+ ch1 = seg1.substring(ii, ii + 1);
755
+ ch2 = seg2.substring(ii, ii + 1);
756
+ if (ch1 !== " " && ch2 !== " ") {
757
+ if (fittingRules.hLayout === FITTING) {
758
+ curDist = curDist - 1;
759
+ break distCal;
760
+ } else if (fittingRules.hLayout === SMUSHING) {
761
+ if (ch1 === opts.hardBlank || ch2 === opts.hardBlank) {
762
+ curDist = curDist - 1;
763
+ }
764
+ break distCal;
765
+ } else {
766
+ breakAfter = true;
767
+ const validSmush = fittingRules.hRule1 && hRule1_Smush(ch1, ch2, opts.hardBlank) || fittingRules.hRule2 && hRule2_Smush(ch1, ch2) || fittingRules.hRule3 && hRule3_Smush(ch1, ch2) || fittingRules.hRule4 && hRule4_Smush(ch1, ch2) || fittingRules.hRule5 && hRule5_Smush(ch1, ch2) || fittingRules.hRule6 && hRule6_Smush(ch1, ch2, opts.hardBlank);
768
+ if (!validSmush) {
769
+ curDist = curDist - 1;
770
+ break distCal;
771
+ }
772
+ }
773
+ }
774
+ }
775
+ if (breakAfter) {
776
+ break;
777
+ }
778
+ curDist++;
779
+ }
780
+ return Math.min(maxDist, curDist);
781
+ }
782
+ function horizontalSmush(textBlock1, textBlock2, overlap, opts) {
783
+ let ii, jj, outputFig = [], overlapStart, piece1, piece2, piece3, len1, len2, txt1, txt2;
784
+ const fittingRules = opts.fittingRules || {};
785
+ if (typeof opts.height !== "number") {
786
+ throw new Error("height is not defined.");
787
+ }
788
+ for (ii = 0; ii < opts.height; ii++) {
789
+ txt1 = textBlock1[ii];
790
+ txt2 = textBlock2[ii];
791
+ len1 = txt1.length;
792
+ len2 = txt2.length;
793
+ overlapStart = len1 - overlap;
794
+ piece1 = txt1.slice(0, Math.max(0, overlapStart));
795
+ piece2 = "";
796
+ const seg1StartPos = Math.max(0, len1 - overlap);
797
+ let seg1 = txt1.substring(seg1StartPos, seg1StartPos + overlap);
798
+ let seg2 = txt2.substring(0, Math.min(overlap, len2));
799
+ for (jj = 0; jj < overlap; jj++) {
800
+ let ch1 = jj < len1 ? seg1.substring(jj, jj + 1) : " ";
801
+ let ch2 = jj < len2 ? seg2.substring(jj, jj + 1) : " ";
802
+ if (ch1 !== " " && ch2 !== " ") {
803
+ if (fittingRules.hLayout === FITTING || fittingRules.hLayout === SMUSHING) {
804
+ piece2 += uni_Smush(ch1, ch2, opts.hardBlank);
805
+ } else {
806
+ const nextCh = fittingRules.hRule1 && hRule1_Smush(ch1, ch2, opts.hardBlank) || fittingRules.hRule2 && hRule2_Smush(ch1, ch2) || fittingRules.hRule3 && hRule3_Smush(ch1, ch2) || fittingRules.hRule4 && hRule4_Smush(ch1, ch2) || fittingRules.hRule5 && hRule5_Smush(ch1, ch2) || fittingRules.hRule6 && hRule6_Smush(ch1, ch2, opts.hardBlank) || uni_Smush(ch1, ch2, opts.hardBlank);
807
+ piece2 += nextCh;
808
+ }
809
+ } else {
810
+ piece2 += uni_Smush(ch1, ch2, opts.hardBlank);
811
+ }
812
+ }
813
+ if (overlap >= len2) {
814
+ piece3 = "";
815
+ } else {
816
+ piece3 = txt2.substring(overlap, overlap + Math.max(0, len2 - overlap));
817
+ }
818
+ outputFig[ii] = piece1 + piece2 + piece3;
819
+ }
820
+ return outputFig;
821
+ }
822
+ function newFigChar(len) {
823
+ return new Array(len).fill("");
824
+ }
825
+ const figLinesWidth = function(textLines) {
826
+ return Math.max(...textLines.map((line) => line.length));
827
+ };
828
+ function joinFigArray(array, len, opts) {
829
+ return array.reduce(function(acc, data) {
830
+ return horizontalSmush(acc, data.fig, data.overlap || 0, opts);
831
+ }, newFigChar(len));
832
+ }
833
+ function breakWord(figChars, len, opts) {
834
+ for (let i = figChars.length - 1; i > 0; i--) {
835
+ const w = joinFigArray(figChars.slice(0, i), len, opts);
836
+ if (figLinesWidth(w) <= opts.width) {
837
+ return {
838
+ outputFigText: w,
839
+ chars: figChars.slice(i)
840
+ };
841
+ }
842
+ }
843
+ return { outputFigText: newFigChar(len), chars: figChars };
844
+ }
845
+ function generateFigTextLines(txt, figChars, opts) {
846
+ let charIndex, figChar, overlap = 0, row, outputFigText, len, height = opts.height, outputFigLines = [], maxWidth, nextFigChars = {
847
+ chars: [],
848
+ // list of characters is used to break in the middle of the word when word is longer
849
+ overlap
850
+ // chars is array of characters with {fig, overlap} and overlap is for whole word
851
+ }, figWords = [], char, isSpace, textFigWord, textFigLine, tmpBreak;
852
+ if (typeof height !== "number") {
853
+ throw new Error("height is not defined.");
854
+ }
855
+ outputFigText = newFigChar(height);
856
+ const fittingRules = opts.fittingRules || {};
857
+ if (opts.printDirection === 1) {
858
+ txt = txt.split("").reverse().join("");
859
+ }
860
+ len = txt.length;
861
+ for (charIndex = 0; charIndex < len; charIndex++) {
862
+ char = txt.substring(charIndex, charIndex + 1);
863
+ isSpace = char.match(/\s/);
864
+ figChar = figChars[char.charCodeAt(0)];
865
+ textFigLine = null;
866
+ if (figChar) {
867
+ if (fittingRules.hLayout !== FULL_WIDTH) {
868
+ overlap = 1e4;
869
+ for (row = 0; row < height; row++) {
870
+ overlap = Math.min(
871
+ overlap,
872
+ getHorizontalSmushLength(outputFigText[row], figChar[row], opts)
873
+ );
874
+ }
875
+ overlap = overlap === 1e4 ? 0 : overlap;
876
+ }
877
+ if (opts.width > 0) {
878
+ if (opts.whitespaceBreak) {
879
+ textFigWord = joinFigArray(
880
+ nextFigChars.chars.concat([
881
+ {
882
+ fig: figChar,
883
+ overlap
884
+ }
885
+ ]),
886
+ height,
887
+ opts
888
+ );
889
+ textFigLine = joinFigArray(
890
+ figWords.concat([
891
+ {
892
+ fig: textFigWord,
893
+ overlap: nextFigChars.overlap
894
+ }
895
+ ]),
896
+ height,
897
+ opts
898
+ );
899
+ maxWidth = figLinesWidth(textFigLine);
900
+ } else {
901
+ textFigLine = horizontalSmush(
902
+ outputFigText,
903
+ figChar,
904
+ overlap,
905
+ opts
906
+ );
907
+ maxWidth = figLinesWidth(textFigLine);
908
+ }
909
+ if (maxWidth >= opts.width && charIndex > 0) {
910
+ if (opts.whitespaceBreak) {
911
+ outputFigText = joinFigArray(figWords.slice(0, -1), height, opts);
912
+ if (figWords.length > 1) {
913
+ outputFigLines.push(outputFigText);
914
+ outputFigText = newFigChar(height);
915
+ }
916
+ figWords = [];
917
+ } else {
918
+ outputFigLines.push(outputFigText);
919
+ outputFigText = newFigChar(height);
920
+ }
921
+ }
922
+ }
923
+ if (opts.width > 0 && opts.whitespaceBreak) {
924
+ if (!isSpace || charIndex === len - 1) {
925
+ nextFigChars.chars.push({ fig: figChar, overlap });
926
+ }
927
+ if (isSpace || charIndex === len - 1) {
928
+ tmpBreak = null;
929
+ while (true) {
930
+ textFigLine = joinFigArray(nextFigChars.chars, height, opts);
931
+ maxWidth = figLinesWidth(textFigLine);
932
+ if (maxWidth >= opts.width) {
933
+ tmpBreak = breakWord(nextFigChars.chars, height, opts);
934
+ nextFigChars = { chars: tmpBreak.chars };
935
+ outputFigLines.push(tmpBreak.outputFigText);
936
+ } else {
937
+ break;
938
+ }
939
+ }
940
+ if (maxWidth > 0) {
941
+ if (tmpBreak) {
942
+ figWords.push({ fig: textFigLine, overlap: 1 });
943
+ } else {
944
+ figWords.push({
945
+ fig: textFigLine,
946
+ overlap: nextFigChars.overlap
947
+ });
948
+ }
949
+ }
950
+ if (isSpace) {
951
+ figWords.push({ fig: figChar, overlap });
952
+ outputFigText = newFigChar(height);
953
+ }
954
+ if (charIndex === len - 1) {
955
+ outputFigText = joinFigArray(figWords, height, opts);
956
+ }
957
+ nextFigChars = {
958
+ chars: [],
959
+ overlap
960
+ };
961
+ continue;
962
+ }
963
+ }
964
+ outputFigText = horizontalSmush(outputFigText, figChar, overlap, opts);
965
+ }
966
+ }
967
+ if (figLinesWidth(outputFigText) > 0) {
968
+ outputFigLines.push(outputFigText);
969
+ }
970
+ if (!opts.showHardBlanks) {
971
+ outputFigLines.forEach(function(outputFigText2) {
972
+ len = outputFigText2.length;
973
+ for (row = 0; row < len; row++) {
974
+ outputFigText2[row] = outputFigText2[row].replace(
975
+ new RegExp("\\" + opts.hardBlank, "g"),
976
+ " "
977
+ );
978
+ }
979
+ });
980
+ }
981
+ if (txt === "" && outputFigLines.length === 0) {
982
+ outputFigLines.push(new Array(height).fill(""));
983
+ }
984
+ return outputFigLines;
985
+ }
986
+ const getHorizontalFittingRules = function(layout, options) {
987
+ let params;
988
+ const fittingRules = options.fittingRules || {};
989
+ if (layout === "default") {
990
+ params = {
991
+ hLayout: fittingRules.hLayout,
992
+ hRule1: fittingRules.hRule1,
993
+ hRule2: fittingRules.hRule2,
994
+ hRule3: fittingRules.hRule3,
995
+ hRule4: fittingRules.hRule4,
996
+ hRule5: fittingRules.hRule5,
997
+ hRule6: fittingRules.hRule6
998
+ };
999
+ } else if (layout === "full") {
1000
+ params = {
1001
+ hLayout: FULL_WIDTH,
1002
+ hRule1: false,
1003
+ hRule2: false,
1004
+ hRule3: false,
1005
+ hRule4: false,
1006
+ hRule5: false,
1007
+ hRule6: false
1008
+ };
1009
+ } else if (layout === "fitted") {
1010
+ params = {
1011
+ hLayout: FITTING,
1012
+ hRule1: false,
1013
+ hRule2: false,
1014
+ hRule3: false,
1015
+ hRule4: false,
1016
+ hRule5: false,
1017
+ hRule6: false
1018
+ };
1019
+ } else if (layout === "controlled smushing") {
1020
+ params = {
1021
+ hLayout: CONTROLLED_SMUSHING,
1022
+ hRule1: true,
1023
+ hRule2: true,
1024
+ hRule3: true,
1025
+ hRule4: true,
1026
+ hRule5: true,
1027
+ hRule6: true
1028
+ };
1029
+ } else if (layout === "universal smushing") {
1030
+ params = {
1031
+ hLayout: SMUSHING,
1032
+ hRule1: false,
1033
+ hRule2: false,
1034
+ hRule3: false,
1035
+ hRule4: false,
1036
+ hRule5: false,
1037
+ hRule6: false
1038
+ };
1039
+ } else {
1040
+ return;
1041
+ }
1042
+ return params;
1043
+ };
1044
+ const getVerticalFittingRules = function(layout, options) {
1045
+ let params = {};
1046
+ const fittingRules = options.fittingRules || {};
1047
+ if (layout === "default") {
1048
+ params = {
1049
+ vLayout: fittingRules.vLayout,
1050
+ vRule1: fittingRules.vRule1,
1051
+ vRule2: fittingRules.vRule2,
1052
+ vRule3: fittingRules.vRule3,
1053
+ vRule4: fittingRules.vRule4,
1054
+ vRule5: fittingRules.vRule5
1055
+ };
1056
+ } else if (layout === "full") {
1057
+ params = {
1058
+ vLayout: FULL_WIDTH,
1059
+ vRule1: false,
1060
+ vRule2: false,
1061
+ vRule3: false,
1062
+ vRule4: false,
1063
+ vRule5: false
1064
+ };
1065
+ } else if (layout === "fitted") {
1066
+ params = {
1067
+ vLayout: FITTING,
1068
+ vRule1: false,
1069
+ vRule2: false,
1070
+ vRule3: false,
1071
+ vRule4: false,
1072
+ vRule5: false
1073
+ };
1074
+ } else if (layout === "controlled smushing") {
1075
+ params = {
1076
+ vLayout: CONTROLLED_SMUSHING,
1077
+ vRule1: true,
1078
+ vRule2: true,
1079
+ vRule3: true,
1080
+ vRule4: true,
1081
+ vRule5: true
1082
+ };
1083
+ } else if (layout === "universal smushing") {
1084
+ params = {
1085
+ vLayout: SMUSHING,
1086
+ vRule1: false,
1087
+ vRule2: false,
1088
+ vRule3: false,
1089
+ vRule4: false,
1090
+ vRule5: false
1091
+ };
1092
+ } else {
1093
+ return;
1094
+ }
1095
+ return params;
1096
+ };
1097
+ const generateText = function(fontName, options, txt) {
1098
+ txt = txt.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
1099
+ const actualFontName = getFontName(fontName);
1100
+ let lines = txt.split("\n");
1101
+ let figLines = [];
1102
+ let ii, len, output;
1103
+ len = lines.length;
1104
+ for (ii = 0; ii < len; ii++) {
1105
+ figLines = figLines.concat(
1106
+ generateFigTextLines(lines[ii], figFonts[actualFontName], options)
1107
+ );
1108
+ }
1109
+ len = figLines.length;
1110
+ output = figLines[0];
1111
+ for (ii = 1; ii < len; ii++) {
1112
+ output = smushVerticalFigLines(output, figLines[ii], options);
1113
+ }
1114
+ return output ? output.join("\n") : "";
1115
+ };
1116
+ function _reworkFontOpts(fontMeta, options) {
1117
+ let myOpts;
1118
+ if (typeof structuredClone !== "undefined") {
1119
+ myOpts = structuredClone(fontMeta);
1120
+ } else {
1121
+ myOpts = JSON.parse(JSON.stringify(fontMeta));
1122
+ }
1123
+ myOpts.showHardBlanks = options.showHardBlanks || false;
1124
+ myOpts.width = options.width || -1;
1125
+ myOpts.whitespaceBreak = options.whitespaceBreak || false;
1126
+ if (options.horizontalLayout) {
1127
+ const params = getHorizontalFittingRules(
1128
+ options.horizontalLayout,
1129
+ fontMeta
1130
+ );
1131
+ if (params) {
1132
+ Object.assign(myOpts.fittingRules, params);
1133
+ }
1134
+ }
1135
+ if (options.verticalLayout) {
1136
+ const params = getVerticalFittingRules(options.verticalLayout, fontMeta);
1137
+ if (params) {
1138
+ Object.assign(myOpts.fittingRules, params);
1139
+ }
1140
+ }
1141
+ myOpts.printDirection = options.printDirection !== null && options.printDirection !== void 0 ? options.printDirection : fontMeta.printDirection;
1142
+ return myOpts;
1143
+ }
1144
+ const me = async function(txt, optionsOrFontOrCallback, callback) {
1145
+ return me.text(txt, optionsOrFontOrCallback, callback);
1146
+ };
1147
+ me.text = async function(txt, optionsOrFontOrCallback, callback) {
1148
+ txt = txt + "";
1149
+ let options, next;
1150
+ if (typeof optionsOrFontOrCallback === "function") {
1151
+ next = optionsOrFontOrCallback;
1152
+ options = { font: figDefaults.font };
1153
+ } else if (typeof optionsOrFontOrCallback === "string") {
1154
+ options = { font: optionsOrFontOrCallback };
1155
+ next = callback;
1156
+ } else if (optionsOrFontOrCallback) {
1157
+ options = optionsOrFontOrCallback;
1158
+ next = callback;
1159
+ } else {
1160
+ options = { font: figDefaults.font };
1161
+ next = callback;
1162
+ }
1163
+ const fontName = options.font || figDefaults.font;
1164
+ try {
1165
+ const fontOpts = await me.loadFont(fontName);
1166
+ const generatedTxt = fontOpts ? generateText(fontName, _reworkFontOpts(fontOpts, options), txt) : "";
1167
+ if (next) {
1168
+ next(null, generatedTxt);
1169
+ }
1170
+ return generatedTxt;
1171
+ } catch (err) {
1172
+ const error = err instanceof Error ? err : new Error(String(err));
1173
+ if (next) {
1174
+ next(error);
1175
+ return "";
1176
+ }
1177
+ throw error;
1178
+ }
1179
+ };
1180
+ me.textSync = function(txt, options) {
1181
+ txt = txt + "";
1182
+ if (typeof options === "string") {
1183
+ options = { font: options };
1184
+ } else {
1185
+ options = options || {};
1186
+ }
1187
+ const fontName = options.font || figDefaults.font;
1188
+ let fontOpts = _reworkFontOpts(me.loadFontSync(fontName), options);
1189
+ return generateText(fontName, fontOpts, txt);
1190
+ };
1191
+ me.metadata = async function(fontName, callback) {
1192
+ fontName = fontName + "";
1193
+ try {
1194
+ const fontOpts = await me.loadFont(fontName);
1195
+ if (!fontOpts) {
1196
+ throw new Error("Error loading font.");
1197
+ }
1198
+ const actualFontName = getFontName(fontName);
1199
+ const font = figFonts[actualFontName] || {};
1200
+ const result = [fontOpts, font.comment || ""];
1201
+ if (callback) {
1202
+ callback(null, fontOpts, font.comment);
1203
+ }
1204
+ return result;
1205
+ } catch (err) {
1206
+ const error = err instanceof Error ? err : new Error(String(err));
1207
+ if (callback) {
1208
+ callback(error);
1209
+ return null;
1210
+ }
1211
+ throw error;
1212
+ }
1213
+ };
1214
+ me.defaults = function(opts) {
1215
+ if (opts && typeof opts === "object") {
1216
+ Object.assign(figDefaults, opts);
1217
+ }
1218
+ if (typeof structuredClone !== "undefined") {
1219
+ return structuredClone(figDefaults);
1220
+ } else {
1221
+ return JSON.parse(JSON.stringify(figDefaults));
1222
+ }
1223
+ };
1224
+ me.parseFont = function(fontName, data, override = true) {
1225
+ if (figFonts[fontName] && !override) {
1226
+ return figFonts[fontName].options;
1227
+ }
1228
+ data = data.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
1229
+ const font = new FigletFont();
1230
+ const lines = data.split("\n");
1231
+ const headerLine = lines.shift();
1232
+ if (!headerLine) {
1233
+ throw new Error("Invalid font file: missing header");
1234
+ }
1235
+ const headerData = headerLine.split(" ");
1236
+ const opts = {
1237
+ hardBlank: headerData[0].substring(5, 6),
1238
+ height: parseInt(headerData[1], 10),
1239
+ baseline: parseInt(headerData[2], 10),
1240
+ maxLength: parseInt(headerData[3], 10),
1241
+ oldLayout: parseInt(headerData[4], 10),
1242
+ numCommentLines: parseInt(headerData[5], 10),
1243
+ printDirection: headerData[6] ? parseInt(headerData[6], 10) : 0,
1244
+ fullLayout: headerData[7] ? parseInt(headerData[7], 10) : null,
1245
+ codeTagCount: headerData[8] ? parseInt(headerData[8], 10) : null
1246
+ };
1247
+ const hardBlank = opts.hardBlank || "";
1248
+ if (hardBlank.length !== 1 || [
1249
+ opts.height,
1250
+ opts.baseline,
1251
+ opts.maxLength,
1252
+ opts.oldLayout,
1253
+ opts.numCommentLines
1254
+ ].some((val) => val === null || val === void 0 || isNaN(val))) {
1255
+ throw new Error("FIGlet header contains invalid values.");
1256
+ }
1257
+ if (opts.height == null || opts.numCommentLines == null) {
1258
+ throw new Error("FIGlet header contains invalid values.");
1259
+ }
1260
+ opts.fittingRules = getSmushingRules(opts.oldLayout, opts.fullLayout);
1261
+ font.options = opts;
1262
+ const charNums = [];
1263
+ for (let i = 32; i <= 126; i++) {
1264
+ charNums.push(i);
1265
+ }
1266
+ charNums.push(196, 214, 220, 228, 246, 252, 223);
1267
+ if (lines.length < opts.numCommentLines + opts.height * charNums.length) {
1268
+ throw new Error(
1269
+ `FIGlet file is missing data. Line length: ${lines.length}. Comment lines: ${opts.numCommentLines}. Height: ${opts.height}. Num chars: ${charNums.length}.`
1270
+ );
1271
+ }
1272
+ font.comment = lines.splice(0, opts.numCommentLines).join("\n");
1273
+ font.numChars = 0;
1274
+ while (lines.length > 0 && font.numChars < charNums.length) {
1275
+ const cNum = charNums[font.numChars];
1276
+ font[cNum] = lines.splice(0, opts.height);
1277
+ for (let i = 0; i < opts.height; i++) {
1278
+ if (typeof font[cNum][i] === "undefined") {
1279
+ font[cNum][i] = "";
1280
+ } else {
1281
+ font[cNum][i] = removeEndChar(font[cNum][i], i, opts.height);
1282
+ }
1283
+ }
1284
+ font.numChars++;
1285
+ }
1286
+ while (lines.length > 0) {
1287
+ const cNumLine = lines.shift();
1288
+ if (!cNumLine || cNumLine.trim() === "") break;
1289
+ let cNum = cNumLine.split(" ")[0];
1290
+ let parsedNum;
1291
+ if (/^-?0[xX][0-9a-fA-F]+$/.test(cNum)) {
1292
+ parsedNum = parseInt(cNum, 16);
1293
+ } else if (/^-?0[0-7]+$/.test(cNum)) {
1294
+ parsedNum = parseInt(cNum, 8);
1295
+ } else if (/^-?[0-9]+$/.test(cNum)) {
1296
+ parsedNum = parseInt(cNum, 10);
1297
+ } else {
1298
+ throw new Error(`Error parsing data. Invalid data: ${cNum}`);
1299
+ }
1300
+ if (parsedNum === -1 || parsedNum < -2147483648 || parsedNum > 2147483647) {
1301
+ const msg = parsedNum === -1 ? "The char code -1 is not permitted." : `The char code cannot be ${parsedNum < -2147483648 ? "less than -2147483648" : "greater than 2147483647"}.`;
1302
+ throw new Error(`Error parsing data. ${msg}`);
1303
+ }
1304
+ font[parsedNum] = lines.splice(0, opts.height);
1305
+ for (let i = 0; i < opts.height; i++) {
1306
+ if (typeof font[parsedNum][i] === "undefined") {
1307
+ font[parsedNum][i] = "";
1308
+ } else {
1309
+ font[parsedNum][i] = removeEndChar(
1310
+ font[parsedNum][i],
1311
+ i,
1312
+ opts.height
1313
+ );
1314
+ }
1315
+ }
1316
+ font.numChars++;
1317
+ }
1318
+ figFonts[fontName] = font;
1319
+ return opts;
1320
+ };
1321
+ me.loadedFonts = () => {
1322
+ return Object.keys(figFonts);
1323
+ };
1324
+ me.clearLoadedFonts = () => {
1325
+ Object.keys(figFonts).forEach((key) => {
1326
+ delete figFonts[key];
1327
+ });
1328
+ };
1329
+ me.loadFont = async function(fontName, callback) {
1330
+ const actualFontName = getFontName(fontName);
1331
+ if (figFonts[actualFontName]) {
1332
+ const result = figFonts[actualFontName].options;
1333
+ if (callback) {
1334
+ callback(null, result);
1335
+ }
1336
+ return Promise.resolve(result);
1337
+ }
1338
+ try {
1339
+ if (!figDefaults.fetchFontIfMissing) {
1340
+ throw new Error(`Font is not loaded: ${actualFontName}`);
1341
+ }
1342
+ const response = await fetch(
1343
+ `${figDefaults.fontPath}/${actualFontName}.flf`
1344
+ );
1345
+ if (!response.ok) {
1346
+ throw new Error(`Network response was not ok: ${response.status}`);
1347
+ }
1348
+ const text = await response.text();
1349
+ const result = me.parseFont(actualFontName, text);
1350
+ if (callback) {
1351
+ callback(null, result);
1352
+ }
1353
+ return result;
1354
+ } catch (error) {
1355
+ const err = error instanceof Error ? error : new Error(String(error));
1356
+ if (callback) {
1357
+ callback(err);
1358
+ return null;
1359
+ }
1360
+ throw err;
1361
+ }
1362
+ };
1363
+ me.loadFontSync = function(name) {
1364
+ const actualFontName = getFontName(name);
1365
+ if (figFonts[actualFontName]) {
1366
+ return figFonts[actualFontName].options;
1367
+ }
1368
+ throw new Error(
1369
+ "Synchronous font loading is not implemented for the browser, it will only work for fonts already loaded."
1370
+ );
1371
+ };
1372
+ me.preloadFonts = async function(fonts, callback) {
1373
+ try {
1374
+ for (const name of fonts) {
1375
+ const actualFontName = getFontName(name);
1376
+ const response = await fetch(
1377
+ `${figDefaults.fontPath}/${actualFontName}.flf`
1378
+ );
1379
+ if (!response.ok) {
1380
+ throw new Error(
1381
+ `Failed to preload fonts. Error fetching font: ${actualFontName}, status code: ${response.statusText}`
1382
+ );
1383
+ }
1384
+ const data = await response.text();
1385
+ me.parseFont(actualFontName, data);
1386
+ }
1387
+ if (callback) {
1388
+ callback();
1389
+ }
1390
+ } catch (error) {
1391
+ const err = error instanceof Error ? error : new Error(String(error));
1392
+ if (callback) {
1393
+ callback(err);
1394
+ return;
1395
+ }
1396
+ throw error;
1397
+ }
1398
+ };
1399
+ me.fonts = function(callback) {
1400
+ return new Promise(function(resolve, reject) {
1401
+ resolve(fontList);
1402
+ if (callback) {
1403
+ callback(null, fontList);
1404
+ }
1405
+ });
1406
+ };
1407
+ me.fontsSync = function() {
1408
+ return fontList;
1409
+ };
1410
+ me.figFonts = figFonts;
1411
+ return me;
1412
+ })();
1413
+
1414
+ // ../../node_modules/.pnpm/figlet@1.11.0/node_modules/figlet/dist/node-figlet.mjs
1415
+ import { fileURLToPath } from "url";
1416
+ var __filename = fileURLToPath(import.meta.url);
1417
+ var __dirname = path.dirname(__filename);
1418
+ var fontPath = path.join(__dirname, "/../fonts/");
1419
+ var nodeFiglet = figlet;
1420
+ nodeFiglet.defaults({ fontPath });
1421
+ nodeFiglet.loadFont = function(name, callback) {
1422
+ const actualFontName = getFontName(name);
1423
+ return new Promise((resolve, reject) => {
1424
+ if (nodeFiglet.figFonts[actualFontName]) {
1425
+ if (callback) {
1426
+ callback(null, nodeFiglet.figFonts[actualFontName].options);
1427
+ }
1428
+ resolve(nodeFiglet.figFonts[actualFontName].options);
1429
+ return;
1430
+ }
1431
+ fs.readFile(
1432
+ path.join(nodeFiglet.defaults().fontPath, actualFontName + ".flf"),
1433
+ { encoding: "utf-8" },
1434
+ (err, fontData) => {
1435
+ if (err) {
1436
+ if (callback) {
1437
+ callback(err);
1438
+ }
1439
+ reject(err);
1440
+ return;
1441
+ }
1442
+ fontData = fontData + "";
1443
+ try {
1444
+ const font = nodeFiglet.parseFont(
1445
+ actualFontName,
1446
+ fontData
1447
+ );
1448
+ if (callback) {
1449
+ callback(null, font);
1450
+ }
1451
+ resolve(font);
1452
+ } catch (error) {
1453
+ const typedError = error instanceof Error ? error : new Error(String(error));
1454
+ if (callback) {
1455
+ callback(typedError);
1456
+ }
1457
+ reject(typedError);
1458
+ }
1459
+ }
1460
+ );
1461
+ });
1462
+ };
1463
+ nodeFiglet.loadFontSync = function(font) {
1464
+ const actualFontName = getFontName(font);
1465
+ if (nodeFiglet.figFonts[actualFontName]) {
1466
+ return nodeFiglet.figFonts[actualFontName].options;
1467
+ }
1468
+ const fontData = fs.readFileSync(
1469
+ path.join(nodeFiglet.defaults().fontPath, actualFontName + ".flf"),
1470
+ {
1471
+ encoding: "utf-8"
1472
+ }
1473
+ ) + "";
1474
+ return nodeFiglet.parseFont(actualFontName, fontData);
1475
+ };
1476
+ nodeFiglet.fonts = function(next) {
1477
+ return new Promise((resolve, reject) => {
1478
+ const fontList2 = [];
1479
+ fs.readdir(
1480
+ nodeFiglet.defaults().fontPath,
1481
+ (err, files) => {
1482
+ if (err) {
1483
+ next && next(err);
1484
+ reject(err);
1485
+ return;
1486
+ }
1487
+ files.forEach((file) => {
1488
+ if (/\.flf$/.test(file)) {
1489
+ fontList2.push(file.replace(/\.flf$/, ""));
1490
+ }
1491
+ });
1492
+ next && next(null, fontList2);
1493
+ resolve(fontList2);
1494
+ }
1495
+ );
1496
+ });
1497
+ };
1498
+ nodeFiglet.fontsSync = function() {
1499
+ const fontList2 = [];
1500
+ fs.readdirSync(nodeFiglet.defaults().fontPath).forEach((file) => {
1501
+ if (/\.flf$/.test(file)) {
1502
+ fontList2.push(file.replace(/\.flf$/, ""));
1503
+ }
1504
+ });
1505
+ return fontList2;
1506
+ };
1507
+
1508
+ // ../ui/dist/wordmark.js
1509
+ var chalkTrueColor = new Chalk({ level: 3 });
1510
+ var ROW_COLORS = [
1511
+ [251, 210, 160],
1512
+ [240, 146, 90],
1513
+ [232, 116, 59],
1514
+ [199, 90, 40],
1515
+ [156, 68, 28],
1516
+ [156, 68, 28]
1517
+ ];
1518
+ var SHADOW_CHARS = /* @__PURE__ */ new Set(["\u2557", "\u2554", "\u2550", "\u255D", "\u255A", "\u2551"]);
1519
+ function renderLine(line, rowColor) {
1520
+ const [r, g, b] = rowColor;
1521
+ const shadowR = Math.round(r * 0.4);
1522
+ const shadowG = Math.round(g * 0.4);
1523
+ const shadowB = Math.round(b * 0.4);
1524
+ const mainColor = chalkTrueColor.rgb(r, g, b);
1525
+ const shadowColor = chalkTrueColor.rgb(shadowR, shadowG, shadowB);
1526
+ return [...line].map((char) => SHADOW_CHARS.has(char) ? shadowColor(char) : mainColor(char)).join("");
1527
+ }
1528
+ function generateWordmark(name) {
1529
+ const noColor = process.env.NO_COLOR !== void 0 && process.env.NO_COLOR !== "";
1530
+ const DEFAULT_TERMINAL_WIDTH = 120;
1531
+ const maxWidth = process.stdout.columns ?? DEFAULT_TERMINAL_WIDTH;
1532
+ const art = nodeFiglet.textSync(name, { font: "ANSI Shadow" });
1533
+ const artLines = art.split("\n");
1534
+ const maxLineWidth = Math.max(...artLines.map((l) => l.length));
1535
+ if (maxLineWidth > maxWidth) {
1536
+ if (noColor)
1537
+ return name;
1538
+ return ember500.bold(name);
1539
+ }
1540
+ if (noColor)
1541
+ return art;
1542
+ const lastColor = ROW_COLORS[ROW_COLORS.length - 1];
1543
+ return artLines.map((line, i) => renderLine(line, ROW_COLORS[i] ?? lastColor)).join("\n");
1544
+ }
1545
+
1546
+ // src/run.ts
1547
+ import { Command } from "commander";
1548
+
1549
+ // src/detect.ts
1550
+ import { spawnSync } from "child_process";
1551
+ import * as fs2 from "fs";
1552
+ import * as path2 from "path";
1553
+ function toKebabCase(str) {
1554
+ return str.toLowerCase().replace(/[\s_.]+/g, "-").replace(/[^a-z0-9-]/g, "").replace(/-{2,}/g, "-").replace(/^-+|-+$/g, "");
1555
+ }
1556
+ function normalizeGitUrl(rawUrl) {
1557
+ let url = rawUrl.trim();
1558
+ if (url.startsWith("git@")) {
1559
+ url = url.replace(/^git@([^:]+):/, "https://$1/");
1560
+ }
1561
+ if (url.startsWith("git+https://")) {
1562
+ url = url.slice("git+".length);
1563
+ }
1564
+ if (url.endsWith(".git")) {
1565
+ url = url.slice(0, -4);
1566
+ }
1567
+ return `git+${url}`;
1568
+ }
1569
+ function gitOutput(args) {
1570
+ try {
1571
+ const result = spawnSync("git", args, { encoding: "buffer" });
1572
+ if (result.status !== 0) return "";
1573
+ const stdout = result.stdout;
1574
+ return stdout.toString("utf8").trim();
1575
+ } catch {
1576
+ return "";
1577
+ }
1578
+ }
1579
+ function detectEnvironment(nameArg) {
1580
+ const cwd = process.cwd();
1581
+ const pkgJsonPath = path2.join(cwd, "package.json");
1582
+ let hasPackageJson = false;
1583
+ let pkgName = "";
1584
+ let version = "";
1585
+ let author = "";
1586
+ let description = "";
1587
+ let pkgSkillDir = null;
1588
+ if (fs2.existsSync(pkgJsonPath)) {
1589
+ hasPackageJson = true;
1590
+ try {
1591
+ const raw = fs2.readFileSync(pkgJsonPath, "utf8");
1592
+ const pkg2 = JSON.parse(raw);
1593
+ pkgName = pkg2.name ?? "";
1594
+ version = pkg2.version ?? "";
1595
+ author = pkg2.author ?? "";
1596
+ description = pkg2.description ?? "";
1597
+ if (pkg2.skillet?.skillDir) {
1598
+ pkgSkillDir = pkg2.skillet.skillDir;
1599
+ }
1600
+ } catch {
1601
+ }
1602
+ }
1603
+ let name;
1604
+ if (nameArg) {
1605
+ name = nameArg;
1606
+ } else if (pkgName) {
1607
+ name = pkgName;
1608
+ } else {
1609
+ name = toKebabCase(path2.basename(cwd));
1610
+ }
1611
+ const hasSkillMd = fs2.existsSync(path2.join(cwd, "SKILL.md"));
1612
+ let skillDir = null;
1613
+ if (pkgSkillDir !== null) {
1614
+ skillDir = pkgSkillDir;
1615
+ } else if (fs2.existsSync(path2.join(cwd, "skill")) && fs2.statSync(path2.join(cwd, "skill")).isDirectory()) {
1616
+ skillDir = "skill/";
1617
+ }
1618
+ const rawRemote = gitOutput(["remote", "get-url", "origin"]);
1619
+ const repositoryUrl = rawRemote ? normalizeGitUrl(rawRemote) : "";
1620
+ const gitName = gitOutput(["config", "user.name"]);
1621
+ const gitEmail = gitOutput(["config", "user.email"]);
1622
+ const gitUser = gitName && gitEmail ? `${gitName} <${gitEmail}>` : gitName || "";
1623
+ return {
1624
+ cwd,
1625
+ name,
1626
+ version,
1627
+ author,
1628
+ description,
1629
+ hasPackageJson,
1630
+ hasSkillMd,
1631
+ skillDir,
1632
+ repositoryUrl,
1633
+ gitUser
1634
+ };
1635
+ }
1636
+
1637
+ // src/prompts.ts
1638
+ import { input } from "@inquirer/prompts";
1639
+ async function collectConfig(detected) {
1640
+ const name = await input({
1641
+ message: "Package name:",
1642
+ default: detected.name
1643
+ });
1644
+ const version = await input({
1645
+ message: "Version:",
1646
+ default: detected.version || "0.1.0"
1647
+ });
1648
+ const description = await input({
1649
+ message: "Description:",
1650
+ default: detected.description || ""
1651
+ });
1652
+ const author = await input({
1653
+ message: "Author:",
1654
+ default: detected.gitUser || detected.author || ""
1655
+ });
1656
+ const repositoryUrl = await input({
1657
+ message: "Repository URL:",
1658
+ default: detected.repositoryUrl || ""
1659
+ });
1660
+ const license = await input({
1661
+ message: "License:",
1662
+ default: "MIT"
1663
+ });
1664
+ const skillDir = await input({
1665
+ message: "Skill content path (relative to package root):",
1666
+ default: detected.skillDir || "skill/"
1667
+ });
1668
+ return { name, version, description, author, repositoryUrl, license, skillDir };
1669
+ }
1670
+
1671
+ // src/scaffold.ts
1672
+ import { spawnSync as spawnSync2 } from "child_process";
1673
+ import * as fs3 from "fs";
1674
+ import * as fsp from "fs/promises";
1675
+ import * as path3 from "path";
1676
+ function runSync(cmd, args, stepName) {
1677
+ const cmdStr = [cmd, ...args.map((a) => `"${a}"`)].join(" ");
1678
+ const result = spawnSync2(cmdStr, [], { stdio: "inherit", shell: true });
1679
+ if (result.status !== 0) {
1680
+ throw new Error(`${stepName} exited with code ${result.status ?? "null"}`);
1681
+ }
1682
+ }
1683
+ function buildBinCliJs(skillDir) {
1684
+ return `#!/usr/bin/env node
1685
+ import { createRequire } from 'node:module';
1686
+ import { fileURLToPath } from 'node:url';
1687
+ import { run } from '@skillet-cli/core';
1688
+
1689
+ const pkg = createRequire(import.meta.url)('../package.json');
1690
+ await run({ skillDir: fileURLToPath(new URL('../${skillDir}', import.meta.url)), pkg });
1691
+ `;
1692
+ }
1693
+ async function executeScaffold(config) {
1694
+ const spinner = createSpinner();
1695
+ try {
1696
+ const pkgJsonPath = path3.join(process.cwd(), "package.json");
1697
+ if (!fs3.existsSync(pkgJsonPath)) {
1698
+ spinner.start("Prepping npm package\u2026");
1699
+ runSync("npm", ["init", "-y"], "npm init");
1700
+ spinner.succeed("Prepping done");
1701
+ }
1702
+ spinner.start("Seasoning package fields\u2026");
1703
+ const pkgSetArgs = [
1704
+ `name=${config.name}`,
1705
+ `version=${config.version}`,
1706
+ `description=${config.description}`,
1707
+ `author=${config.author}`,
1708
+ `license=${config.license}`,
1709
+ "type=module",
1710
+ `engines.node=>=24`,
1711
+ `skillet.skillDir=${config.skillDir}`,
1712
+ `bin.${config.name}=./bin/cli.js`
1713
+ ];
1714
+ runSync("npm", ["pkg", "set", ...pkgSetArgs], "npm pkg set");
1715
+ if (config.repositoryUrl) {
1716
+ runSync("npm", ["pkg", "set", "repository.type=git"], "npm pkg set repository.type");
1717
+ runSync(
1718
+ "npm",
1719
+ ["pkg", "set", `repository.url=${config.repositoryUrl}`],
1720
+ "npm pkg set repository.url"
1721
+ );
1722
+ }
1723
+ spinner.succeed("Seasoning done");
1724
+ spinner.start("Plating bin/cli.js\u2026");
1725
+ const binDir = path3.join(process.cwd(), "bin");
1726
+ await fsp.mkdir(binDir, { recursive: true });
1727
+ const binPath = path3.join(binDir, "cli.js");
1728
+ await fsp.writeFile(binPath, buildBinCliJs(config.skillDir), "utf8");
1729
+ await fsp.chmod(binPath, 493);
1730
+ spinner.succeed("Plating done");
1731
+ spinner.start("Firing up @skillet-cli/core install\u2026");
1732
+ const installResult = spawnSync2("npm install @skillet-cli/core", [], {
1733
+ stdio: "inherit",
1734
+ shell: true
1735
+ });
1736
+ if (installResult.status !== 0) {
1737
+ throw new Error(
1738
+ `npm install @skillet-cli/core exited with code ${installResult.status ?? "null"}`
1739
+ );
1740
+ }
1741
+ spinner.succeed("Firing up done");
1742
+ } catch (err) {
1743
+ spinner.fail("Setup failed");
1744
+ const message = err instanceof Error ? err.message : String(err);
1745
+ process.stderr.write(`Error during setup: ${message}
1746
+ `);
1747
+ process.exit(1);
1748
+ }
1749
+ }
1750
+
1751
+ // src/skill-dir.ts
1752
+ import * as fsp2 from "fs/promises";
1753
+ import * as path4 from "path";
1754
+ import { checkbox, confirm } from "@inquirer/prompts";
1755
+ var LOCK_FILES = /* @__PURE__ */ new Set(["package-lock.json", "pnpm-lock.yaml", "yarn.lock"]);
1756
+ var SKILL_DIRS = /* @__PURE__ */ new Set(["resources", "assets", "templates"]);
1757
+ function getPreselected(items) {
1758
+ return items.filter((item) => {
1759
+ if (item === "SKILL.md") return true;
1760
+ if (item === "README.md") return false;
1761
+ const baseName = item.endsWith("/") ? item.slice(0, -1) : item;
1762
+ if (baseName.startsWith(".")) return false;
1763
+ if (LOCK_FILES.has(item)) return false;
1764
+ const dirName = item.endsWith("/") ? item.slice(0, -1) : item;
1765
+ if (SKILL_DIRS.has(dirName)) return true;
1766
+ return false;
1767
+ });
1768
+ }
1769
+ async function readDirItems(cwd) {
1770
+ const entries = await fsp2.readdir(cwd, { withFileTypes: true });
1771
+ return entries.filter((e) => e.name !== "skill").map((e) => e.isDirectory() ? `${e.name}/` : e.name);
1772
+ }
1773
+ async function setupSkillDir(detected) {
1774
+ const cwd = detected.cwd;
1775
+ const skillPath = path4.join(cwd, "skill");
1776
+ try {
1777
+ const stat2 = await fsp2.stat(skillPath);
1778
+ if (stat2.isDirectory()) {
1779
+ process.stdout.write("skill/ already exists \u2014 skipping skill directory setup.\n");
1780
+ return;
1781
+ }
1782
+ } catch {
1783
+ }
1784
+ const hasSkillMd = detected.hasSkillMd;
1785
+ if (!hasSkillMd) {
1786
+ return;
1787
+ }
1788
+ const allItems = await readDirItems(cwd);
1789
+ const LARGE_DIR_THRESHOLD = 12;
1790
+ let selectedItems;
1791
+ if (allItems.length <= LARGE_DIR_THRESHOLD) {
1792
+ const preselected = getPreselected(allItems);
1793
+ selectedItems = await checkbox({
1794
+ message: "Select files/folders to move into skill/:",
1795
+ choices: allItems.map((item) => ({
1796
+ name: item,
1797
+ value: item,
1798
+ checked: preselected.includes(item)
1799
+ }))
1800
+ });
1801
+ } else {
1802
+ const skillRelatedExtras = allItems.filter((item) => {
1803
+ const dirName = item.endsWith("/") ? item.slice(0, -1) : item;
1804
+ return SKILL_DIRS.has(dirName) && dirName !== "resources";
1805
+ }).join(", ");
1806
+ const extraMsg = skillRelatedExtras ? ` (other skill-related folders detected but not included: ${skillRelatedExtras})` : "";
1807
+ const confirmed = await confirm({
1808
+ message: `Move only SKILL.md and resources/ (if present) into skill/?${extraMsg}`,
1809
+ default: true
1810
+ });
1811
+ if (!confirmed) {
1812
+ process.stdout.write("No files moved. Your npm package is set up.\n");
1813
+ process.exit(0);
1814
+ }
1815
+ selectedItems = allItems.filter((item) => {
1816
+ return item === "SKILL.md" || item === "resources/";
1817
+ });
1818
+ }
1819
+ if (selectedItems.length === 0) {
1820
+ process.stdout.write("No files selected. Your npm package is set up.\n");
1821
+ return;
1822
+ }
1823
+ process.stdout.write("\nFiles to move into skill/:\n");
1824
+ for (const item of selectedItems) {
1825
+ process.stdout.write(` ${item}
1826
+ `);
1827
+ }
1828
+ process.stdout.write("\n");
1829
+ const proceed = await confirm({
1830
+ message: "Proceed with moving these files?",
1831
+ default: true
1832
+ });
1833
+ if (!proceed) {
1834
+ process.stdout.write("No files moved. Your npm package is set up.\n");
1835
+ process.exit(0);
1836
+ }
1837
+ await fsp2.mkdir(skillPath, { recursive: true });
1838
+ for (const item of selectedItems) {
1839
+ const src = path4.join(cwd, item.endsWith("/") ? item.slice(0, -1) : item);
1840
+ const dest = path4.join(skillPath, item.endsWith("/") ? item.slice(0, -1) : item);
1841
+ try {
1842
+ await fsp2.rename(src, dest);
1843
+ process.stdout.write(` Moved ${item}
1844
+ `);
1845
+ } catch (err) {
1846
+ const message = err instanceof Error ? err.message : String(err);
1847
+ process.stderr.write(`Error moving ${item}: ${message}
1848
+ `);
1849
+ process.exit(1);
1850
+ }
1851
+ }
1852
+ }
1853
+
1854
+ // src/run.ts
1855
+ var _require = createRequire(import.meta.url);
1856
+ var pkg = _require("../package.json");
1857
+ var program = new Command();
1858
+ program.name("create-skillet").description("Convert a skill directory into a publishable npm package").argument("[name]", "optional package name \u2014 overrides the directory-name default").action(async (nameArg) => {
1859
+ const start = Date.now();
1860
+ const detected = detectEnvironment(nameArg);
1861
+ const header = renderFullHeader({
1862
+ wordmark: generateWordmark("SKILLETIZE"),
1863
+ tagline: `Package ${detected.name || "your skill"} for any AI agent`,
1864
+ attributionLine: `Powered by Skillet CLI v${pkg.version}`
1865
+ });
1866
+ process.stdout.write(header);
1867
+ process.stdout.write(`Directory: ${detected.cwd}
1868
+ `);
1869
+ process.stdout.write(`SKILL.md: ${detected.hasSkillMd ? "found" : "not found"}
1870
+ `);
1871
+ process.stdout.write(`package.json: ${detected.hasPackageJson ? "found" : "not found"}
1872
+ `);
1873
+ process.stdout.write(`Git user: ${detected.gitUser || "(not detected)"}
1874
+ `);
1875
+ process.stdout.write("\n");
1876
+ const proceedEarly = await confirm2({
1877
+ message: "Proceed with setup?",
1878
+ default: true
1879
+ });
1880
+ if (!proceedEarly) {
1881
+ process.stdout.write("\nTo set up manually:\n");
1882
+ process.stdout.write(" npm init\n");
1883
+ process.stdout.write(` npm pkg set name="${detected.name}"
1884
+ `);
1885
+ process.stdout.write(' npm pkg set version="0.1.0"\n');
1886
+ process.stdout.write(" npm pkg set type=module\n");
1887
+ process.stdout.write(' npm pkg set engines.node=">=24"\n');
1888
+ process.stdout.write(' npm pkg set bin.your-skill="./bin/cli.js"\n');
1889
+ process.stdout.write(" # Write bin/cli.js\n");
1890
+ process.stdout.write(" npm install @skillet-cli/core\n");
1891
+ process.exit(0);
1892
+ return;
1893
+ }
1894
+ const config = await collectConfig(detected);
1895
+ process.stdout.write("\nReady to set up:\n");
1896
+ process.stdout.write(` name: ${config.name}
1897
+ `);
1898
+ process.stdout.write(` version: ${config.version}
1899
+ `);
1900
+ process.stdout.write(` description: ${config.description}
1901
+ `);
1902
+ process.stdout.write(` author: ${config.author}
1903
+ `);
1904
+ process.stdout.write(` license: ${config.license}
1905
+ `);
1906
+ process.stdout.write(
1907
+ ` repositoryUrl:${config.repositoryUrl ? " " + config.repositoryUrl : " (none)"}
1908
+ `
1909
+ );
1910
+ process.stdout.write(` skillDir: ${config.skillDir}
1911
+ `);
1912
+ process.stdout.write("\nCommands to run:\n");
1913
+ if (!detected.hasPackageJson) {
1914
+ process.stdout.write(" npm init -y\n");
1915
+ }
1916
+ process.stdout.write(" npm pkg set name=... version=... (and other fields)\n");
1917
+ process.stdout.write(" npm install @skillet-cli/core\n");
1918
+ process.stdout.write("\n");
1919
+ const proceedFinal = await confirm2({
1920
+ message: "Proceed? (no = exit with no changes)",
1921
+ default: true
1922
+ });
1923
+ if (!proceedFinal) {
1924
+ process.stdout.write("No changes made. Re-run `create-skillet` to start over.\n");
1925
+ process.exit(0);
1926
+ return;
1927
+ }
1928
+ await executeScaffold(config);
1929
+ await setupSkillDir(detected);
1930
+ const elapsed = ((Date.now() - start) / 1e3).toFixed(1);
1931
+ process.stdout.write(`
1932
+ Done in ${elapsed}s \u2014 Your skill package is ready.
1933
+
1934
+ `);
1935
+ process.stdout.write(` Next steps:
1936
+ `);
1937
+ process.stdout.write(` npx . install \u2014 test locally
1938
+ `);
1939
+ process.stdout.write(` npm publish \u2014 publish to npm
1940
+
1941
+ `);
1942
+ });
1943
+ async function run() {
1944
+ await program.parseAsync(process.argv);
1945
+ }
1946
+ export {
1947
+ run
1948
+ };