@fold-run/cli 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/dist/commands/completions.d.ts +1 -0
  2. package/dist/commands/completions.js +195 -0
  3. package/dist/commands/completions.js.map +1 -0
  4. package/dist/commands/config.d.ts +4 -0
  5. package/dist/commands/config.js +75 -0
  6. package/dist/commands/config.js.map +1 -0
  7. package/dist/commands/delete.d.ts +1 -0
  8. package/dist/commands/delete.js +8 -0
  9. package/dist/commands/delete.js.map +1 -1
  10. package/dist/commands/deploy.d.ts +1 -0
  11. package/dist/commands/deploy.js +59 -17
  12. package/dist/commands/deploy.js.map +1 -1
  13. package/dist/commands/dev.d.ts +1 -0
  14. package/dist/commands/dev.js +53 -34
  15. package/dist/commands/dev.js.map +1 -1
  16. package/dist/commands/doctor.d.ts +1 -0
  17. package/dist/commands/doctor.js +138 -0
  18. package/dist/commands/doctor.js.map +1 -0
  19. package/dist/commands/domains.d.ts +11 -0
  20. package/dist/commands/domains.js +111 -0
  21. package/dist/commands/domains.js.map +1 -0
  22. package/dist/commands/env-vars.d.ts +1 -0
  23. package/dist/commands/env-vars.js +8 -1
  24. package/dist/commands/env-vars.js.map +1 -1
  25. package/dist/commands/init.d.ts +1 -0
  26. package/dist/commands/init.js +104 -6
  27. package/dist/commands/init.js.map +1 -1
  28. package/dist/commands/invoke.d.ts +9 -0
  29. package/dist/commands/invoke.js +89 -0
  30. package/dist/commands/invoke.js.map +1 -0
  31. package/dist/commands/link.d.ts +4 -0
  32. package/dist/commands/link.js +77 -0
  33. package/dist/commands/link.js.map +1 -0
  34. package/dist/commands/login.js +8 -6
  35. package/dist/commands/login.js.map +1 -1
  36. package/dist/commands/logs.js +31 -1
  37. package/dist/commands/logs.js.map +1 -1
  38. package/dist/commands/schedules.d.ts +3 -1
  39. package/dist/commands/schedules.js +41 -21
  40. package/dist/commands/schedules.js.map +1 -1
  41. package/dist/commands/secrets.d.ts +3 -1
  42. package/dist/commands/secrets.js +9 -2
  43. package/dist/commands/secrets.js.map +1 -1
  44. package/dist/commands/status.js +48 -28
  45. package/dist/commands/status.js.map +1 -1
  46. package/dist/commands/templates.js +24 -17
  47. package/dist/commands/templates.js.map +1 -1
  48. package/dist/commands/tenant.d.ts +4 -0
  49. package/dist/commands/tenant.js +82 -0
  50. package/dist/commands/tenant.js.map +1 -0
  51. package/dist/commands/webhooks.d.ts +3 -1
  52. package/dist/commands/webhooks.js +31 -18
  53. package/dist/commands/webhooks.js.map +1 -1
  54. package/dist/commands/whoami.d.ts +1 -0
  55. package/dist/commands/whoami.js +39 -0
  56. package/dist/commands/whoami.js.map +1 -0
  57. package/dist/index.js +107 -34
  58. package/dist/index.js.map +1 -1
  59. package/dist/lib/api.d.ts +1 -0
  60. package/dist/lib/api.js +30 -0
  61. package/dist/lib/api.js.map +1 -1
  62. package/dist/lib/bundler.js +124 -18
  63. package/dist/lib/bundler.js.map +1 -1
  64. package/dist/lib/colorize.d.ts +5 -0
  65. package/dist/lib/colorize.js +28 -0
  66. package/dist/lib/colorize.js.map +1 -0
  67. package/dist/lib/cron.d.ts +13 -0
  68. package/dist/lib/cron.js +107 -0
  69. package/dist/lib/cron.js.map +1 -0
  70. package/dist/lib/manifest.d.ts +31 -0
  71. package/dist/lib/manifest.js +195 -0
  72. package/dist/lib/manifest.js.map +1 -0
  73. package/dist/lib/prompt.d.ts +27 -0
  74. package/dist/lib/prompt.js +160 -0
  75. package/dist/lib/prompt.js.map +1 -1
  76. package/dist/lib/spinner.d.ts +14 -0
  77. package/dist/lib/spinner.js +52 -0
  78. package/dist/lib/spinner.js.map +1 -0
  79. package/dist/lib/version-check.d.ts +9 -0
  80. package/dist/lib/version-check.js +54 -0
  81. package/dist/lib/version-check.js.map +1 -0
  82. package/package.json +10 -11
@@ -1,4 +1,164 @@
1
1
  import { stdin, stdout } from 'node:process';
2
+ import { createInterface } from 'node:readline';
3
+ /**
4
+ * Prompt for yes/no confirmation. Returns true if user confirms.
5
+ * Defaults to 'no' if user just presses enter.
6
+ */
7
+ export async function confirm(message) {
8
+ const rl = createInterface({ input: stdin, output: stdout });
9
+ return new Promise((resolve) => {
10
+ rl.question(`${message} [y/N] `, (answer) => {
11
+ rl.close();
12
+ resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');
13
+ });
14
+ });
15
+ }
16
+ /**
17
+ * Prompt for a single line of text input.
18
+ * Returns the trimmed input, or defaultValue if the user presses Enter.
19
+ */
20
+ export async function ask(message, defaultValue) {
21
+ const rl = createInterface({ input: stdin, output: stdout });
22
+ const suffix = defaultValue ? ` [${defaultValue}]` : '';
23
+ return new Promise((resolve) => {
24
+ rl.question(`${message}${suffix}: `, (answer) => {
25
+ rl.close();
26
+ const trimmed = answer.trim();
27
+ resolve(trimmed || defaultValue || '');
28
+ });
29
+ });
30
+ }
31
+ /**
32
+ * Prompt the user to select from a list of options using arrow keys.
33
+ * Returns the selected option value. Falls back to numbered list on non-TTY.
34
+ */
35
+ export async function select(message, options) {
36
+ // Non-TTY fallback: numbered list
37
+ if (!stdout.isTTY) {
38
+ const rl = createInterface({ input: stdin, output: stdout });
39
+ console.log(message);
40
+ for (let i = 0; i < options.length; i++) {
41
+ console.log(` ${i + 1}. ${options[i].label}`);
42
+ }
43
+ return new Promise((resolve) => {
44
+ rl.question('Enter number: ', (answer) => {
45
+ rl.close();
46
+ const idx = Number.parseInt(answer, 10) - 1;
47
+ resolve(options[Math.max(0, Math.min(idx, options.length - 1))].value);
48
+ });
49
+ });
50
+ }
51
+ return new Promise((resolve) => {
52
+ let selected = 0;
53
+ const render = () => {
54
+ // Move cursor up to re-render (skip first render)
55
+ stdout.write(`\x1b[${options.length + 1}A\x1b[J`);
56
+ draw();
57
+ };
58
+ const draw = () => {
59
+ console.log(message);
60
+ for (let i = 0; i < options.length; i++) {
61
+ const cursor = i === selected ? '\x1b[36m❯\x1b[0m' : ' ';
62
+ const label = i === selected ? `\x1b[1m${options[i].label}\x1b[0m` : options[i].label;
63
+ console.log(` ${cursor} ${label}`);
64
+ }
65
+ };
66
+ draw();
67
+ stdin.setRawMode(true);
68
+ stdin.resume();
69
+ stdin.setEncoding('utf-8');
70
+ const onData = (ch) => {
71
+ if (ch === '\r' || ch === '\n') {
72
+ stdin.setRawMode(false);
73
+ stdin.pause();
74
+ stdin.removeListener('data', onData);
75
+ resolve(options[selected].value);
76
+ }
77
+ else if (ch === '\u0003') {
78
+ stdin.setRawMode(false);
79
+ process.exit(1);
80
+ }
81
+ else if (ch === '\x1b[A' || ch === 'k') {
82
+ // Up
83
+ selected = (selected - 1 + options.length) % options.length;
84
+ render();
85
+ }
86
+ else if (ch === '\x1b[B' || ch === 'j') {
87
+ // Down
88
+ selected = (selected + 1) % options.length;
89
+ render();
90
+ }
91
+ };
92
+ stdin.on('data', onData);
93
+ });
94
+ }
95
+ /**
96
+ * Prompt for toggling multiple options on/off. Returns selected values.
97
+ * Space to toggle, Enter to confirm.
98
+ */
99
+ export async function multiSelect(message, options) {
100
+ const toggled = options.map((o) => o.default ?? false);
101
+ // Non-TTY fallback
102
+ if (!stdout.isTTY) {
103
+ const rl = createInterface({ input: stdin, output: stdout });
104
+ console.log(message);
105
+ for (let i = 0; i < options.length; i++) {
106
+ console.log(` ${i + 1}. ${options[i].label}${toggled[i] ? ' (selected)' : ''}`);
107
+ }
108
+ return new Promise((resolve) => {
109
+ rl.question('Enter numbers (comma-separated): ', (answer) => {
110
+ rl.close();
111
+ const nums = answer.split(',').map((s) => Number.parseInt(s.trim(), 10) - 1);
112
+ resolve(nums.filter((n) => n >= 0 && n < options.length).map((n) => options[n].value));
113
+ });
114
+ });
115
+ }
116
+ return new Promise((resolve) => {
117
+ let cursor = 0;
118
+ const render = () => {
119
+ stdout.write(`\x1b[${options.length + 1}A\x1b[J`);
120
+ draw();
121
+ };
122
+ const draw = () => {
123
+ console.log(`${message} (space to toggle, enter to confirm)`);
124
+ for (let i = 0; i < options.length; i++) {
125
+ const pointer = i === cursor ? '\x1b[36m❯\x1b[0m' : ' ';
126
+ const check = toggled[i] ? '\x1b[32m■\x1b[0m' : '□';
127
+ const label = i === cursor ? `\x1b[1m${options[i].label}\x1b[0m` : options[i].label;
128
+ console.log(` ${pointer} ${check} ${label}`);
129
+ }
130
+ };
131
+ draw();
132
+ stdin.setRawMode(true);
133
+ stdin.resume();
134
+ stdin.setEncoding('utf-8');
135
+ const onData = (ch) => {
136
+ if (ch === '\r' || ch === '\n') {
137
+ stdin.setRawMode(false);
138
+ stdin.pause();
139
+ stdin.removeListener('data', onData);
140
+ resolve(options.filter((_, i) => toggled[i]).map((o) => o.value));
141
+ }
142
+ else if (ch === '\u0003') {
143
+ stdin.setRawMode(false);
144
+ process.exit(1);
145
+ }
146
+ else if (ch === ' ') {
147
+ toggled[cursor] = !toggled[cursor];
148
+ render();
149
+ }
150
+ else if (ch === '\x1b[A' || ch === 'k') {
151
+ cursor = (cursor - 1 + options.length) % options.length;
152
+ render();
153
+ }
154
+ else if (ch === '\x1b[B' || ch === 'j') {
155
+ cursor = (cursor + 1) % options.length;
156
+ render();
157
+ }
158
+ };
159
+ stdin.on('data', onData);
160
+ });
161
+ }
2
162
  /**
3
163
  * Read a line of input with masked output (shows * for each character).
4
164
  * Handles backspace and Ctrl+C.
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/lib/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE7C;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrB,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACvB,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAE3B,MAAM,MAAM,GAAG,CAAC,EAAU,EAAE,EAAE;YAC5B,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;gBAC/B,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBACxB,KAAK,CAAC,KAAK,EAAE,CAAC;gBACd,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACrC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACnB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1B,CAAC;iBAAM,IAAI,EAAE,KAAK,QAAQ,EAAE,CAAC;gBAC3B,SAAS;gBACT,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;iBAAM,IAAI,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;gBAC1C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACrB,KAAK,CAAC,GAAG,EAAE,CAAC;oBACZ,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;QACH,CAAC,CAAC;QACF,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/lib/prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface Spinner {
2
+ /** Update the spinner message */
3
+ update(message: string): void;
4
+ /** Stop spinner with success checkmark */
5
+ success(message?: string): void;
6
+ /** Stop spinner with failure X */
7
+ fail(message?: string): void;
8
+ /** Stop spinner without status icon */
9
+ stop(): void;
10
+ }
11
+ /**
12
+ * Create a terminal spinner. Returns no-op spinner if in JSON mode or non-TTY.
13
+ */
14
+ export declare function createSpinner(message: string): Spinner;
@@ -0,0 +1,52 @@
1
+ // Simple terminal spinner without external dependencies
2
+ import { isJsonMode } from './output.js';
3
+ const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
4
+ const FRAME_INTERVAL_MS = 80;
5
+ /**
6
+ * Create a terminal spinner. Returns no-op spinner if in JSON mode or non-TTY.
7
+ */
8
+ export function createSpinner(message) {
9
+ // Skip spinner in JSON mode or non-TTY environments
10
+ if (isJsonMode() || !process.stdout.isTTY) {
11
+ return {
12
+ update: () => { },
13
+ success: (msg) => msg && console.log(msg),
14
+ fail: (msg) => msg && console.error(msg),
15
+ stop: () => { },
16
+ };
17
+ }
18
+ let frameIndex = 0;
19
+ let currentMessage = message;
20
+ let stopped = false;
21
+ const render = () => {
22
+ if (stopped)
23
+ return;
24
+ const frame = SPINNER_FRAMES[frameIndex % SPINNER_FRAMES.length];
25
+ process.stdout.write(`\r\x1b[K${frame} ${currentMessage}`);
26
+ frameIndex++;
27
+ };
28
+ const interval = setInterval(render, FRAME_INTERVAL_MS);
29
+ render();
30
+ const clear = () => {
31
+ stopped = true;
32
+ clearInterval(interval);
33
+ process.stdout.write('\r\x1b[K');
34
+ };
35
+ return {
36
+ update(msg) {
37
+ currentMessage = msg;
38
+ },
39
+ success(msg) {
40
+ clear();
41
+ console.log(`\x1b[32m✓\x1b[0m ${msg ?? currentMessage}`);
42
+ },
43
+ fail(msg) {
44
+ clear();
45
+ console.log(`\x1b[31m✗\x1b[0m ${msg ?? currentMessage}`);
46
+ },
47
+ stop() {
48
+ clear();
49
+ },
50
+ };
51
+ }
52
+ //# sourceMappingURL=spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/lib/spinner.ts"],"names":[],"mappings":"AAAA,wDAAwD;AAExD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAC1E,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAa7B;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,oDAAoD;IACpD,IAAI,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC1C,OAAO;YACL,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC;YAChB,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;YACzC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;YACxC,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;SACf,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,cAAc,GAAG,OAAO,CAAC;IAC7B,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,IAAI,OAAO;YAAE,OAAO;QACpB,MAAM,KAAK,GAAG,cAAc,CAAC,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QACjE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,KAAK,IAAI,cAAc,EAAE,CAAC,CAAC;QAC3D,UAAU,EAAE,CAAC;IACf,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACxD,MAAM,EAAE,CAAC;IAET,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,OAAO,GAAG,IAAI,CAAC;QACf,aAAa,CAAC,QAAQ,CAAC,CAAC;QACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACnC,CAAC,CAAC;IAEF,OAAO;QACL,MAAM,CAAC,GAAW;YAChB,cAAc,GAAG,GAAG,CAAC;QACvB,CAAC;QACD,OAAO,CAAC,GAAY;YAClB,KAAK,EAAE,CAAC;YACR,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,IAAI,cAAc,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,CAAC,GAAY;YACf,KAAK,EAAE,CAAC;YACR,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,IAAI,cAAc,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI;YACF,KAAK,EAAE,CAAC;QACV,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Check npm registry for newer version. Returns update message or null.
3
+ * Never throws - fails silently on network errors.
4
+ */
5
+ export declare function checkForUpdate(): Promise<string | null>;
6
+ /**
7
+ * Print update notice if available. Non-blocking.
8
+ */
9
+ export declare function printUpdateNotice(notice: string | null): void;
@@ -0,0 +1,54 @@
1
+ // Version check utility - checks npm for newer CLI version
2
+ // Runs asynchronously and never blocks or throws
3
+ import { createRequire } from 'node:module';
4
+ const require = createRequire(import.meta.url);
5
+ const { version: currentVersion } = require('../../package.json');
6
+ const NPM_REGISTRY = 'https://registry.npmjs.org/@fold-run/cli/latest';
7
+ const CHECK_TIMEOUT_MS = 2000;
8
+ function compareVersions(current, latest) {
9
+ const c = current.split('.').map(Number);
10
+ const l = latest.split('.').map(Number);
11
+ for (let i = 0; i < 3; i++) {
12
+ if ((l[i] ?? 0) > (c[i] ?? 0))
13
+ return 1;
14
+ if ((l[i] ?? 0) < (c[i] ?? 0))
15
+ return -1;
16
+ }
17
+ return 0;
18
+ }
19
+ /**
20
+ * Check npm registry for newer version. Returns update message or null.
21
+ * Never throws - fails silently on network errors.
22
+ */
23
+ export async function checkForUpdate() {
24
+ try {
25
+ const controller = new AbortController();
26
+ const timeout = setTimeout(() => controller.abort(), CHECK_TIMEOUT_MS);
27
+ const res = await fetch(NPM_REGISTRY, {
28
+ signal: controller.signal,
29
+ headers: { Accept: 'application/json' },
30
+ });
31
+ clearTimeout(timeout);
32
+ if (!res.ok)
33
+ return null;
34
+ const data = (await res.json());
35
+ const latestVersion = data.version;
36
+ if (compareVersions(currentVersion, latestVersion) > 0) {
37
+ return `\x1b[33mUpdate available:\x1b[0m ${currentVersion} → \x1b[32m${latestVersion}\x1b[0m\n Run \x1b[36mnpm i -g @fold-run/cli\x1b[0m to update`;
38
+ }
39
+ return null;
40
+ }
41
+ catch {
42
+ // Network error, timeout, etc - fail silently
43
+ return null;
44
+ }
45
+ }
46
+ /**
47
+ * Print update notice if available. Non-blocking.
48
+ */
49
+ export function printUpdateNotice(notice) {
50
+ if (notice) {
51
+ console.log(`\n${notice}\n`);
52
+ }
53
+ }
54
+ //# sourceMappingURL=version-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-check.js","sourceRoot":"","sources":["../../src/lib/version-check.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,iDAAiD;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAwB,CAAC;AAEzF,MAAM,YAAY,GAAG,iDAAiD,CAAC;AACvE,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAM9B,SAAS,eAAe,CAAC,OAAe,EAAE,MAAc;IACtD,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,gBAAgB,CAAC,CAAC;QAEvE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,YAAY,EAAE;YACpC,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;SACxC,CAAC,CAAC;QACH,YAAY,CAAC,OAAO,CAAC,CAAC;QAEtB,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAEzB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAe,CAAC;QAC9C,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC;QAEnC,IAAI,eAAe,CAAC,cAAc,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;YACvD,OAAO,oCAAoC,cAAc,cAAc,aAAa,gEAAgE,CAAC;QACvJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,8CAA8C;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAqB;IACrD,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,IAAI,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fold-run/cli",
3
- "version": "0.1.2",
3
+ "version": "0.2.0",
4
4
  "description": "CLI for fold.run — deploy serverless functions with TypeScript bundling, secrets, and AI-powered code generation",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -28,15 +28,6 @@
28
28
  "files": [
29
29
  "dist"
30
30
  ],
31
- "scripts": {
32
- "build": "tsc",
33
- "dev": "tsc --watch",
34
- "start": "node dist/index.js",
35
- "test": "vitest run",
36
- "test:watch": "vitest",
37
- "typecheck": "tsc --noEmit",
38
- "prepublishOnly": "tsc"
39
- },
40
31
  "dependencies": {
41
32
  "commander": "^14.0.3",
42
33
  "esbuild": "^0.27.4"
@@ -46,5 +37,13 @@
46
37
  "@vitest/coverage-v8": "^3.2.4",
47
38
  "typescript": "^5.9.3",
48
39
  "vitest": "^3.2.4"
40
+ },
41
+ "scripts": {
42
+ "build": "tsc",
43
+ "dev": "tsc --watch",
44
+ "start": "node dist/index.js",
45
+ "test": "vitest run",
46
+ "test:watch": "vitest",
47
+ "typecheck": "tsc --noEmit"
49
48
  }
50
- }
49
+ }